From 4a594e382e063bc9f313683d2bd6c679cbad0e9a Mon Sep 17 00:00:00 2001 From: Felix Domke Date: Wed, 18 Jan 2006 15:46:35 +0000 Subject: [PATCH] experimental PVR commit support --- lib/base/filepush.cpp | 24 +++++++++++++++++++++++- lib/base/filepush.h | 2 ++ lib/dvb/dvb.cpp | 1 + 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/lib/base/filepush.cpp b/lib/base/filepush.cpp index 7ab8c0d3..39319a24 100644 --- a/lib/base/filepush.cpp +++ b/lib/base/filepush.cpp @@ -3,11 +3,15 @@ #include #include #include +#include + +#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) { diff --git a/lib/base/filepush.h b/lib/base/filepush.h index 7eb79974..f2bd98be 100644 --- a/lib/base/filepush.h +++ b/lib/base/filepush.h @@ -20,6 +20,7 @@ public: /* flushes the internal readbuffer */ void flush(); + void enablePVRCommit(int); enum { evtEOF, evtReadError, evtWriteError }; Signal1 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 m_messagepump; diff --git a/lib/dvb/dvb.cpp b/lib/dvb/dvb.cpp index 6a0211ec..5c8c2cf6 100644 --- a/lib/dvb/dvb.cpp +++ b/lib/dvb/dvb.cpp @@ -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); -- 2.30.2