#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);
}
void eFilePushThread::thread()
{
off_t dest_pos = 0;
+
+ int already_empty = 0;
eDebug("FILEPUSH THREAD START");
// this is a race. FIXME.
}
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
}
#endif
break;
- }
+ } else
+ already_empty = 0;
// printf("FILEPUSH: read %d bytes\n", m_buf_end);
}
m_buf_start = m_buf_end = 0;
}
+void eFilePushThread::enablePVRCommit(int s)
+{
+ m_send_pvr_commit = s;
+}
void eFilePushThread::sendEvent(int evt)
{
/* flushes the internal readbuffer */
void flush();
+ void enablePVRCommit(int);
enum { evtEOF, evtReadError, evtWriteError };
Signal1<void,int> m_event;
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;
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);