aboutsummaryrefslogtreecommitdiff
path: root/lib/service
diff options
context:
space:
mode:
Diffstat (limited to 'lib/service')
-rw-r--r--lib/service/iservice.h16
-rw-r--r--lib/service/servicedvb.cpp98
-rw-r--r--lib/service/servicedvb.h10
-rw-r--r--lib/service/servicemp3.h3
4 files changed, 110 insertions, 17 deletions
diff --git a/lib/service/iservice.h b/lib/service/iservice.h
index fed66a29..7eeee693 100644
--- a/lib/service/iservice.h
+++ b/lib/service/iservice.h
@@ -389,6 +389,21 @@ public:
TEMPLATE_TYPEDEF(ePtr<iAudioChannelSelection>, iAudioChannelSelectionPtr);
+class iAudioDelay: public iObject
+{
+#ifdef SWIG
+ iAudioDelay();
+ ~iAudioDelay();
+#endif
+public:
+ virtual int getAC3Delay()=0;
+ virtual int getPCMDelay()=0;
+ virtual void setAC3Delay(int)=0;
+ virtual void setPCMDelay(int)=0;
+};
+
+TEMPLATE_TYPEDEF(ePtr<iAudioDelay>, iAudioDelayPtr);
+
class iSubserviceList: public iObject
{
#ifdef SWIG
@@ -493,6 +508,7 @@ public:
virtual SWIG_VOID(RESULT) timeshift(ePtr<iTimeshiftService> &SWIG_OUTPUT)=0;
virtual SWIG_VOID(RESULT) cueSheet(ePtr<iCueSheet> &SWIG_OUTPUT)=0;
virtual SWIG_VOID(RESULT) subtitle(ePtr<iSubtitleOutput> &SWIG_OUTPUT)=0;
+ virtual SWIG_VOID(RESULT) audioDelay(ePtr<iAudioDelay> &SWIG_OUTPUT)=0;
};
TEMPLATE_TYPEDEF(ePtr<iPlayableService>, iPlayableServicePtr);
diff --git a/lib/service/servicedvb.cpp b/lib/service/servicedvb.cpp
index f7da3a3b..8f58cdee 100644
--- a/lib/service/servicedvb.cpp
+++ b/lib/service/servicedvb.cpp
@@ -630,7 +630,7 @@ RESULT eServiceFactoryDVB::lookupService(ePtr<eDVBService> &service, const eServ
}
eDVBServicePlay::eDVBServicePlay(const eServiceReference &ref, eDVBService *service):
- m_reference(ref), m_dvb_service(service), m_is_paused(0), m_current_audio_channel(-1)
+ m_reference(ref), m_dvb_service(service), m_is_paused(0)
{
m_is_primary = 1;
m_is_pvr = !m_reference.path.empty();
@@ -1069,6 +1069,12 @@ RESULT eDVBServicePlay::subtitle(ePtr<iSubtitleOutput> &ptr)
return 0;
}
+RESULT eDVBServicePlay::audioDelay(ePtr<iAudioDelay> &ptr)
+{
+ ptr = this;
+ return 0;
+}
+
RESULT eDVBServicePlay::getName(std::string &name)
{
if (m_is_pvr)
@@ -1279,21 +1285,17 @@ int eDVBServicePlay::selectAudioStream(int i)
int eDVBServicePlay::getCurrentChannel()
{
- return m_current_audio_channel == -1 ? STEREO : m_current_audio_channel;
+ return m_decoder ? m_decoder->getAudioChannel() : STEREO;
}
RESULT eDVBServicePlay::selectChannel(int i)
{
- if (i < iAudioChannelSelection::LEFT || i > iAudioChannelSelection::RIGHT)
+ if (i < LEFT || i > RIGHT)
i = -1; // Stereo
- if (m_current_audio_channel != i)
- {
- if (m_dvb_service)
- m_dvb_service->setCacheEntry(eDVBService::cACHANNEL, i);
- m_current_audio_channel=i;
- if (m_decoder)
- m_decoder->setAudioChannel(i);
- }
+ if (m_dvb_service)
+ m_dvb_service->setCacheEntry(eDVBService::cACHANNEL, i);
+ if (m_decoder)
+ m_decoder->setAudioChannel(i);
return 0;
}
@@ -1604,7 +1606,8 @@ void eDVBServicePlay::switchToTimeshift()
void eDVBServicePlay::updateDecoder()
{
- int vpid = -1, vpidtype = -1, apid = -1, apidtype = -1, pcrpid = -1, tpid = -1, achannel = -1;
+ int vpid = -1, vpidtype = -1, apid = -1, apidtype = -1, pcrpid = -1, tpid = -1, achannel = -1, ac3_delay=-1, pcm_delay=-1;
+
eDVBServicePMTHandler &h = m_timeshift_active ? m_service_handler_timeshift : m_service_handler;
bool defaultac3=false;
@@ -1663,7 +1666,6 @@ void eDVBServicePlay::updateDecoder()
pcrpid = program.pcrPid;
eDebug(", and the text pid is %04x", program.textPid);
tpid = program.textPid;
- achannel = program.audioChannel;
}
if (!m_decoder)
@@ -1681,6 +1683,39 @@ void eDVBServicePlay::updateDecoder()
if (m_decoder)
{
+ if (m_dvb_service)
+ {
+ achannel = m_dvb_service->getCacheEntry(eDVBService::cACHANNEL);
+ ac3_delay = m_dvb_service->getCacheEntry(eDVBService::cAC3DELAY);
+ pcm_delay = m_dvb_service->getCacheEntry(eDVBService::cPCMDELAY);
+ }
+/*
+ else if (m_reference.path.length()) // workaround for recordings
+ {
+ eDebug("playback %s", m_reference.toString().c_str());
+
+ ePtr<eDVBResourceManager> res_mgr;
+ if (!eDVBResourceManager::getInstance(res_mgr))
+ {
+ ePtr<iDVBChannelList> db;
+ if (!res_mgr->getChannelList(db))
+ {
+ ePtr<eDVBService> origService;
+ eServiceReference tmp = m_reference;
+ tmp.path="";
+ if (!db->getService((eServiceReferenceDVB&)tmp, origService))
+ {
+ ac3_delay = origService->getCacheEntry(eDVBService::cAC3DELAY);
+ pcm_delay = origService->getCacheEntry(eDVBService::cPCMDELAY);
+ }
+ }
+ }
+ }
+*/
+
+ m_decoder->setAC3Delay(ac3_delay == -1 ? 0 : ac3_delay);
+ m_decoder->setPCMDelay(pcm_delay == -1 ? 0 : pcm_delay);
+
m_decoder->setVideoPID(vpid, vpidtype);
m_current_audio_stream = 0;
m_decoder->setAudioPID(apid, apidtype);
@@ -1699,7 +1734,6 @@ void eDVBServicePlay::updateDecoder()
m_decoder->start();
- m_current_audio_channel=achannel;
m_decoder->setAudioChannel(achannel);
// how we can do this better?
@@ -1947,6 +1981,42 @@ void eDVBServicePlay::checkSubtitleTiming()
}
}
+int eDVBServicePlay::getAC3Delay()
+{
+ if (m_dvb_service)
+ return m_dvb_service->getCacheEntry(eDVBService::cAC3DELAY);
+ else if (m_decoder)
+ return m_decoder->getAC3Delay();
+ else
+ return 0;
+}
+
+int eDVBServicePlay::getPCMDelay()
+{
+ if (m_dvb_service)
+ return m_dvb_service->getCacheEntry(eDVBService::cPCMDELAY);
+ else if (m_decoder)
+ return m_decoder->getPCMDelay();
+ else
+ return 0;
+}
+
+void eDVBServicePlay::setAC3Delay(int delay)
+{
+ if (m_dvb_service)
+ m_dvb_service->setCacheEntry(eDVBService::cAC3DELAY, delay);
+ if (m_decoder)
+ m_decoder->setAC3Delay(delay);
+}
+
+void eDVBServicePlay::setPCMDelay(int delay)
+{
+ if (m_dvb_service)
+ m_dvb_service->setCacheEntry(eDVBService::cPCMDELAY, delay);
+ if (m_decoder)
+ m_decoder->setPCMDelay(delay);
+}
+
DEFINE_REF(eDVBServicePlay)
eAutoInitPtr<eServiceFactoryDVB> init_eServiceFactoryDVB(eAutoInitNumbers::service+1, "eServiceFactoryDVB");
diff --git a/lib/service/servicedvb.h b/lib/service/servicedvb.h
index 42457598..29cff4d3 100644
--- a/lib/service/servicedvb.h
+++ b/lib/service/servicedvb.h
@@ -73,7 +73,7 @@ class eDVBServicePlay: public eDVBServiceBase,
public iSeekableService, public Object, public iServiceInformation,
public iAudioTrackSelection, public iAudioChannelSelection,
public iSubserviceList, public iTimeshiftService,
- public iCueSheet, public iSubtitleOutput
+ public iCueSheet, public iSubtitleOutput, public iAudioDelay
{
DECLARE_REF(eDVBServicePlay);
public:
@@ -95,6 +95,7 @@ public:
RESULT timeshift(ePtr<iTimeshiftService> &ptr);
RESULT cueSheet(ePtr<iCueSheet> &ptr);
RESULT subtitle(ePtr<iSubtitleOutput> &ptr);
+ RESULT audioDelay(ePtr<iAudioDelay> &ptr);
// iPauseableService
RESULT pause();
@@ -146,6 +147,12 @@ public:
RESULT disableSubtitles(eWidget *parent);
PyObject *getSubtitleList();
+ // iAudioDelay
+ int getAC3Delay();
+ int getPCMDelay();
+ void setAC3Delay(int);
+ void setPCMDelay(int);
+
private:
friend class eServiceFactoryDVB;
eServiceReference m_reference;
@@ -177,7 +184,6 @@ private:
ePtr<iDVBDemux> m_decode_demux;
- int m_current_audio_channel;
int m_current_audio_stream;
int selectAudioStream(int n);
diff --git a/lib/service/servicemp3.h b/lib/service/servicemp3.h
index 36c9da3c..32c9dc75 100644
--- a/lib/service/servicemp3.h
+++ b/lib/service/servicemp3.h
@@ -65,7 +65,8 @@ public:
RESULT timeshift(ePtr<iTimeshiftService> &ptr) { ptr = 0; return -1; }
RESULT cueSheet(ePtr<iCueSheet> &ptr) { ptr = 0; return -1; }
RESULT subtitle(ePtr<iSubtitleOutput> &ptr) { ptr = 0; return -1; }
-
+ RESULT audioDelay(ePtr<iAudioDelay> &ptr) { ptr = 0; return -1; }
+
// iPausableService
RESULT pause();
RESULT unpause();