X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/a33ff213255db7f59090f70235ec06c502e2a2ce..d0899514fa9495013cb73c8ead8c5a5baaf49111:/lib/dvb/pmt.cpp diff --git a/lib/dvb/pmt.cpp b/lib/dvb/pmt.cpp index c1ac5dd8..e62de9b8 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) @@ -128,16 +168,45 @@ int eDVBServicePMTHandler::getDemux(ePtr &demux) return -1; } +int eDVBServicePMTHandler::getPVRChannel(ePtr &pvr_channel) +{ + pvr_channel = m_pvr_channel; + if (pvr_channel) + return 0; + else + return -1; +} + int eDVBServicePMTHandler::tune(eServiceReferenceDVB &ref) { RESULT res; - m_channel = 0; - m_channelStateChanged_connection = 0; m_reference = ref; - eDVBChannelID chid; - ref.getChannelID(chid); - res = m_resourceManager->allocateChannel(chid, m_channel); - eDebug("eDVBServicePMTHandler: tune %d", res); + +// 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); + } 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); + if (res) + eDebug("allocatePVRChannel failed!\n"); + m_channel = m_pvr_channel; + } + if (m_channel) { m_channel->connectStateChange( @@ -146,5 +215,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; }