X-Git-Url: http://code.vuplus.com/gitweb/?p=vuplus_dvbapp;a=blobdiff_plain;f=lib%2Fdvb%2Fdemux.cpp;h=f4d86185b508a03461075f17bd119cd911005e60;hp=6d9254055fa911ee09fe253abf90dd674a06d240;hb=a995c63c0d6c24bbe23935b901bf735c18833adb;hpb=3931e5f4380d167e1d651f0d056618294cf8234f diff --git a/lib/dvb/demux.cpp b/lib/dvb/demux.cpp index 6d92540..f4d8618 100644 --- a/lib/dvb/demux.cpp +++ b/lib/dvb/demux.cpp @@ -85,6 +85,13 @@ int eDVBDemux::openDemux(void) return ::open(filename, O_RDWR); } +int eDVBDemux::openDVR(int flags) +{ + char filename[128]; + snprintf(filename, 128, "/dev/dvb/adapter%d/dvr%d", adapter, demux); + return ::open(filename, flags); +} + DEFINE_REF(eDVBDemux) RESULT eDVBDemux::setSourceFrontend(int fenum) @@ -247,6 +254,14 @@ eDVBSectionReader::~eDVBSectionReader() ::close(fd); } +RESULT eDVBSectionReader::setBufferSize(int size) +{ + int res=::ioctl(fd, DMX_SET_BUFFER_SIZE, size); + if (res < 0) + eDebug("eDVBSectionReader DMX_SET_BUFFER_SIZE failed(%m)"); + return res; +} + RESULT eDVBSectionReader::start(const eDVBSectionFilterMask &mask) { RESULT res; @@ -279,8 +294,7 @@ RESULT eDVBSectionReader::start(const eDVBSectionFilterMask &mask) memcpy(sct.filter.mask, mask.mask, DMX_FILTER_SIZE); #if HAVE_DVB_API_VERSION >= 3 memcpy(sct.filter.mode, mask.mode, DMX_FILTER_SIZE); - if (::ioctl(fd, DMX_SET_BUFFER_SIZE, 8192*8) < 0) - eDebug("DMX_SET_BUFFER_SIZE failed(%m)"); + setBufferSize(8192*8); #endif res = ::ioctl(fd, DMX_SET_FILTER, &sct); @@ -352,7 +366,7 @@ eDVBPESReader::eDVBPESReader(eDVBDemux *demux, eMainloop *context, RESULT &res): if (m_fd >= 0) { - ::ioctl(m_fd, DMX_SET_BUFFER_SIZE, 64*1024); + setBufferSize(64*1024); ::fcntl(m_fd, F_SETFL, O_NONBLOCK); m_notifier = eSocketNotifier::create(context, m_fd, eSocketNotifier::Read, false); CONNECT(m_notifier->activated, eDVBPESReader::data); @@ -364,6 +378,14 @@ eDVBPESReader::eDVBPESReader(eDVBDemux *demux, eMainloop *context, RESULT &res): } } +RESULT eDVBPESReader::setBufferSize(int size) +{ + int res = ::ioctl(m_fd, DMX_SET_BUFFER_SIZE, size); + if (res < 0) + eDebug("eDVBPESReader DMX_SET_BUFFER_SIZE failed(%m)"); + return res; +} + DEFINE_REF(eDVBPESReader) eDVBPESReader::~eDVBPESReader() @@ -484,7 +506,7 @@ eDVBTSRecorder::eDVBTSRecorder(eDVBDemux *demux): m_demux(demux) m_running = 0; m_target_fd = -1; m_thread = new eDVBRecordFileThread(); - CONNECT(m_thread->m_event, eDVBTSRecorder::filepushEvent); + CONNECT(m_thread->m_event, eDVBTSRecorder::filepushEvent); #ifndef HAVE_ADD_PID m_demux->m_dvr_busy = 1; #endif @@ -536,8 +558,8 @@ RESULT eDVBTSRecorder::start() eDebug("FAILED to open demux (%s) in ts recoder (%m)", filename); return -3; } - - ::ioctl(m_source_fd, DMX_SET_BUFFER_SIZE, 1024*1024); + + setBufferSize(1024*1024); dmx_pes_filter_params flt; #if HAVE_DVB_API_VERSION > 3 @@ -577,6 +599,14 @@ RESULT eDVBTSRecorder::start() return 0; } +RESULT eDVBTSRecorder::setBufferSize(int size) +{ + int res = ::ioctl(m_source_fd, DMX_SET_BUFFER_SIZE, size); + if (res < 0) + eDebug("eDVBTSRecorder DMX_SET_BUFFER_SIZE failed(%m)"); + return res; +} + RESULT eDVBTSRecorder::addPID(int pid) { if (m_pids.find(pid) != m_pids.end()) @@ -602,8 +632,6 @@ RESULT eDVBTSRecorder::removePID(int pid) RESULT eDVBTSRecorder::setTimingPID(int pid, int type) { - if (m_running) - return -1; m_thread->setTimingPID(pid, type); return 0; } @@ -627,18 +655,36 @@ RESULT eDVBTSRecorder::setBoundary(off_t max) RESULT eDVBTSRecorder::stop() { + int state=3; + for (std::map::iterator i(m_pids.begin()); i != m_pids.end(); ++i) stopPID(i->first); if (!m_running) return -1; + +#if HAVE_DVB_API_VERSION >= 5 + /* workaround for record thread stop */ + if (::ioctl(m_source_fd, DMX_STOP) < 0) + perror("DMX_STOP"); + else + state &= ~1; + + if (::close(m_source_fd) < 0) + perror("close"); + else + state &= ~2; +#endif + m_thread->stop(); - - close(m_source_fd); + + if (state & 3) + ::close(m_source_fd); + + m_running = 0; m_source_fd = -1; - + m_thread->stopSaveMetaInformation(); - return 0; }