+
+RESULT eDVBTSRecorder::setBoundary(off_t max)
+{
+ return -1; // not yet implemented
+}
+
+RESULT eDVBTSRecorder::stop()
+{
+ for (std::map<int,int>::iterator i(m_pids.begin()); i != m_pids.end(); ++i)
+ stopPID(i->first);
+
+ if (!m_running)
+ return -1;
+ m_thread->stop();
+
+ close(m_source_fd);
+
+ return 0;
+}
+
+RESULT eDVBTSRecorder::connectEvent(const Slot1<void,int> &event, ePtr<eConnection> &conn)
+{
+ conn = new eConnection(this, m_event.connect(event));
+ return 0;
+}
+
+RESULT eDVBTSRecorder::startPID(int pid)
+{
+ char filename[128];
+#if HAVE_DVB_API_VERSION < 3
+ snprintf(filename, 128, "/dev/dvb/card%d/demux%d", m_demux->adapter, m_demux->demux);
+#else
+ snprintf(filename, 128, "/dev/dvb/adapter%d/demux%d", m_demux->adapter, m_demux->demux);
+#endif
+ int fd = ::open(filename, O_RDWR);
+ if (fd < 0)
+ {
+ eDebug("FAILED to open demux (%s) in ts recoder (%m)", filename);
+ return -1;
+ }
+
+#if HAVE_DVB_API_VERSION < 3
+ dmxPesFilterParams flt;
+
+ flt.pesType = DMX_PES_OTHER;
+#else
+ dmx_pes_filter_params flt;
+
+ flt.pes_type = DMX_PES_OTHER;
+#endif
+
+ flt.pid = pid;
+ flt.input = DMX_IN_FRONTEND;
+ flt.output = DMX_OUT_TS_TAP;
+
+ flt.flags = DMX_IMMEDIATE_START;
+
+ int res = ::ioctl(fd, DMX_SET_PES_FILTER, &flt);
+ if (res < 0)
+ {
+ eDebug("set pes filter failed!");
+ ::close(fd);
+ return -1;
+ }
+ m_pids[pid] = fd;
+
+ return 0;
+}
+
+void eDVBTSRecorder::stopPID(int pid)
+{
+ ::close(m_pids[pid]);
+ m_pids[pid] = -1;
+}