add audio track selection
authorFelix Domke <tmbinc@elitedvb.net>
Mon, 14 Nov 2005 21:39:48 +0000 (21:39 +0000)
committerFelix Domke <tmbinc@elitedvb.net>
Mon, 14 Nov 2005 21:39:48 +0000 (21:39 +0000)
lib/service/iservice.h
lib/service/servicedvb.cpp
lib/service/servicedvb.h
lib/service/servicemp3.cpp
lib/service/servicemp3.h

index e21fd99..376ed02 100644 (file)
@@ -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);
index 77fe3fa..39c4407 100644 (file)
@@ -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");
index ac856ed..31eee1f 100644 (file)
@@ -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;
index f7a9fdd..dc038a8 100644 (file)
@@ -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; }
index 558fd81..bf18e92 100644 (file)
@@ -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();