X-Git-Url: http://code.vuplus.com/gitweb/?p=vuplus_dvbapp;a=blobdiff_plain;f=lib%2Fbase%2Ffilepush.cpp;h=0d599f9663ba746ce826c2bf69b37abce1680b9f;hp=b81aec5c8929133a325173f9f01c0161104ac0bd;hb=6855a6ae6701f8d29540551fcff971316b5d49f1;hpb=624cd1811f54808d23a50840bb35494e4e5ca3b6 diff --git a/lib/base/filepush.cpp b/lib/base/filepush.cpp index b81aec5..0d599f9 100644 --- a/lib/base/filepush.cpp +++ b/lib/base/filepush.cpp @@ -37,7 +37,6 @@ void eFilePushThread::thread() size_t written_since_last_sync = 0; - int already_empty = 0; eDebug("FILEPUSH THREAD START"); /* we set the signal to not restart syscalls, so we can detect our signal. */ @@ -48,7 +47,7 @@ void eFilePushThread::thread() hasStarted(); - source_pos = m_raw_source.lseek(0, SEEK_CUR); + source_pos = m_raw_source->lseek(0, SEEK_CUR); /* m_stop must be evaluated after each syscall. */ while (!m_stop) @@ -142,7 +141,7 @@ void eFilePushThread::thread() ASSERT(!(current_span_remaining % m_blocksize)); if (source_pos != current_span_offset) - source_pos = m_raw_source.lseek(current_span_offset, SEEK_SET); + source_pos = m_raw_source->lseek(current_span_offset, SEEK_SET); bytes_read = 0; } @@ -160,7 +159,7 @@ void eFilePushThread::thread() m_buf_end = 0; if (maxread) - m_buf_end = m_raw_source.read(m_buffer, maxread); + m_buf_end = m_raw_source->read(m_buffer, maxread); if (m_buf_end < 0) { @@ -179,26 +178,30 @@ void eFilePushThread::thread() int d = m_buf_end % m_blocksize; if (d) { - m_raw_source.lseek(-d, SEEK_CUR); + m_raw_source->lseek(-d, SEEK_CUR); m_buf_end -= d; } if (m_buf_end == 0) { /* on EOF, try COMMITting once. */ - if (m_send_pvr_commit && !already_empty) + if (m_send_pvr_commit) { - eDebug("sending PVR commit"); - - struct pollfd pfd[1] = {m_fd_dest, POLLHUP}; - poll(pfd, 1, 10000); - sleep(5); /* HACK to allow ES buffer to drain */ - already_empty = 1; -// if (::ioctl(m_fd_dest, PVR_COMMIT) < 0 && errno == EINTR) -// continue; - eDebug("commit done"); - /* well check again */ - continue; + struct pollfd pfd; + pfd.fd = m_fd_dest; + pfd.events = POLLIN; + switch (poll(&pfd, 1, 250)) // wait for 250ms + { + case 0: + eDebug("wait for driver eof timeout"); + continue; + case 1: + eDebug("wait for driver eof ok"); + break; + default: + eDebug("wait for driver eof aborted by signal"); + continue; + } } /* in stream_mode, we are sending EOF events @@ -215,7 +218,7 @@ void eFilePushThread::thread() } #if 0 eDebug("FILEPUSH: end-of-file! (currently unhandled)"); - if (!m_raw_source.lseek(0, SEEK_SET)) + if (!m_raw_source->lseek(0, SEEK_SET)) { eDebug("(looping)"); continue; @@ -228,7 +231,6 @@ void eFilePushThread::thread() bytes_read += m_buf_end; if (m_sg) current_span_remaining -= m_buf_end; - already_empty = 0; } // printf("FILEPUSH: read %d bytes\n", m_buf_end); } @@ -237,20 +239,30 @@ void eFilePushThread::thread() eDebug("FILEPUSH THREAD STOP"); } -void eFilePushThread::start(int fd_source, int fd_dest) +void eFilePushThread::start(int fd, int fd_dest) { - m_raw_source.setfd(fd_source); + eRawFile *f = new eRawFile(); + f->setfd(fd); + m_raw_source = f; m_fd_dest = fd_dest; resume(); } -int eFilePushThread::start(const char *filename, int fd_dest) +int eFilePushThread::start(const char *file, int fd_dest) { - if (m_raw_source.open(filename) < 0) + eRawFile *f = new eRawFile(); + ePtr source = f; + if (f->open(file) < 0) return -1; + start(source, fd_dest); + return 0; +} + +void eFilePushThread::start(ePtr source, int fd_dest) +{ + m_raw_source = source; m_fd_dest = fd_dest; resume(); - return 0; } void eFilePushThread::stop() @@ -261,10 +273,7 @@ void eFilePushThread::stop() m_stop = 1; - // fixmee.. here we need a better solution to ensure - // that the thread context take notice of the signal - // even when no syscall is in progress - eDebug("if enigma hangs here, the filepush thread is non-responsive. FIX THAT DAMN THREAD."); + eDebug("stopping thread."); /* just do it ONCE. it won't help to do this more than once. */ sendSignal(SIGUSR1); kill(0); } @@ -276,7 +285,7 @@ void eFilePushThread::pause() void eFilePushThread::seek(int whence, off_t where) { - m_raw_source.lseek(where, whence); + m_raw_source->lseek(where, whence); } void eFilePushThread::resume()