X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/1d9b83e416ec6471e53844c80626dbf22a411e90..fe813cde98c0c550137b47dd7a75ec2d4d9e6f34:/lib/dvb/pmt.cpp diff --git a/lib/dvb/pmt.cpp b/lib/dvb/pmt.cpp index 7b24b434..541a248c 100644 --- a/lib/dvb/pmt.cpp +++ b/lib/dvb/pmt.cpp @@ -1,13 +1,12 @@ -#include + #include #include #include #include +#include eDVBServicePMTHandler::eDVBServicePMTHandler() { - ePtr mgr; - eDVBResourceManager::getInstance(mgr); - m_resourceManager = mgr; + eDVBResourceManager::getInstance(m_resourceManager); CONNECT(m_PMT.tableReady, eDVBServicePMTHandler::PMTready); CONNECT(m_PAT.tableReady, eDVBServicePMTHandler::PATready); } @@ -33,6 +32,9 @@ void eDVBServicePMTHandler::channelStateChanged(iDVBChannel *channel) /* emit */ m_resourceManager->m_channelRunning(channel); m_PAT.begin(eApp, eDVBPATSpec(), m_demux); + + if ( m_service && !m_service->cacheEmpty() ) + serviceEvent(eventNewProgramInfo); } } } @@ -73,11 +75,11 @@ int eDVBServicePMTHandler::getProgramInfo(struct program &program) { eDebug("got PMT"); ePtr > ptr; - + program.videoStreams.clear(); program.audioStreams.clear(); program.pcrPid = -1; - + if (!m_PMT.getCurrent(ptr)) { ProgramMapTableConstIterator i; @@ -115,8 +117,46 @@ int eDVBServicePMTHandler::getProgramInfo(struct program &program) } } return 0; - } else - return -1; + } + else if ( m_service && !m_service->cacheEmpty() ) + { + int vpid = m_service->getCachePID(eDVBService::cVPID), + apid_ac3 = m_service->getCachePID(eDVBService::cAPID), + apid_mpeg = m_service->getCachePID(eDVBService::cAC3PID), + pcrpid = m_service->getCachePID(eDVBService::cPCRPID), + cnt=0; + if ( vpid != -1 ) + { + videoStream s; + s.pid = vpid; + program.videoStreams.push_back(s); + ++cnt; + } + if ( apid_ac3 != -1 ) + { + audioStream s; + s.type = audioStream::atAC3; + s.pid = apid_ac3; + program.audioStreams.push_back(s); + ++cnt; + } + if ( apid_mpeg != -1 ) + { + audioStream s; + s.type = audioStream::atMPEG; + s.pid = apid_mpeg; + program.audioStreams.push_back(s); + ++cnt; + } + if ( pcrpid != -1 ) + { + ++cnt; + program.pcrPid = pcrpid; + } + if ( cnt ) + return 0; + } + return -1; } int eDVBServicePMTHandler::getDemux(ePtr &demux) @@ -143,6 +183,13 @@ int eDVBServicePMTHandler::tune(eServiceReferenceDVB &ref) res = m_resourceManager->allocateChannel(chid, m_channel); } else { + eDVBMetaParser parser; + + if (parser.parseFile(ref.path)) + eWarning("no .meta file found, trying original service ref."); + else + m_reference = parser.m_ref; + eDebug("alloc PVR"); /* allocate PVR */ res = m_resourceManager->allocatePVRChannel(m_pvr_channel); @@ -159,9 +206,13 @@ int eDVBServicePMTHandler::tune(eServiceReferenceDVB &ref) m_last_channel_state = -1; channelStateChanged(m_channel); } - + if (m_pvr_channel) m_pvr_channel->playFile(ref.path.c_str()); - + + ePtr db; + if (!m_resourceManager->getChannelList(db)) + db->getService((eServiceReferenceDVB&)m_reference, m_service); + return res; }