}
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();
m_first_program_info = 1;
eServiceReferenceDVB &service = (eServiceReferenceDVB&)m_reference;
r = m_service_handler.tune(service, m_is_pvr, m_cue);
-
+
+ // get back correct service reference (after parsing of recording meta files)
+ m_service_handler.getServiceReference(service);
+
/* inject EIT if there is a stored one */
if (m_is_pvr)
{
return 0;
}
+RESULT eDVBServicePlay::audioDelay(ePtr<iAudioDelay> &ptr)
+{
+ ptr = this;
+ return 0;
+}
+
RESULT eDVBServicePlay::getName(std::string &name)
{
if (m_is_pvr)
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 == STEREO)
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;
}
m_decoder = 0;
m_decode_demux = 0;
m_teletext_parser = 0;
+ m_new_subtitle_page_connection = 0;
/* free the timeshift service handler, we need the resources */
m_service_handler_timeshift.free();
m_decode_demux = 0;
m_decoder = 0;
m_teletext_parser = 0;
+ m_new_subtitle_page_connection = 0;
m_timeshift_active = 1;
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;
pcrpid = program.pcrPid;
eDebug(", and the text pid is %04x", program.textPid);
tpid = program.textPid;
- achannel = program.audioChannel;
}
if (!m_decoder)
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 // subservice or recording
+ {
+ eServiceReferenceDVB parent = ((eServiceReferenceDVB&)m_reference).getParentServiceReference();
+ if (!parent && !m_reference.path.empty()) // is recording
+ {
+ parent = (eServiceReferenceDVB&)m_reference;
+ parent.path="";
+ }
+ if (parent)
+ {
+ ePtr<eDVBResourceManager> res_mgr;
+ if (!eDVBResourceManager::getInstance(res_mgr))
+ {
+ ePtr<iDVBChannelList> db;
+ if (!res_mgr->getChannelList(db))
+ {
+ ePtr<eDVBService> origService;
+ if (!db->getService(parent, 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);
m_decoder->setSyncPCR(pcrpid);
else
m_decoder->setSyncPCR(-1);
-//#ifndef INTERNAL_TELETEXT
+
m_decoder->setTextPID(tpid);
-//#else
+
if (m_teletext_parser)
m_teletext_parser->start(tpid);
-//#endif
+
if (!m_is_primary)
m_decoder->setTrickmode(1);
m_decoder->start();
- m_current_audio_channel=achannel;
+ if (vpid > 0 && vpid < 0x2000)
+ ;
+ else
+ {
+ std::string radio_pic;
+ if (!ePythonConfigQuery::getConfigValue("config.misc.radiopic", radio_pic))
+ m_decoder->setRadioPic(radio_pic);
+ }
+
m_decoder->setAudioChannel(achannel);
// how we can do this better?
}
}
+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 ? delay : -1);
+ if (m_decoder)
+ m_decoder->setAC3Delay(delay);
+}
+
+void eDVBServicePlay::setPCMDelay(int delay)
+{
+ if (m_dvb_service)
+ m_dvb_service->setCacheEntry(eDVBService::cPCMDELAY, delay ? delay : -1);
+ if (m_decoder)
+ m_decoder->setPCMDelay(delay);
+}
+
DEFINE_REF(eDVBServicePlay)
eAutoInitPtr<eServiceFactoryDVB> init_eServiceFactoryDVB(eAutoInitNumbers::service+1, "eServiceFactoryDVB");