- add flushing support in demux / decoder
authorFelix Domke <tmbinc@elitedvb.net>
Tue, 25 Oct 2005 21:39:15 +0000 (21:39 +0000)
committerFelix Domke <tmbinc@elitedvb.net>
Tue, 25 Oct 2005 21:39:15 +0000 (21:39 +0000)
lib/dvb/decoder.cpp
lib/dvb/decoder.h
lib/dvb/demux.cpp
lib/dvb/demux.h

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;
+       }
+}
index df63955189a7a5afc02c2ed768221a6becdd5797..a26d6cf5d5defa350693034c3abea54737ee8e6b 100644 (file)
@@ -18,6 +18,7 @@ public:
        void start();
        void stopPid();
 #endif
+       void flush();
        virtual ~eDVBAudio();
 };
 
@@ -35,6 +36,7 @@ public:
        void start();
        void stopPid();
 #endif
+       void flush();
        virtual ~eDVBVideo();
 };
 
@@ -51,7 +53,7 @@ public:
        virtual ~eDVBPCR();
 };
 
-class eTSMPEGDecoder: public iTSMPEGDecoder
+class eTSMPEGDecoder: public Object, public iTSMPEGDecoder
 {
 DECLARE_REF(eTSMPEGDecoder);
 private:
@@ -68,6 +70,9 @@ private:
        };
        int m_changed;
        int setState();
+       ePtr<eConnection> m_demux_event;
+       
+       void demux_event(int event);
 public:
        enum { pidNone = -1 };
        eTSMPEGDecoder(eDVBDemux *demux, int decoder);
@@ -83,5 +88,6 @@ public:
        RESULT setPictureSkipMode(int what);
        RESULT setSlowMotion(int repeat);
        RESULT setZoom(int what);
+       RESULT flush();
 };
 #endif
index d5c7cf7399177652430796912aec70a2733bc727..329eafda2a6bee9586d1327ca71bbd6c95d86840 100644 (file)
@@ -88,6 +88,19 @@ RESULT eDVBDemux::getSTC(pts_t &pts)
        return 0;
 }
 
+RESULT eDVBDemux::flush()
+{
+       // FIXME: implement flushing the PVR queue here.
+       
+       m_event(evtFlush);
+       return 0;
+}
+
+RESULT eDVBDemux::connectEvent(const Slot1<void,int> &event, ePtr<eConnection> &conn)
+{
+       conn = new eConnection(this, m_event.connect(event));
+       return 0;
+}
 
 void eDVBSectionReader::data(int)
 {
index a01cf60b63b2caf8fdf25a8e758d60683b02a70d..08d9f43de19d1cfad798a894b20e80f9a8dddb27 100644 (file)
@@ -15,7 +15,11 @@ class eDVBDemux: public iDVBDemux
        friend class eDVBPCR;
        friend class eDVBTSRecorder;
        friend class eDVBCAService;
+       Signal1<void, int> m_event;
 public:
+       enum {
+               evtFlush
+       };
        DECLARE_REF(eDVBDemux);
        eDVBDemux(int adapter, int demux);
        virtual ~eDVBDemux();
@@ -24,6 +28,8 @@ public:
        RESULT getMPEGDecoder(ePtr<iTSMPEGDecoder> &reader);
        RESULT getSTC(pts_t &pts);
        RESULT getCADemuxID(uint8_t &id) { id = demux; return 0; }
+       RESULT flush();
+       RESULT connectEvent(const Slot1<void,int> &event, ePtr<eConnection> &conn);
 };
 
 class eDVBSectionReader: public iDVBSectionReader, public Object