add return code
[enigma2.git] / lib / dvb / decoder.cpp
index b9cfcded4bec68bdbda4c8b10055b0c5d9a53c95..951a2edf1e5d539d2f9c28ca4c2e0d1e476776d9 100644 (file)
@@ -92,6 +92,24 @@ void eDVBAudio::stopPid()
                eWarning("audio: DMX_STOP: %m");
 }
 #endif
+
+void eDVBAudio::flush()
+{
+       if (::ioctl(m_fd, AUDIO_CLEAR_BUFFER) < 0)
+               eDebug("audio: AUDIO_CLEAR_BUFFER: %m");
+}
+
+void eDVBAudio::freeze()
+{
+       if (::ioctl(m_fd, AUDIO_PAUSE) < 0)
+               eDebug("video: AUDIO_PAUSE: %m");
+}
+       
+void eDVBAudio::unfreeze()
+{
+       if (::ioctl(m_fd, AUDIO_CONTINUE) < 0)
+               eDebug("video: AUDIO_CONTINUE: %m");
+}
        
 eDVBAudio::~eDVBAudio()
 {
@@ -171,6 +189,24 @@ void eDVBVideo::stopPid()
 }
 #endif
 
+void eDVBVideo::flush()
+{
+       if (::ioctl(m_fd, VIDEO_CLEAR_BUFFER) < 0)
+               eDebug("video: VIDEO_CLEAR_BUFFER: %m");
+}
+       
+void eDVBVideo::freeze()
+{
+       if (::ioctl(m_fd, VIDEO_FREEZE) < 0)
+               eDebug("video: VIDEO_FREEZE: %m");
+}
+       
+void eDVBVideo::unfreeze()
+{
+       if (::ioctl(m_fd, VIDEO_CONTINUE) < 0)
+               eDebug("video: VIDEO_CONTINUE: %m");
+}
+       
 eDVBVideo::~eDVBVideo()
 {
        if (m_fd >= 0)
@@ -309,11 +345,14 @@ int eTSMPEGDecoder::setState()
                if (m_video)
                        m_video->stop();
                m_video = 0;
-               m_video = new eDVBVideo(m_demux, 0);
-               if (m_video->startPid(m_vpid))
+               if ((m_vpid >= 0) && (m_vpid < 0x1FFF))
                {
-                       eWarning("video: startpid failed!");
-                       res = -1;
+                       m_video = new eDVBVideo(m_demux, 0);
+                       if (m_video->startPid(m_vpid))
+                       {
+                               eWarning("video: startpid failed!");
+                               res = -1;
+                       }
                }
                m_changed &= ~changeVideo;
        }
@@ -322,11 +361,14 @@ int eTSMPEGDecoder::setState()
                if (m_audio)
                        m_audio->stop();
                m_audio = 0;
-               m_audio = new eDVBAudio(m_demux, 0);
-               if (m_audio->startPid(m_apid))
+               if ((m_apid >= 0) && (m_apid < 0x1FFF))
                {
-                       eWarning("audio: startpid failed!");
-                       res = -1;
+                       m_audio = new eDVBAudio(m_demux, 0);
+                       if (m_audio->startPid(m_apid))
+                       {
+                               eWarning("audio: startpid failed!");
+                               res = -1;
+                       }
                }
                m_changed &= ~changeAudio;
        }
@@ -336,6 +378,7 @@ int eTSMPEGDecoder::setState()
 
 eTSMPEGDecoder::eTSMPEGDecoder(eDVBDemux *demux, int decoder): m_demux(demux), m_changed(0)
 {
+       demux->connectEvent(slot(*this, &eTSMPEGDecoder::demux_event), m_demux_event);
 }
 
 eTSMPEGDecoder::~eTSMPEGDecoder()
@@ -388,12 +431,24 @@ RESULT eTSMPEGDecoder::start()
 
 RESULT eTSMPEGDecoder::freeze(int cont)
 {
-       return -1;
+       if (m_video)
+               m_video->freeze();
+
+       if (m_audio)
+               m_audio->freeze();
+       
+       return 0;
 }
 
 RESULT eTSMPEGDecoder::unfreeze()
 {
-       return -1;
+       if (m_video)
+               m_video->unfreeze();
+
+       if (m_audio)
+               m_audio->unfreeze();
+       
+       return 0;
 }
 
 RESULT eTSMPEGDecoder::setSinglePictureMode(int when)
@@ -415,3 +470,24 @@ RESULT eTSMPEGDecoder::setZoom(int what)
 {
        return -1;
 }
+
+RESULT eTSMPEGDecoder::flush()
+{
+       if (m_audio)
+               m_audio->flush();
+       if (m_video)
+               m_video->flush();
+       return 0;
+}
+
+void eTSMPEGDecoder::demux_event(int event)
+{
+       switch (event)
+       {
+       case eDVBDemux::evtFlush:
+               flush();
+               break;
+       default:
+               break;
+       }
+}