X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/76776f400ac0c56441d5e139ca6c377e6f2d7190..0e5307c51280792394948716d5e3ecef7d87c295:/lib/dvb/pmt.cpp diff --git a/lib/dvb/pmt.cpp b/lib/dvb/pmt.cpp index f948e95c..d7186d5c 100644 --- a/lib/dvb/pmt.cpp +++ b/lib/dvb/pmt.cpp @@ -5,9 +5,10 @@ #include #include -eDVBServicePMTHandler::eDVBServicePMTHandler() +eDVBServicePMTHandler::eDVBServicePMTHandler(int record) :m_pmt_pid(0xFFFF), m_ca_servicePtr(0) { + m_record = record; eDVBResourceManager::getInstance(m_resourceManager); CONNECT(m_PMT.tableReady, eDVBServicePMTHandler::PMTready); CONNECT(m_PAT.tableReady, eDVBServicePMTHandler::PATready); @@ -27,8 +28,8 @@ void eDVBServicePMTHandler::channelStateChanged(iDVBChannel *channel) && (state == iDVBChannel::state_ok) && (!m_demux)) { if (m_channel) - if (m_channel->getDemux(m_demux)) - eDebug("shit it failed.. again."); + if (m_channel->getDemux(m_demux, m_record ? 0 : iDVBChannel::capDecode)) + eDebug("Allocating a demux for now tuned-in channel failed."); serviceEvent(eventTuned); @@ -43,6 +44,11 @@ void eDVBServicePMTHandler::channelStateChanged(iDVBChannel *channel) if ( m_service && !m_service->cacheEmpty() ) serviceEvent(eventNewProgramInfo); } + } else if ((m_last_channel_state != iDVBChannel::state_failed) && + (state == iDVBChannel::state_failed)) + { + eDebug("tune failed."); + serviceEvent(eventTuneFailed); } } @@ -95,6 +101,7 @@ int eDVBServicePMTHandler::getProgramInfo(struct program &program) program.videoStreams.clear(); program.audioStreams.clear(); program.pcrPid = -1; + program.pmtPid = m_pmt_pid < 0x1fff ? m_pmt_pid : -1; if (!m_PMT.getCurrent(ptr)) { @@ -198,14 +205,13 @@ int eDVBServicePMTHandler::tune(eServiceReferenceDVB &ref) RESULT res; m_reference = ref; -// ref.path = "/viva.ts"; // hrhr. - /* is this a normal (non PVR) channel? */ if (ref.path.empty()) { eDVBChannelID chid; ref.getChannelID(chid); res = m_resourceManager->allocateChannel(chid, m_channel); + eDebug("allocate Channel: res %d", res); } else { eDVBMetaParser parser; @@ -230,6 +236,10 @@ int eDVBServicePMTHandler::tune(eServiceReferenceDVB &ref) m_channelStateChanged_connection); m_last_channel_state = -1; channelStateChanged(m_channel); + } else + { + serviceEvent(eventTuneFailed); + return res; } if (m_pvr_channel) @@ -284,8 +294,8 @@ void eDVBCAService::buildCAPMT() tmp[0] = 0x82; // demux tmp[1] = 0x02; - m_parent.m_demux->getCADemuxID(tmp[2]); // descramble on demux - m_parent.m_demux->getCADemuxID(tmp[3]); // get section data from demux1 + m_parent.m_demux->getCADemuxID(tmp[3]); // read section data from demux number + tmp[2] = 1 << tmp[3]; // descramble bitmask capmt.injectDescriptor(tmp, false); tmp[0] = 0x81; // dvbnamespace