X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/8e0ab624cb84003cb37b92e6872dfe08ad9d1f20..899dc0f3d28c8321954f041ebd0c5611aec25857:/lib/dvb/demux.cpp diff --git a/lib/dvb/demux.cpp b/lib/dvb/demux.cpp index f52bb601..78c55bfe 100644 --- a/lib/dvb/demux.cpp +++ b/lib/dvb/demux.cpp @@ -6,7 +6,6 @@ #include #include - #if HAVE_DVB_API_VERSION < 3 #include #ifndef DMX_SET_NEGFILTER_MASK @@ -34,8 +33,46 @@ eDVBDemux::~eDVBDemux() { } +int eDVBDemux::openDemux(void) +{ + char filename[128]; +#if HAVE_DVB_API_VERSION < 3 + snprintf(filename, 128, "/dev/dvb/card%d/demux%d", adapter, demux); +#else + snprintf(filename, 128, "/dev/dvb/adapter%d/demux%d", adapter, demux); +#endif + return ::open(filename, O_RDWR); +} + DEFINE_REF(eDVBDemux) +RESULT eDVBDemux::setSourceFrontend(int fenum) +{ +#if HAVE_DVB_API_VERSION >= 3 + int fd = openDemux(); + + int n = DMX_SOURCE_FRONT0 + fenum; + int res = ::ioctl(fd, DMX_SET_SOURCE, &n); + if (res) + eDebug("DMX_SET_SOURCE failed! - %m"); + ::close(fd); + return res; +#endif + return 0; +} + +RESULT eDVBDemux::setSourcePVR(int pvrnum) +{ +#if HAVE_DVB_API_VERSION >= 3 + int fd = openDemux(); + int n = DMX_SOURCE_DVR0 + pvrnum; + int res = ::ioctl(fd, DMX_SET_SOURCE, &n); + ::close(fd); + return res; +#endif + return 0; +} + RESULT eDVBDemux::createSectionReader(eMainloop *context, ePtr &reader) { RESULT res; @@ -59,21 +96,15 @@ RESULT eDVBDemux::getMPEGDecoder(ePtr &decoder) return 0; } -RESULT eDVBDemux::getSTC(pts_t &pts) +RESULT eDVBDemux::getSTC(pts_t &pts, int num) { - char filename[128]; -#if HAVE_DVB_API_VERSION < 3 - sprintf(filename, "/dev/dvb/card%d/demux%d", adapter, demux); -#else - sprintf(filename, "/dev/dvb/adapter%d/demux%d", adapter, demux); -#endif - int fd = ::open(filename, O_RDWR); + int fd = openDemux(); if (fd < 0) return -ENODEV; struct dmx_stc stc; - stc.num = 0; + stc.num = num; stc.base = 1; if (ioctl(fd, DMX_GET_STC, &stc) < 0) @@ -131,14 +162,7 @@ void eDVBSectionReader::data(int) eDVBSectionReader::eDVBSectionReader(eDVBDemux *demux, eMainloop *context, RESULT &res): demux(demux) { char filename[128]; -#if HAVE_DVB_API_VERSION < 3 - sprintf(filename, "/dev/dvb/card%d/demux%d", demux->adapter, demux->demux); -#else - sprintf(filename, "/dev/dvb/adapter%d/demux%d", demux->adapter, demux->demux); -#endif - fd = ::open(filename, O_RDWR); - - eDebug("eDVBSectionReader has fd %d", fd); + fd = demux->openDemux(); if (fd >= 0) { @@ -345,16 +369,10 @@ RESULT eDVBTSRecorder::connectEvent(const Slot1 &event, ePtradapter, 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); + int fd = m_demux->openDemux(); if (fd < 0) { - eDebug("FAILED to open demux (%s) in ts recoder (%m)", filename); + eDebug("FAILED to open demux in ts recoder (%m)"); return -1; }