void eDVBServicePMTHandler::channelStateChanged(iDVBChannel *channel) { int state; channel->getState(state); if ((m_last_channel_state != iDVBChannel::state_ok) && (state == iDVBChannel::state_ok)) { if (!m_demux && m_channel) { if (m_pvr_demux_tmp) { m_demux = m_pvr_demux_tmp; m_pvr_demux_tmp = NULL; } else if (m_channel->getDemux(m_demux, (!m_use_decode_demux) ? 0 : iDVBChannel::capDecode)) eDebug("[eDVBServicePMTHandler] Allocating %s-decoding a demux for now tuned-in channel failed.", m_use_decode_demux ? "" : "non-"); } if (m_demux) { eDebug("[eDVBServicePMTHandler] ok ... now we start!!"); m_have_cached_program = false; if (m_service && !m_service->cacheEmpty()) { serviceEvent(eventNewProgramInfo); if (m_use_decode_demux) { if (!m_ca_servicePtr) { registerCAService(); } if (m_ca_servicePtr && !m_service->usePMT()) { eDebug("[eDVBServicePMTHandler] create cached caPMT"); eDVBCAHandler::getInstance()->handlePMT(m_reference, m_service); } } } if (!m_service || m_service->usePMT()) { if (m_pmt_pid == -1) m_PAT.begin(eApp, eDVBPATSpec(), m_demux); else m_PMT.begin(eApp, eDVBPMTSpec(m_pmt_pid, m_reference.getServiceID().get()), m_demux); } serviceEvent(eventTuned); } } else if ((m_last_channel_state != iDVBChannel::state_failed) && (state == iDVBChannel::state_failed)) { eDebug("[eDVBServicePMTHandler] tune failed."); serviceEvent(eventTuneFailed); } }
void eDVBServicePMTHandler::PMTready(int error) { if (error) serviceEvent(eventNoPMT); else { m_have_cached_program = false; serviceEvent(eventNewProgramInfo); switch (m_service_type) { case livetv: case recording: case scrambled_recording: case timeshift_recording: case scrambled_timeshift_recording: case streamserver: case scrambled_streamserver: case streamclient: eEPGCache::getInstance()->PMTready(this); break; default: /* do not start epg caching for other types of services */ break; } if (doDescramble) { if (!m_ca_servicePtr) { registerCAService(); } eDVBCIInterfaces::getInstance()->recheckPMTHandlers(); eDVBCIInterfaces::getInstance()->gotPMT(this); } if (m_ca_servicePtr) { ePtr<eTable<ProgramMapSection> > ptr; if (!m_PMT.getCurrent(ptr)) eDVBCAHandler::getInstance()->handlePMT(m_reference, ptr); else eDebug("eDVBServicePMTHandler cannot call buildCAPMT"); } } }