m_pmt_pid = -1;
m_dsmcc_pid = -1;
m_isstreamclient = false;
+ m_ca_disabled = false;
+ m_pmt_ready = false;
eDVBResourceManager::getInstance(m_resourceManager);
CONNECT(m_PMT.tableReady, eDVBServicePMTHandler::PMTready);
CONNECT(m_PAT.tableReady, eDVBServicePMTHandler::PATready);
serviceEvent(eventNoPMT);
else
{
+ m_pmt_ready = true;
m_have_cached_program = false;
serviceEvent(eventNewProgramInfo);
mDemuxId = m_decode_demux_num;
else
demuxes[1]=demuxes[0];
eDVBCAService::register_service(m_reference, demuxes, m_ca_servicePtr);
- eDVBCIInterfaces::getInstance()->recheckPMTHandlers();
+ if (!m_ca_disabled)
+ eDVBCIInterfaces::getInstance()->recheckPMTHandlers();
}
- eDVBCIInterfaces::getInstance()->gotPMT(this);
+ if (!m_ca_disabled)
+ eDVBCIInterfaces::getInstance()->gotPMT(this);
}
if (m_ca_servicePtr)
{
program.pmtPid = -1;
program.textPid = -1;
program.aitPid = -1;
+ program.isCached = false;
+ program.pmtVersion = -1;
int first_ac3 = -1;
program.defaultAudioStream = 0;
eDVBTableSpec table_spec;
ptr->getSpec(table_spec);
program.pmtPid = table_spec.pid < 0x1fff ? table_spec.pid : -1;
+ program.pmtVersion = table_spec.version;
std::vector<ProgramMapSection*>::const_iterator i;
for (i = ptr->getSections().begin(); i != ptr->getSections().end(); ++i)
{
int cached_pcrpid = m_service->getCacheEntry(eDVBService::cPCRPID),
vpidtype = m_service->getCacheEntry(eDVBService::cVTYPE),
cnt=0;
+
+ program.isCached = true;
+
if ( vpidtype == -1 )
vpidtype = videoStream::vtMPEG2;
if ( cached_vpid != -1 )
if (!m_resourceManager->getChannelList(db))
db->getService((eServiceReferenceDVB&)m_reference, m_service);
- if (!res && !simulate)
+ if (!res && !simulate && !m_ca_disabled)
eDVBCIInterfaces::getInstance()->addPMTHandler(this);
} else if (!simulate) // no simulation of playback services
{
m_demux = 0;
}
+void eDVBServicePMTHandler::addCaHandler()
+{
+ m_ca_disabled = false;
+ if (m_channel)
+ {
+ eDVBCIInterfaces::getInstance()->addPMTHandler(this);
+ if (m_pmt_ready)
+ {
+ eDVBCIInterfaces::getInstance()->recheckPMTHandlers();
+ eDVBCIInterfaces::getInstance()->gotPMT(this);
+ }
+ }
+}
+
+void eDVBServicePMTHandler::removeCaHandler()
+{
+ m_ca_disabled = true;
+ if (m_channel)
+ eDVBCIInterfaces::getInstance()->removePMTHandler(this);
+}
+
+
CAServiceMap eDVBCAService::exist;
ChannelMap eDVBCAService::exist_channels;
ePtr<eConnection> eDVBCAService::m_chanAddedConn;