Support fast channel change.
[vuplus_dvbapp] / lib / service / servicedvbrecord.cpp
index 419c26b..4af0320 100644 (file)
@@ -2,6 +2,7 @@
 #include <lib/base/eerror.h>
 #include <lib/dvb/epgcache.h>
 #include <lib/dvb/metaparser.h>
+#include <lib/base/httpstream.h>
 #include <fcntl.h>
 
        /* for cutlist */
@@ -14,7 +15,8 @@
 
 DEFINE_REF(eDVBServiceRecord);
 
-eDVBServiceRecord::eDVBServiceRecord(const eServiceReferenceDVB &ref): m_ref(ref)
+eDVBServiceRecord::eDVBServiceRecord(const eServiceReferenceDVB &ref, bool isstreamclient):
+       m_ref(ref),m_is_stream_client(isstreamclient)
 {
        CONNECT(m_service_handler.serviceEvent, eDVBServiceRecord::serviceEvent);
        CONNECT(m_event_handler.m_eit_changed, eDVBServiceRecord::gotNewEvent);
@@ -232,9 +234,32 @@ int eDVBServiceRecord::doPrepare()
                /* allocate a ts recorder if we don't already have one. */
        if (m_state == stateIdle)
        {
+               bool isstreamclient = false;
                m_pids_active.clear();
                m_state = statePrepared;
-               return m_service_handler.tune(m_ref, 0, 0, m_simulate);
+               ePtr<iTsSource> source;
+               if (!m_ref.path.empty())
+               {
+                       if (m_is_stream_client)
+                       {
+                               isstreamclient = true;
+                               eHttpStream *f = new eHttpStream();
+                               f->open(m_ref.path.c_str());
+                               source = ePtr<iTsSource>(f);
+                       }
+                       else
+                       {
+                               /* re-record a recording */
+                               eRawFile *f = new eRawFile();
+                               f->open(m_ref.path.c_str());
+                               source = ePtr<iTsSource>(f);
+                       }
+               }
+               else
+               {
+                       m_event((iRecordableService*)this, evTuneStart);
+               }
+               return m_service_handler.tuneExt(m_ref, 0, source, m_ref.path.c_str(), 0, m_simulate, 0, isstreamclient);
        }
        return 0;
 }
@@ -313,7 +338,7 @@ int eDVBServiceRecord::doRecord()
 
                        int timing_pid = -1, timing_pid_type = -1;
 
-                       eDebugNoNewLine("RECORD: have %d video stream(s)", program.videoStreams.size());
+                       eDebugNoNewLine("RECORD: have %zd video stream(s)", program.videoStreams.size());
                        if (!program.videoStreams.empty())
                        {
                                eDebugNoNewLine(" (");
@@ -335,7 +360,7 @@ int eDVBServiceRecord::doRecord()
                                }
                                eDebugNoNewLine(")");
                        }
-                       eDebugNoNewLine(", and %d audio stream(s)", program.audioStreams.size());
+                       eDebugNoNewLine(", and %zd audio stream(s)", program.audioStreams.size());
                        if (!program.audioStreams.empty())
                        {
                                eDebugNoNewLine(" (");