From 34e6431eb2c9fcfe1dd9ecf310970a257609c64a Mon Sep 17 00:00:00 2001 From: Andreas Monzner Date: Wed, 16 Aug 2006 23:43:29 +0000 Subject: [PATCH] add support for radiotext (python gui component missing yet) --- lib/dvb/Makefile.am | 2 +- lib/dvb/pesparse.cpp | 12 +++++++++--- lib/dvb/pesparse.h | 3 ++- lib/service/iservice.h | 15 +++++++++++++++ lib/service/servicedvb.cpp | 47 ++++++++++++++++++++++++++++++++++++++++++++-- lib/service/servicedvb.h | 17 ++++++++++++++--- lib/service/servicemp3.h | 1 + 7 files changed, 87 insertions(+), 10 deletions(-) diff --git a/lib/dvb/Makefile.am b/lib/dvb/Makefile.am index e5b14f3..98f4030 100644 --- a/lib/dvb/Makefile.am +++ b/lib/dvb/Makefile.am @@ -6,5 +6,5 @@ noinst_LIBRARIES = libenigma_dvb.a libenigma_dvb_a_SOURCES = dvb.cpp demux.cpp frontend.cpp esection.cpp db.cpp \ sec.cpp scan.cpp crc32.cpp pmt.cpp decoder.cpp eit.cpp rotor_calc.cpp \ epgcache.cpp dvbtime.cpp metaparser.cpp volume.cpp tstools.cpp pvrparse.cpp \ - pesparse.cpp teletext.cpp + pesparse.cpp teletext.cpp radiotext.cpp diff --git a/lib/dvb/pesparse.cpp b/lib/dvb/pesparse.cpp index 30e0589..da50c04 100644 --- a/lib/dvb/pesparse.cpp +++ b/lib/dvb/pesparse.cpp @@ -12,9 +12,10 @@ ePESParser::ePESParser() setStreamID(0); /* must be overridden */ } -void ePESParser::setStreamID(unsigned char id) +void ePESParser::setStreamID(unsigned char id, unsigned char id_mask) { m_header[3] = id; + m_stream_id_mask = id_mask; } void ePESParser::processData(const __u8 *p, int len) @@ -43,16 +44,21 @@ void ePESParser::processData(const __u8 *p, int len) } else { if (m_pes_position < 4) - if (*p != m_header[m_pes_position]) + { + unsigned char ch = *p; + if (m_pes_position == 3) + ch &= m_stream_id_mask; + if (ch != m_header[m_pes_position]) { // eDebug("sync lost at %d (%02x)", m_pes_position, *p); m_pes_position = 0; - while (m_header[m_pes_position] == *p) /* guaranteed to stop at the old m_pes_position */ + while (m_header[m_pes_position] == ch) /* guaranteed to stop at the old m_pes_position */ m_pes_position++; p++; len--; continue; } + } m_pes_buffer[m_pes_position++] = *p++; len--; if (m_pes_position == 6) { diff --git a/lib/dvb/pesparse.h b/lib/dvb/pesparse.h index 2966b72..51fab2d 100644 --- a/lib/dvb/pesparse.h +++ b/lib/dvb/pesparse.h @@ -7,7 +7,7 @@ class ePESParser { public: ePESParser(); - void setStreamID(unsigned char id); + void setStreamID(unsigned char id, unsigned char id_mask=0xff); void processData(const __u8 *data, int len); virtual void processPESPacket(__u8 *pkt, int len) = 0; virtual ~ePESParser() { } @@ -15,6 +15,7 @@ private: unsigned char m_pes_buffer[65536]; int m_pes_position, m_pes_length; unsigned char m_header[4]; + unsigned char m_stream_id_mask; }; #endif diff --git a/lib/service/iservice.h b/lib/service/iservice.h index 2c395a9..9d673a8 100644 --- a/lib/service/iservice.h +++ b/lib/service/iservice.h @@ -405,6 +405,18 @@ public: TEMPLATE_TYPEDEF(ePtr, iAudioDelayPtr); +class iRadioText: public iObject +{ +#ifdef SWIG + iRadioText(); + ~iRadioText(); +#endif +public: + virtual std::string getRadioText(int x=0)=0; +}; + +TEMPLATE_TYPEDEF(ePtr, iRadioTextPtr); + class iSubserviceList: public iObject { #ifdef SWIG @@ -493,6 +505,8 @@ public: /* only when cueSheet is implemented */ evCuesheetChanged, + + evUpdatedRadioText }; virtual RESULT connectEvent(const Slot2 &event, ePtr &connection)=0; virtual RESULT start()=0; @@ -510,6 +524,7 @@ public: virtual SWIG_VOID(RESULT) cueSheet(ePtr &SWIG_OUTPUT)=0; virtual SWIG_VOID(RESULT) subtitle(ePtr &SWIG_OUTPUT)=0; virtual SWIG_VOID(RESULT) audioDelay(ePtr &SWIG_OUTPUT)=0; + virtual SWIG_VOID(RESULT) radioText(ePtr &SWIG_OUTPUT)=0; }; TEMPLATE_TYPEDEF(ePtr, iPlayableServicePtr); diff --git a/lib/service/servicedvb.cpp b/lib/service/servicedvb.cpp index d789da6..9773996 100644 --- a/lib/service/servicedvb.cpp +++ b/lib/service/servicedvb.cpp @@ -1106,6 +1106,12 @@ RESULT eDVBServicePlay::audioDelay(ePtr &ptr) return 0; } +RESULT eDVBServicePlay::radioText(ePtr &ptr) +{ + ptr = this; + return 0; +} + RESULT eDVBServicePlay::getName(std::string &name) { if (m_is_pvr) @@ -1296,13 +1302,17 @@ int eDVBServicePlay::selectAudioStream(int i) if (m_decoder->setAudioPID(program.audioStreams[i].pid, program.audioStreams[i].type)) return -4; + if (m_radiotext_parser) + m_radiotext_parser->start(program.audioStreams[i].pid); + if (m_dvb_service && !m_is_pvr) { if (program.audioStreams[i].type == eDVBAudio::aMPEG) { m_dvb_service->setCacheEntry(eDVBService::cAPID, program.audioStreams[i].pid); m_dvb_service->setCacheEntry(eDVBService::cAC3PID, -1); - } else + } + else { m_dvb_service->setCacheEntry(eDVBService::cAPID, -1); m_dvb_service->setCacheEntry(eDVBService::cAC3PID, program.audioStreams[i].pid); @@ -1330,6 +1340,22 @@ RESULT eDVBServicePlay::selectChannel(int i) return 0; } +std::string eDVBServicePlay::getRadioText(int x) +{ + if (m_radiotext_parser) + switch(x) + { + case 0: + return m_radiotext_parser->getCurrentText(); + } + return ""; +} + +void eDVBServicePlay::radioTextUpdated() +{ + m_event((iPlayableService*)this, evUpdatedRadioText); +} + int eDVBServiceBase::getFrontendInfo(int w) { eUsePtr channel; @@ -1602,7 +1628,9 @@ void eDVBServicePlay::switchToLive() m_decoder = 0; m_decode_demux = 0; m_teletext_parser = 0; + m_radiotext_parser = 0; m_new_subtitle_page_connection = 0; + m_radiotext_updated_connection = 0; /* free the timeshift service handler, we need the resources */ m_service_handler_timeshift.free(); @@ -1621,8 +1649,10 @@ void eDVBServicePlay::switchToTimeshift() m_decode_demux = 0; m_decoder = 0; m_teletext_parser = 0; + m_radiotext_parser = 0; m_new_subtitle_page_connection = 0; - + m_radiotext_updated_connection = 0; + m_timeshift_active = 1; m_event((iPlayableService*)this, evSeekableStatusChanged); @@ -1710,6 +1740,16 @@ void eDVBServicePlay::updateDecoder() m_teletext_parser = new eDVBTeletextParser(m_decode_demux); m_teletext_parser->connectNewPage(slot(*this, &eDVBServicePlay::newSubtitlePage), m_new_subtitle_page_connection); #endif + if (apid != 1) + { + ePtr data_demux; + if ( (m_timeshift_active && !m_service_handler_timeshift.getDataDemux(data_demux)) + || (!m_timeshift_active && !m_service_handler.getDataDemux(data_demux))) + { + m_radiotext_parser = new eDVBRadioTextParser(data_demux); + m_radiotext_parser->connectUpdatedRadiotext(slot(*this, &eDVBServicePlay::radioTextUpdated), m_radiotext_updated_connection); + } + } } if (m_decoder) @@ -1761,6 +1801,9 @@ void eDVBServicePlay::updateDecoder() if (m_teletext_parser) m_teletext_parser->start(tpid); + if (m_radiotext_parser) + m_radiotext_parser->start(apid); + if (!m_is_primary) m_decoder->setTrickmode(1); diff --git a/lib/service/servicedvb.h b/lib/service/servicedvb.h index 5d3d008..0be174e 100644 --- a/lib/service/servicedvb.h +++ b/lib/service/servicedvb.h @@ -7,6 +7,7 @@ #include #include #include +#include #include class eServiceFactoryDVB: public iServiceHandler @@ -59,7 +60,7 @@ private: class eDVBServiceBase: public iFrontendInformation { protected: - eDVBServicePMTHandler m_service_handler; + eDVBServicePMTHandler m_service_handler ; public: // iFrontendInformation int getFrontendInfo(int w); @@ -73,7 +74,8 @@ class eDVBServicePlay: public eDVBServiceBase, public iSeekableService, public Object, public iServiceInformation, public iAudioTrackSelection, public iAudioChannelSelection, public iSubserviceList, public iTimeshiftService, - public iCueSheet, public iSubtitleOutput, public iAudioDelay + public iCueSheet, public iSubtitleOutput, public iAudioDelay, + public iRadioText { DECLARE_REF(eDVBServicePlay); public: @@ -95,7 +97,8 @@ public: RESULT timeshift(ePtr &ptr); RESULT cueSheet(ePtr &ptr); RESULT subtitle(ePtr &ptr); - RESULT audioDelay(ePtr &ptr); + RESULT audioDelay(ePtr &ptr); + RESULT radioText(ePtr &ptr); // iPauseableService RESULT pause(); @@ -127,6 +130,9 @@ public: int getCurrentChannel(); RESULT selectChannel(int i); + // iRadioText + std::string getRadioText(int i=0); + // iSubserviceList int getNumberOfSubservices(); RESULT getSubservice(eServiceReference &subservice, unsigned int n); @@ -232,11 +238,16 @@ private: ePtr m_new_subtitle_page_connection; ePtr m_teletext_parser; + ePtr m_radiotext_parser; eSubtitleWidget *m_subtitle_widget; eTimer m_subtitle_sync_timer; std::list m_subtitle_pages; void checkSubtitleTiming(); + + /* radiotext */ + ePtr m_radiotext_updated_connection; + void radioTextUpdated(); }; #endif diff --git a/lib/service/servicemp3.h b/lib/service/servicemp3.h index 32c9dc7..4245c81 100644 --- a/lib/service/servicemp3.h +++ b/lib/service/servicemp3.h @@ -66,6 +66,7 @@ public: RESULT cueSheet(ePtr &ptr) { ptr = 0; return -1; } RESULT subtitle(ePtr &ptr) { ptr = 0; return -1; } RESULT audioDelay(ePtr &ptr) { ptr = 0; return -1; } + RESULT radioText(ePtr &ptr) { ptr = 0; return -1; } // iPausableService RESULT pause(); -- 2.7.4