fix timeshift, a bit
[enigma2.git] / lib / service / servicedvb.cpp
index d4a3a562ab649aa7391be26a31580362ec33f40a..4773d09737bfc98ae7fde8d75d4ccfb8241f3a07 100644 (file)
@@ -370,13 +370,17 @@ int eStaticServiceDVBPVRInformation::getLength(const eServiceReference &ref)
        struct stat s;
        stat(ref.path.c_str(), &s);
 
-       if (tstools.openFile(ref.path.c_str()))
+       if (tstools.openFile(ref.path.c_str(), 1))
                return 0;
 
                        /* check if cached data is still valid */
        if (m_parser.m_data_ok && (s.st_size == m_parser.m_filesize) && (m_parser.m_length))
                return m_parser.m_length / 90000;
 
+                       /* open again, this time with stream info */
+       if (tstools.openFile(ref.path.c_str()))
+               return 0;
+
                        /* otherwise, re-calc length and update meta file */
        pts_t len;
        if (tstools.calcLen(len))
@@ -502,6 +506,7 @@ RESULT eDVBPVRServiceOfflineOperations::getListOfFilenames(std::list<std::string
 
        res.push_back(m_ref.path + ".meta");
        res.push_back(m_ref.path + ".ap");
+       res.push_back(m_ref.path + ".sc");
        res.push_back(m_ref.path + ".cuts");
        std::string tmp = m_ref.path;
        tmp.erase(m_ref.path.length()-3);
@@ -1001,7 +1006,10 @@ void eDVBServicePlay::serviceEventTimeshift(int event)
                break;
        case eDVBServicePMTHandler::eventEOF:
                if ((!m_is_paused) && (m_skipmode >= 0))
+               {
+                       eDebug("timeshift EOF, so let's go live");
                        switchToLive();
+               }
                break;
        }
 }
@@ -1124,6 +1132,9 @@ RESULT eDVBServicePlay::pause(ePtr<iPauseableService> &ptr)
 
 RESULT eDVBServicePlay::setSlowMotion(int ratio)
 {
+       assert(ratio); /* The API changed: instead of calling setSlowMotion(0), call play! */
+       eDebug("eDVBServicePlay::setSlowMotion(%d)", ratio);
+       setFastForward_internal(0);
        if (m_decoder)
                return m_decoder->setSlowMotion(ratio);
        else
@@ -1131,6 +1142,13 @@ RESULT eDVBServicePlay::setSlowMotion(int ratio)
 }
 
 RESULT eDVBServicePlay::setFastForward(int ratio)
+{
+       eDebug("eDVBServicePlay::setFastForward(%d)", ratio);
+       assert(ratio);
+       return setFastForward_internal(ratio);
+}
+
+RESULT eDVBServicePlay::setFastForward_internal(int ratio)
 {
        int skipmode, ffratio;
        
@@ -1163,8 +1181,13 @@ RESULT eDVBServicePlay::setFastForward(int ratio)
        
        if (!m_decoder)
                return -1;
-
-       return m_decoder->setFastForward(ffratio);
+               
+       if (ffratio == 0)
+               return m_decoder->play();
+       else if (ffratio != 1)
+               return m_decoder->setFastForward(ffratio);
+       else
+               return m_decoder->setTrickmode();
 }
 
 RESULT eDVBServicePlay::seek(ePtr<iSeekableService> &ptr)
@@ -1192,20 +1215,24 @@ RESULT eDVBServicePlay::getLength(pts_t &len)
 
 RESULT eDVBServicePlay::pause()
 {
-       if (!m_is_paused && m_decoder)
+       eDebug("eDVBServicePlay::pause");
+       setFastForward_internal(0);
+       if (m_decoder)
        {
                m_is_paused = 1;
-               return m_decoder->freeze(0);
+               return m_decoder->pause();
        } else
                return -1;
 }
 
 RESULT eDVBServicePlay::unpause()
 {
-       if (m_is_paused && m_decoder)
+       eDebug("eDVBServicePlay::unpause");
+       setFastForward_internal(0);
+       if (m_decoder)
        {
                m_is_paused = 0;
-               return m_decoder->unfreeze();
+               return m_decoder->play();
        } else
                return -1;
 }
@@ -1287,9 +1314,8 @@ RESULT eDVBServicePlay::getPlayPosition(pts_t &pos)
 
 RESULT eDVBServicePlay::setTrickmode(int trick)
 {
-       if (m_decoder)
-               m_decoder->setTrickmode(trick);
-       return 0;
+               /* currently unimplemented */
+       return -1;
 }
 
 RESULT eDVBServicePlay::isCurrentlySeekable()
@@ -1575,7 +1601,7 @@ RESULT eDVBServicePlay::selectTrack(unsigned int i)
 {
        int ret = selectAudioStream(i);
 
-       if (m_decoder->start())
+       if (m_decoder->play())
                return -5;
 
        return ret;
@@ -2120,6 +2146,8 @@ void eDVBServicePlay::switchToLive()
        if (!m_timeshift_active)
                return;
        
+       eDebug("SwitchToLive");
+       
        m_cue = 0;
        m_decoder = 0;
        m_decode_demux = 0;
@@ -2177,7 +2205,7 @@ void eDVBServicePlay::updateDecoder()
        eDVBServicePMTHandler &h = m_timeshift_active ? m_service_handler_timeshift : m_service_handler;
 
        eDVBServicePMTHandler::program program;
-       if (h.getProgramInfo(program))
+       if (h.getProgramInfo(program) && m_service_handler.getProgramInfo(program))
                eDebug("getting program info failed.");
        else
        {
@@ -2290,13 +2318,12 @@ void eDVBServicePlay::updateDecoder()
 
                m_teletext_parser->start(program.textPid);
 
-               if (!m_is_primary)
-                       m_decoder->setTrickmode(1);
-
-               if (m_is_paused)
-                       m_decoder->preroll();
+/*             if (!m_is_primary)
+                       m_decoder->setTrickmode();
+               else */ if (m_is_paused)
+                       m_decoder->pause();
                else
-                       m_decoder->start();
+                       m_decoder->play();
 
                if (vpid > 0 && vpid < 0x2000)
                        ;
@@ -2318,7 +2345,7 @@ void eDVBServicePlay::updateDecoder()
                        m_dvb_service->setCacheEntry(eDVBService::cPCRPID, pcrpid);
                        m_dvb_service->setCacheEntry(eDVBService::cTPID, tpid);
                }
-       }       
+       }
        m_have_video_pid = (vpid > 0 && vpid < 0x2000);
 }