experimental PVR commit support
authorFelix Domke <tmbinc@elitedvb.net>
Wed, 18 Jan 2006 15:46:35 +0000 (15:46 +0000)
committerFelix Domke <tmbinc@elitedvb.net>
Wed, 18 Jan 2006 15:46:35 +0000 (15:46 +0000)
lib/base/filepush.cpp
lib/base/filepush.h
lib/dvb/dvb.cpp

index 7ab8c0d375856166b6e904b9bd10b349acb8e597..39319a2477b056003b2729155890d40519ac44e2 100644 (file)
@@ -3,11 +3,15 @@
 #include <lib/base/eerror.h>
 #include <errno.h>
 #include <fcntl.h>
+#include <sys/ioctl.h>
+
+#define PVR_COMMIT 1
 
 eFilePushThread::eFilePushThread(): m_messagepump(eApp, 0)
 {
        m_stop = 0;
        flush();
+       enablePVRCommit(0);
        CONNECT(m_messagepump.recv_msg, eFilePushThread::recvEvent);
 }
 
@@ -18,6 +22,8 @@ static void signal_handler(int x)
 void eFilePushThread::thread()
 {
        off_t dest_pos = 0;
+       
+       int already_empty = 0;
        eDebug("FILEPUSH THREAD START");
                // this is a race. FIXME.
        
@@ -66,6 +72,17 @@ void eFilePushThread::thread()
                }
                if (m_buf_end == 0)
                {
+                               /* on EOF, try COMMITting once. */
+                       if (m_send_pvr_commit && !already_empty)
+                       {
+                               eDebug("sending PVR commit");
+                               already_empty = 1;
+                               if (::ioctl(m_fd_dest, PVR_COMMIT) == EINTR)
+                                       continue;
+                               eDebug("commit done");
+                                               /* well check again */
+                               continue;
+                       }
                        sendEvent(evtEOF);
 
 #if 0
@@ -77,7 +94,8 @@ void eFilePushThread::thread()
                        }
 #endif
                        break;
-               }
+               } else
+                       already_empty = 0;
 //             printf("FILEPUSH: read %d bytes\n", m_buf_end);
        }
        
@@ -119,6 +137,10 @@ void eFilePushThread::flush()
        m_buf_start = m_buf_end = 0;
 }
 
+void eFilePushThread::enablePVRCommit(int s)
+{
+       m_send_pvr_commit = s;
+}
 
 void eFilePushThread::sendEvent(int evt)
 {
index 7eb79974e7ea3594486739e7195b24ca72abbcf2..f2bd98be3be46afc993da9eab3a9de7f792bfeff 100644 (file)
@@ -20,6 +20,7 @@ public:
        
                /* flushes the internal readbuffer */ 
        void flush();
+       void enablePVRCommit(int);
        
        enum { evtEOF, evtReadError, evtWriteError };
        Signal1<void,int> m_event;
@@ -29,6 +30,7 @@ private:
        unsigned char m_buffer[65536];
        int m_buf_start, m_buf_end;
        int m_fd_source, m_fd_dest;
+       int m_send_pvr_commit;
        
        eFixedMessagePump<int> m_messagepump;
        
index 6a0211ec54f3701e38d56b85f2e42a7ac6d123e2..5c8c2cf61d1dd86fe14d3883f3b2016706e9f9b4 100644 (file)
@@ -749,6 +749,7 @@ RESULT eDVBChannel::playFile(const char *file)
        m_stateChanged(this);
        
        m_pvr_thread = new eFilePushThread();
+       m_pvr_thread->enablePVRCommit(1);
        m_pvr_thread->start(m_pvr_fd_src, m_pvr_fd_dst);
        CONNECT(m_pvr_thread->m_event, eDVBChannel::pvrEvent);