add offline operations to services
[enigma2.git] / lib / dvb / pmt.cpp
index 292012e1f93a69080c8d89d7259e94db3343b2a8..e62de9b8a8d16c7b70c8f39e8b137eeacea71324 100644 (file)
@@ -1,13 +1,12 @@
-#include <lib/base/eerror.h>
+ #include <lib/base/eerror.h>
 #include <lib/dvb/pmt.h>
 #include <lib/dvb/specs.h>
 #include <lib/dvb/dvb.h>
+#include <lib/dvb/metaparser.h>
 
 eDVBServicePMTHandler::eDVBServicePMTHandler()
 {
-       ePtr<eDVBResourceManager> mgr;
-       eDVBResourceManager::getInstance(mgr);
-       m_resourceManager = mgr;
+       eDVBResourceManager::getInstance(m_resourceManager);
        CONNECT(m_PMT.tableReady, eDVBServicePMTHandler::PMTready);
        CONNECT(m_PAT.tableReady, eDVBServicePMTHandler::PATready);
 }
@@ -24,10 +23,18 @@ void eDVBServicePMTHandler::channelStateChanged(iDVBChannel *channel)
                        if (m_channel->getDemux(m_demux))
                                eDebug("shit it failed.. again.");
                
+               serviceEvent(eventTuned);
+               
                if (m_demux)
-               {       
+               {
                        eDebug("ok ... now we start!!");
+
+                       /* emit */ m_resourceManager->m_channelRunning(channel);
+
                        m_PAT.begin(eApp, eDVBPATSpec(), m_demux);
+
+                       if ( m_service && !m_service->cacheEmpty() )
+                               serviceEvent(eventNewProgramInfo);
                }
        }
 }
@@ -42,6 +49,7 @@ void eDVBServicePMTHandler::PMTready(int error)
 
 void eDVBServicePMTHandler::PATready(int)
 {
+       eDebug("got PAT");
        ePtr<eTable<ProgramAssociationTable> > ptr;
        if (!m_PAT.getCurrent(ptr))
        {
@@ -65,12 +73,13 @@ void eDVBServicePMTHandler::PATready(int)
 
 int eDVBServicePMTHandler::getProgramInfo(struct program &program)
 {
+       eDebug("got PMT");
        ePtr<eTable<ProgramMapTable> > ptr;
-       
+
        program.videoStreams.clear();
        program.audioStreams.clear();
        program.pcrPid = -1;
-       
+
        if (!m_PMT.getCurrent(ptr))
        {
                ProgramMapTableConstIterator i;
@@ -108,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<iDVBDemux> &demux)
@@ -121,16 +168,45 @@ int eDVBServicePMTHandler::getDemux(ePtr<iDVBDemux> &demux)
                return -1;
 }
 
+int eDVBServicePMTHandler::getPVRChannel(ePtr<iDVBPVRChannel> &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(
@@ -139,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<iDVBChannelList> db;
+       if (!m_resourceManager->getChannelList(db))
+               db->getService((eServiceReferenceDVB&)m_reference, m_service);
+
        return res;
 }