- split out meta parser
[enigma2.git] / lib / dvb / pmt.cpp
index 3f9ac7f7c91e6374e758409bd952448d2be0bbd2..d80897b95e48754245c45d624fc9585e5e314f4c 100644 (file)
@@ -2,6 +2,7 @@
 #include <lib/dvb/pmt.h>
 #include <lib/dvb/specs.h>
 #include <lib/dvb/dvb.h>
+#include <lib/dvb/metaparser.h>
 
 eDVBServicePMTHandler::eDVBServicePMTHandler()
 {
@@ -27,8 +28,11 @@ void eDVBServicePMTHandler::channelStateChanged(iDVBChannel *channel)
                serviceEvent(eventTuned);
                
                if (m_demux)
-               {       
+               {
                        eDebug("ok ... now we start!!");
+
+                       /* emit */ m_resourceManager->m_channelRunning(channel);
+
                        m_PAT.begin(eApp, eDVBPATSpec(), m_demux);
                }
        }
@@ -128,13 +132,33 @@ int eDVBServicePMTHandler::getDemux(ePtr<iDVBDemux> &demux)
 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(
@@ -143,5 +167,9 @@ 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());
+       
        return res;
 }