aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorFelix Domke <tmbinc@elitedvb.net>2005-11-14 21:39:48 +0000
committerFelix Domke <tmbinc@elitedvb.net>2005-11-14 21:39:48 +0000
commit3353982034f151f4615cb1842873d99a7a6fa0ca (patch)
tree101d5cee09123df815c41bd10cea5e2308b730d8 /lib
parent847b6c20d19ba1f97eb096063dad2a910f5afa03 (diff)
downloadenigma2-3353982034f151f4615cb1842873d99a7a6fa0ca.tar.gz
enigma2-3353982034f151f4615cb1842873d99a7a6fa0ca.zip
add audio track selection
Diffstat (limited to 'lib')
-rw-r--r--lib/service/iservice.h19
-rw-r--r--lib/service/servicedvb.cpp65
-rw-r--r--lib/service/servicedvb.h10
-rw-r--r--lib/service/servicemp3.cpp2
-rw-r--r--lib/service/servicemp3.h1
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();