- /* 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);
- }
+ flt.pes_type = DMX_PES_OTHER;
+#endif
+
+ flt.pid = pid;
+ flt.input = DMX_IN_FRONTEND;
+ flt.output = DMX_OUT_TAP;
+
+ flt.flags = DMX_IMMEDIATE_START;
+
+ res = ::ioctl(m_fd, DMX_SET_PES_FILTER, &flt);
+
+ if (res)
+ eWarning("PES filter: DMX_SET_PES_FILTER - %m");
+ if (!res)
+ m_active = 1;
+ return res;
+}
+
+RESULT eDVBPESReader::stop()
+{
+ if (!m_active)
+ return -1;
+
+ m_active=0;
+ ::ioctl(m_fd, DMX_STOP);
+ m_notifier->stop();
+
+ return 0;
+}
+
+RESULT eDVBPESReader::connectRead(const Slot2<void,const __u8*,int> &r, ePtr<eConnection> &conn)
+{
+ conn = new eConnection(this, m_read.connect(r));
+ return 0;
+}
+
+class eDVBRecordFileThread: public eFilePushThread
+{
+public:
+ eDVBRecordFileThread();
+ void setTimingPID(int pid);