diff options
| author | Felix Domke <tmbinc@elitedvb.net> | 2005-11-14 21:39:48 +0000 |
|---|---|---|
| committer | Felix Domke <tmbinc@elitedvb.net> | 2005-11-14 21:39:48 +0000 |
| commit | 3353982034f151f4615cb1842873d99a7a6fa0ca (patch) | |
| tree | 101d5cee09123df815c41bd10cea5e2308b730d8 /lib | |
| parent | 847b6c20d19ba1f97eb096063dad2a910f5afa03 (diff) | |
| download | enigma2-3353982034f151f4615cb1842873d99a7a6fa0ca.tar.gz enigma2-3353982034f151f4615cb1842873d99a7a6fa0ca.zip | |
add audio track selection
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/service/iservice.h | 19 | ||||
| -rw-r--r-- | lib/service/servicedvb.cpp | 65 | ||||
| -rw-r--r-- | lib/service/servicedvb.h | 10 | ||||
| -rw-r--r-- | lib/service/servicemp3.cpp | 2 | ||||
| -rw-r--r-- | lib/service/servicemp3.h | 1 |
5 files changed, 93 insertions, 4 deletions
diff --git a/lib/service/iservice.h b/lib/service/iservice.h index e21fd99f..376ed027 100644 --- a/lib/service/iservice.h +++ b/lib/service/iservice.h @@ -214,6 +214,24 @@ public: TEMPLATE_TYPEDEF(ePtr<iSeekableService>, iSeekableServicePtr); +struct iAudioTrackInfo +{ + std::string m_description; + std::string getDescription() { return m_description; } +}; + +SWIG_ALLOW_OUTPUT_SIMPLE(iAudioTrackInfo); + +class iAudioTrackSelection: public iObject +{ +public: + virtual int getNumberOfTracks()=0; + virtual RESULT selectTrack(unsigned int i)=0; + virtual SWIG_VOID(RESULT) getTrackInfo(struct iAudioTrackInfo &SWIG_OUTPUT, unsigned int n)=0; +}; + +TEMPLATE_TYPEDEF(ePtr<iAudioTrackSelection>, iAudioTrackSelectionPtr); + class iPlayableService: public iObject { friend class iServiceHandler; @@ -233,6 +251,7 @@ public: virtual SWIG_VOID(RESULT) seek(ePtr<iSeekableService> &SWIG_OUTPUT)=0; virtual SWIG_VOID(RESULT) pause(ePtr<iPauseableService> &SWIG_OUTPUT)=0; virtual SWIG_VOID(RESULT) info(ePtr<iServiceInformation> &SWIG_OUTPUT)=0; + virtual SWIG_VOID(RESULT) audioTracks(ePtr<iAudioTrackSelection> &SWIG_OUTPUT)=0; }; TEMPLATE_TYPEDEF(ePtr<iPlayableService>, iPlayableServicePtr); diff --git a/lib/service/servicedvb.cpp b/lib/service/servicedvb.cpp index 77fe3faf..39c4407d 100644 --- a/lib/service/servicedvb.cpp +++ b/lib/service/servicedvb.cpp @@ -478,7 +478,7 @@ void eDVBServicePlay::serviceEvent(int event) } case eDVBServicePMTHandler::eventNewProgramInfo: { - int vpid = -1, apid = -1, pcrpid = -1; + int vpid = -1, apid = -1, apidtype = -1, pcrpid = -1; eDVBServicePMTHandler::program program; if (m_service_handler.getProgramInfo(program)) eDebug("getting program info failed."); @@ -509,7 +509,10 @@ void eDVBServicePlay::serviceEvent(int event) i != program.audioStreams.end(); ++i) { if (apid == -1) + { apid = i->pid; + apidtype = i->type; + } if (i != program.audioStreams.begin()) eDebugNoNewLine(", "); eDebugNoNewLine("%04x", i->pid); @@ -532,7 +535,7 @@ void eDVBServicePlay::serviceEvent(int event) if (m_decoder) { m_decoder->setVideoPID(vpid); - m_decoder->setAudioPID(apid, 0); + m_decoder->setAudioPID(apid, apidtype); if (!m_is_pvr) m_decoder->setSyncPCR(pcrpid); else @@ -649,7 +652,8 @@ RESULT eDVBServicePlay::seekRelative(int direction, pts_t to) if (m_service_handler.getPVRChannel(pvr_channel)) return -1; - return pvr_channel->seekToPosition(SEEK_CUR, to); + /* this is of couse wrong: PTS values don't match with bytes. */ + return pvr_channel->seekToPosition(SEEK_CUR, direction * to); } RESULT eDVBServicePlay::getPlayPosition(pts_t &pos) @@ -668,6 +672,12 @@ RESULT eDVBServicePlay::info(ePtr<iServiceInformation> &ptr) return 0; } +RESULT eDVBServicePlay::audioTracks(ePtr<iAudioTrackSelection> &ptr) +{ + ptr = this; + return 0; +} + RESULT eDVBServicePlay::getName(std::string &name) { if (m_dvb_service) @@ -685,6 +695,55 @@ RESULT eDVBServicePlay::getEvent(ePtr<eServiceEvent> &evt, int nownext) return m_event_handler.getEvent(evt, nownext); } +int eDVBServicePlay::getNumberOfTracks() +{ + eDVBServicePMTHandler::program program; + if (m_service_handler.getProgramInfo(program)) + return 0; + return program.audioStreams.size(); +} + +RESULT eDVBServicePlay::selectTrack(unsigned int i) +{ + eDVBServicePMTHandler::program program; + + if (m_service_handler.getProgramInfo(program)) + return -1; + + if (i >= program.audioStreams.size()) + return -2; + + if (!m_decoder) + return -3; + + if (m_decoder->setAudioPID(program.audioStreams[i].pid, program.audioStreams[i].type)) + return -4; + + return 0; +} + +RESULT eDVBServicePlay::getTrackInfo(struct iAudioTrackInfo &info, unsigned int i) +{ + eDVBServicePMTHandler::program program; + + if (m_service_handler.getProgramInfo(program)) + return -1; + + if (i >= program.audioStreams.size()) + return -2; + + if (program.audioStreams[i].type == eDVBServicePMTHandler::audioStream::atMPEG) + info.m_description = "MPEG"; + else if (program.audioStreams[i].type == eDVBServicePMTHandler::audioStream::atAC3) + info.m_description = "AC3"; + else if (program.audioStreams[i].type == eDVBServicePMTHandler::audioStream::atDTS) + info.m_description = "DTS"; + else + info.m_description = "???"; + + return 0; +} + DEFINE_REF(eDVBServicePlay) eAutoInitPtr<eServiceFactoryDVB> init_eServiceFactoryDVB(eAutoInitNumbers::service+1, "eServiceFactoryDVB"); diff --git a/lib/service/servicedvb.h b/lib/service/servicedvb.h index ac856ed7..31eee1fe 100644 --- a/lib/service/servicedvb.h +++ b/lib/service/servicedvb.h @@ -52,7 +52,9 @@ private: eBouquet *m_bouquet; }; -class eDVBServicePlay: public iPlayableService, public iPauseableService, public iSeekableService, public Object, public iServiceInformation +class eDVBServicePlay: public iPlayableService, public iPauseableService, + public iSeekableService, public Object, public iServiceInformation, + public iAudioTrackSelection { DECLARE_REF(eDVBServicePlay); public: @@ -65,6 +67,7 @@ public: RESULT seek(ePtr<iSeekableService> &ptr); RESULT pause(ePtr<iPauseableService> &ptr); RESULT info(ePtr<iServiceInformation> &ptr); + RESULT audioTracks(ePtr<iAudioTrackSelection> &ptr); // iPauseableService RESULT pause(); @@ -80,6 +83,11 @@ public: RESULT getName(std::string &name); RESULT getEvent(ePtr<eServiceEvent> &evt, int nownext); + // iAudioTrackSelection + int getNumberOfTracks(); + RESULT selectTrack(unsigned int i); + RESULT getTrackInfo(struct iAudioTrackInfo &, unsigned int n); + private: friend class eServiceFactoryDVB; eServiceReference m_reference; diff --git a/lib/service/servicemp3.cpp b/lib/service/servicemp3.cpp index f7a9fddc..dc038a85 100644 --- a/lib/service/servicemp3.cpp +++ b/lib/service/servicemp3.cpp @@ -149,6 +149,8 @@ RESULT eServiceMP3::stop() RESULT eServiceMP3::pause(ePtr<iPauseableService> &ptr) { ptr=this; return 0; } RESULT eServiceMP3::seek(ePtr<iSeekableService> &ptr) { ptr = 0; return -1; } +RESULT eServiceMP3::audioTracks(ePtr<iAudioTrackSelection> &ptr) { ptr = 0; return -1; }; + // iPausableService RESULT eServiceMP3::pause() { printf("mp3 pauses!\n"); return 0; } RESULT eServiceMP3::unpause() { printf("mp3 unpauses!\n"); return 0; } diff --git a/lib/service/servicemp3.h b/lib/service/servicemp3.h index 558fd818..bf18e92b 100644 --- a/lib/service/servicemp3.h +++ b/lib/service/servicemp3.h @@ -57,6 +57,7 @@ public: RESULT stop(); RESULT pause(ePtr<iPauseableService> &ptr); RESULT seek(ePtr<iSeekableService> &ptr); + RESULT audioTracks(ePtr<iAudioTrackSelection> &ptr); // iPausableService RESULT pause(); |
