- factor out the filepusher from ts recorder
authorFelix Domke <tmbinc@elitedvb.net>
Thu, 28 Jul 2005 00:04:32 +0000 (00:04 +0000)
committerFelix Domke <tmbinc@elitedvb.net>
Thu, 28 Jul 2005 00:04:32 +0000 (00:04 +0000)
lib/base/filepush.cpp [new file with mode: 0644]
lib/base/filepush.h [new file with mode: 0644]
lib/dvb/demux.cpp
lib/dvb/demux.h

diff --git a/lib/base/filepush.cpp b/lib/base/filepush.cpp
new file mode 100644 (file)
index 0000000..b85edbc
--- /dev/null
@@ -0,0 +1,75 @@
+#include <lib/base/filepush.h>
+#include <lib/base/eerror.h>
+#include <errno.h>
+
+eFilePushThread::eFilePushThread()
+{
+       m_stop = 0;
+       m_buf_start = m_buf_end = 0;
+}
+
+static void signal_handler(int x)
+{
+}
+
+void eFilePushThread::thread()
+{
+       eDebug("FILEPUSH THREAD START");
+               // this is a race. FIXME.
+       
+               /* we set the signal to not restart syscalls, so we can detect our signal. */
+       struct sigaction act;
+       act.sa_handler = signal_handler; // no, SIG_IGN doesn't do it. we want to receive the -EINTR
+       act.sa_flags = 0;
+       sigaction(SIGUSR1, &act, 0);
+       
+               /* m_stop must be evaluated after each syscall. */
+       while (!m_stop)
+       {
+                       /* first try flushing the bufptr */
+               if (m_buf_start != m_buf_end)
+               {
+                               // TODO: take care of boundaries.
+                       int w = write(m_fd_dest, m_buffer + m_buf_start, m_buf_end - m_buf_start);
+                       if (w <= 0)
+                       {
+                               if (errno == -EINTR)
+                                       continue;
+                               eDebug("eFilePushThread *write error* - not yet handled");
+                               // ... we would stop the thread
+                       }
+                       printf("FILEPUSH: wrote %d bytes\n", w);
+                       m_buf_start += w;
+                       continue;
+               }
+                       
+                       /* now fill our buffer. */
+               m_buf_start = 0;
+               m_buf_end = read(m_fd_source, m_buffer, sizeof(m_buffer));
+               if (m_buf_end < 0)
+               {
+                       m_buf_end = 0;
+                       if (errno == EINTR)
+                               continue;
+                       eDebug("eFilePushThread *read error* - not yet handled");
+               }
+               printf("FILEPUSH: read %d bytes\n", m_buf_end);
+       }
+       
+       eDebug("FILEPUSH THREAD STOP");
+}
+
+void eFilePushThread::start(int fd_source, int fd_dest)
+{
+       m_fd_source = fd_source;
+       m_fd_dest = fd_dest;
+       m_stop = 0;
+       run();
+}
+
+void eFilePushThread::stop()
+{
+       m_stop = 1;
+       sendSignal(SIGUSR1);
+       kill();
+}
diff --git a/lib/base/filepush.h b/lib/base/filepush.h
new file mode 100644 (file)
index 0000000..b8d9f22
--- /dev/null
@@ -0,0 +1,20 @@
+#ifndef __lib_base_filepush_h
+#define __lib_base_filepush_h
+
+#include <lib/base/thread.h>
+
+class eFilePushThread: public eThread
+{
+public:
+       eFilePushThread();
+       void thread();
+       void stop();
+       void start(int sourcefd, int destfd);
+private:
+       int m_stop;
+       unsigned char m_buffer[65536];
+       int m_buf_start, m_buf_end;
+       int m_fd_source, m_fd_dest;
+};
+
+#endif
index f50f4bb29a9a4d02ed8f9202f7f69e0bd57df2d9..c3383a7ebd4b3989597c2cb507a68b0d513745e7 100644 (file)
@@ -6,7 +6,6 @@
 #include <unistd.h>
 #include <signal.h>
 
 #include <unistd.h>
 #include <signal.h>
 
-#include <lib/base/thread.h>
 
 #if HAVE_DVB_API_VERSION < 3
 #include <ost/dmx.h>
 
 #if HAVE_DVB_API_VERSION < 3
 #include <ost/dmx.h>
@@ -20,6 +19,7 @@
 #include "crc32.h"
 
 #include <lib/base/eerror.h>
 #include "crc32.h"
 
 #include <lib/base/eerror.h>
+#include <lib/base/filepush.h>
 #include <lib/dvb/idvb.h>
 #include <lib/dvb/demux.h>
 #include <lib/dvb/esection.h>
 #include <lib/dvb/idvb.h>
 #include <lib/dvb/demux.h>
 #include <lib/dvb/esection.h>
@@ -184,98 +184,12 @@ RESULT eDVBSectionReader::connectRead(const Slot1<void,const __u8*> &r, ePtr<eCo
 
 DEFINE_REF(eDVBTSRecorder);
 
 
 DEFINE_REF(eDVBTSRecorder);
 
-class eDVBTSRecorderThread: public eThread
-{
-public:
-       eDVBTSRecorderThread();
-       void thread();
-       void stop();
-       void start(int sourcefd, int destfd);
-private:
-       int m_stop;
-       unsigned char m_buffer[65536];
-       int m_buf_start, m_buf_end;
-       int m_fd_source, m_fd_dest;
-};
-
-eDVBTSRecorderThread::eDVBTSRecorderThread()
-{
-       m_stop = 0;
-       m_buf_start = m_buf_end = 0;
-}
-
-static void signal_handler(int x)
-{
-}
-
-void eDVBTSRecorderThread::thread()
-{
-       eDebug("RECORDING THREAD START");
-               // this is race. FIXME.
-       
-               /* we set the signal to not restart syscalls, so we can detect our signal. */
-       struct sigaction act;
-       act.sa_handler = signal_handler; // no, SIG_IGN doesn't do it :/
-       act.sa_flags = 0;
-       sigaction(SIGUSR1, &act, 0);
-       
-               /* m_stop must be evaluated after each syscall. */
-       while (!m_stop)
-       {
-                       /* first try flushing the bufptr */
-               if (m_buf_start != m_buf_end)
-               {
-                               // TODO: take care of boundaries.
-                       int w = write(m_fd_dest, m_buffer + m_buf_start, m_buf_end - m_buf_start);
-                       if (w <= 0)
-                       {
-                               if (errno == -EINTR)
-                                       continue;
-                               eDebug("eDVBTSRecorder *write error* - not yet handled");
-                               // ... we would stop the thread
-                       }
-                       printf("TSRECORD: wrote %d bytes\n", w);
-                       m_buf_start += w;
-                       continue;
-               }
-                       
-                       /* now fill our buffer. */
-               m_buf_start = 0;
-               m_buf_end = read(m_fd_source, m_buffer, sizeof(m_buffer));
-               if (m_buf_end < 0)
-               {
-                       m_buf_end = 0;
-                       if (errno == EINTR)
-                               continue;
-                       eDebug("eDVBTSRecorder *read error* - not yet handled");
-               }
-               printf("TSRECORD: read %d bytes\n", m_buf_end);
-       }
-       
-       eDebug("RECORDING THREAD STOP");
-}
-
-void eDVBTSRecorderThread::start(int fd_source, int fd_dest)
-{
-       m_fd_source = fd_source;
-       m_fd_dest = fd_dest;
-       m_stop = 0;
-       run();
-}
-
-void eDVBTSRecorderThread::stop()
-{
-       m_stop = 1;
-       sendSignal(SIGUSR1);
-       kill();
-}
-
 eDVBTSRecorder::eDVBTSRecorder(eDVBDemux *demux): m_demux(demux)
 {
        m_running = 0;
        m_format = 0;
        m_target_fd = -1;
 eDVBTSRecorder::eDVBTSRecorder(eDVBDemux *demux): m_demux(demux)
 {
        m_running = 0;
        m_format = 0;
        m_target_fd = -1;
-       m_thread = new eDVBTSRecorderThread();
+       m_thread = new eFilePushThread();
        m_demux->m_dvr_busy = 1;
 }
 
        m_demux->m_dvr_busy = 1;
 }
 
index b07239be5a6cdff680e0a70ef251c4003be40e68..fdec41771bfb9c396ae5a779eaf455c64d57df50 100644 (file)
@@ -43,7 +43,7 @@ public:
        RESULT connectRead(const Slot1<void,const __u8*> &read, ePtr<eConnection> &conn);
 };
 
        RESULT connectRead(const Slot1<void,const __u8*> &read, ePtr<eConnection> &conn);
 };
 
-class eDVBTSRecorderThread;
+class eFilePushThread;
 
 class eDVBTSRecorder: public iDVBTSRecorder, public Object
 {
 
 class eDVBTSRecorder: public iDVBTSRecorder, public Object
 {
@@ -68,7 +68,7 @@ private:
        RESULT startPID(int pid);
        void stopPID(int pid);
        
        RESULT startPID(int pid);
        void stopPID(int pid);
        
-       eDVBTSRecorderThread *m_thread;
+       eFilePushThread *m_thread;
        
        std::map<int,int> m_pids;
        Signal1<void,int> m_event;
        
        std::map<int,int> m_pids;
        Signal1<void,int> m_event;