use read/write lock for eCueSheet
[enigma2.git] / lib / dvb / decoder.cpp
index b49bb2c789258b3ed0ce6195df26ab1f82cbe921..b9c9533af49708a7390f333088cb9fb7c9bd0ae0 100644 (file)
@@ -99,6 +99,8 @@ int eDVBAudio::startPid(int pid, int type)
        if (::ioctl(m_fd, AUDIO_SET_BYPASS_MODE, bypass) < 0)
                eWarning("audio: AUDIO_SET_BYPASS_MODE: %m");
 
+       freeze();
+
        if (::ioctl(m_fd, AUDIO_PLAY) < 0)
                eWarning("audio: AUDIO_PLAY: %m");
        return 0;
@@ -160,6 +162,7 @@ int eDVBAudio::getPTS(pts_t &now)
 
 eDVBAudio::~eDVBAudio()
 {
+       unfreeze();
        if (m_fd >= 0)
                ::close(m_fd);
        if (m_fd_demux >= 0)
@@ -225,6 +228,10 @@ int eDVBVideo::startPid(int pid, int type)
                eWarning("video: DMX_START: %m");
                return -errno;
        }
+
+       eDebug("FREEZE.\n");
+       freeze();
+
        if (::ioctl(m_fd, VIDEO_PLAY) < 0)
                eWarning("video: VIDEO_PLAY: %m");
        return 0;
@@ -257,12 +264,14 @@ void eDVBVideo::flush()
 
 void eDVBVideo::freeze()
 {
+       eDebug("VIDEO_FREEZE");
        if (::ioctl(m_fd, VIDEO_FREEZE) < 0)
                eDebug("video: VIDEO_FREEZE: %m");
 }
 
 void eDVBVideo::unfreeze()
 {
+       eDebug("VIDEO_CONTINUE");
        if (::ioctl(m_fd, VIDEO_CONTINUE) < 0)
                eDebug("video: VIDEO_CONTINUE: %m");
 }
@@ -292,6 +301,7 @@ eDVBVideo::~eDVBVideo()
                setSlowMotion(0);
        if (m_is_fast_forward)
                setFastForward(0);
+       unfreeze();
        if (m_fd >= 0)
                ::close(m_fd);
        if (m_fd_demux >= 0)
@@ -698,6 +708,16 @@ RESULT eTSMPEGDecoder::setSyncMaster(int who)
 }
 
 RESULT eTSMPEGDecoder::start()
+{
+       RESULT r;
+       r = setState();
+       if (r)
+               return r;
+       return unfreeze();
+}
+
+       /* preroll is start in freezed mode. */
+RESULT eTSMPEGDecoder::preroll()
 {
        return setState();
 }
@@ -840,6 +860,8 @@ RESULT eTSMPEGDecoder::showSinglePic(const char *filename)
                                        eDebug("VIDEO_SELECT_SOURCE MEMORY failed (%m)");
                                if (ioctl(vfd, VIDEO_PLAY) < 0)
                                        eDebug("VIDEO_PLAY failed (%m)");
+                               if (::ioctl(vfd, VIDEO_CONTINUE) < 0)
+                                       eDebug("video: VIDEO_CONTINUE: %m");
                                int cnt=0;
                                int pos=0;
                                while(cnt<2)