From: Felix Domke Date: Tue, 15 Nov 2005 21:59:48 +0000 (+0000) Subject: add - untested - multituner support X-Git-Tag: 2.6.0~5166 X-Git-Url: https://git.cweiske.de/enigma2.git/commitdiff_plain/6a1fc924eb21f22f9b522df233a9a98d4c5bdca7 add - untested - multituner support --- diff --git a/lib/dvb/demux.cpp b/lib/dvb/demux.cpp index f52bb601..d2a2a545 100644 --- a/lib/dvb/demux.cpp +++ b/lib/dvb/demux.cpp @@ -34,8 +34,35 @@ 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) +{ + int fd = openDemux(); + int res = ::ioctl(fd, DMX_SET_SOURCE, DMX_SOURCE_FRONT0 + fenum); + ::close(fd); + return res; +} + +RESULT eDVBDemux::setSourcePVR(int pvrnum) +{ + int fd = openDemux(); + int res = ::ioctl(fd, DMX_SET_SOURCE, DMX_SOURCE_DVR0 + pvrnum); + ::close(fd); + return res; +} + RESULT eDVBDemux::createSectionReader(eMainloop *context, ePtr &reader) { RESULT res; @@ -61,13 +88,7 @@ RESULT eDVBDemux::getMPEGDecoder(ePtr &decoder) RESULT eDVBDemux::getSTC(pts_t &pts) { - 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; @@ -131,14 +152,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 +359,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; } diff --git a/lib/dvb/demux.h b/lib/dvb/demux.h index 08d9f43d..d3a369f9 100644 --- a/lib/dvb/demux.h +++ b/lib/dvb/demux.h @@ -6,23 +6,17 @@ class eDVBDemux: public iDVBDemux { - int adapter, demux; - - int m_dvr_busy; - friend class eDVBSectionReader; - friend class eDVBAudio; - friend class eDVBVideo; - friend class eDVBPCR; - friend class eDVBTSRecorder; - friend class eDVBCAService; - Signal1 m_event; + DECLARE_REF(eDVBDemux); public: enum { evtFlush }; - DECLARE_REF(eDVBDemux); eDVBDemux(int adapter, int demux); virtual ~eDVBDemux(); + + RESULT setSourceFrontend(int fenum); + RESULT setSourcePVR(int pvrnum); + RESULT createSectionReader(eMainloop *context, ePtr &reader); RESULT createTSRecorder(ePtr &recorder); RESULT getMPEGDecoder(ePtr &reader); @@ -30,6 +24,19 @@ public: RESULT getCADemuxID(uint8_t &id) { id = demux; return 0; } RESULT flush(); RESULT connectEvent(const Slot1 &event, ePtr &conn); +private: + int adapter, demux; + + int m_dvr_busy; + friend class eDVBSectionReader; + friend class eDVBAudio; + friend class eDVBVideo; + friend class eDVBPCR; + friend class eDVBTSRecorder; + friend class eDVBCAService; + Signal1 m_event; + + int openDemux(void); }; class eDVBSectionReader: public iDVBSectionReader, public Object diff --git a/lib/dvb/dvb.cpp b/lib/dvb/dvb.cpp index ed972bf1..0201b337 100644 --- a/lib/dvb/dvb.cpp +++ b/lib/dvb/dvb.cpp @@ -233,6 +233,10 @@ RESULT eDVBResourceManager::allocateDemux(eDVBRegisteredFrontend *fe, ePtrm_inuse) && ((!fe) || (i->m_adapter == fe->m_adapter))) { demux = new eDVBAllocatedDemux(i); + if (fe) + demux->get().setSourceFrontend(fe->m_frontend->getID()); + else + demux->get().setSourcePVR(0); eDebug("demux found"); return 0; }