- add flushing support in demux / decoder
[enigma2.git] / lib / dvb / decoder.cpp
index 28d877df1c0268164c1755d8d4e986485e9c203c..b7118558a3ae7e712f61df7908afbf2f2cefc9da 100644 (file)
@@ -92,6 +92,12 @@ 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");
+}
        
 eDVBAudio::~eDVBAudio()
 {
@@ -171,6 +177,12 @@ void eDVBVideo::stopPid()
 }
 #endif
 
+void eDVBVideo::flush()
+{
+       if (::ioctl(m_fd, VIDEO_CLEAR_BUFFER) < 0)
+               eDebug("video: VIDEO_CLEAR_BUFFER: %m");
+}
+       
 eDVBVideo::~eDVBVideo()
 {
        if (m_fd >= 0)
@@ -342,6 +354,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()
@@ -421,3 +434,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;
+       }
+}