diff options
| author | Felix Domke <tmbinc@elitedvb.net> | 2005-11-15 21:59:48 +0000 |
|---|---|---|
| committer | Felix Domke <tmbinc@elitedvb.net> | 2005-11-15 21:59:48 +0000 |
| commit | 6a1fc924eb21f22f9b522df233a9a98d4c5bdca7 (patch) | |
| tree | 134841b1b1c4230232147f8c70e4ae4a5f59f090 /lib | |
| parent | e4f0c4a7ce688f65fa8493a51eff2b1bb2123453 (diff) | |
| download | enigma2-6a1fc924eb21f22f9b522df233a9a98d4c5bdca7.tar.gz enigma2-6a1fc924eb21f22f9b522df233a9a98d4c5bdca7.zip | |
add - untested - multituner support
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/dvb/demux.cpp | 54 | ||||
| -rw-r--r-- | lib/dvb/demux.h | 29 | ||||
| -rw-r--r-- | lib/dvb/dvb.cpp | 4 |
3 files changed, 53 insertions, 34 deletions
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<iDVBSectionReader> &reader) { RESULT res; @@ -61,13 +88,7 @@ RESULT eDVBDemux::getMPEGDecoder(ePtr<iTSMPEGDecoder> &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<void,int> &event, ePtr<eConnecti 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); + 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<void, int> 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<iDVBSectionReader> &reader); RESULT createTSRecorder(ePtr<iDVBTSRecorder> &recorder); RESULT getMPEGDecoder(ePtr<iTSMPEGDecoder> &reader); @@ -30,6 +24,19 @@ public: RESULT getCADemuxID(uint8_t &id) { id = demux; return 0; } RESULT flush(); RESULT connectEvent(const Slot1<void,int> &event, ePtr<eConnection> &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<void, int> 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, ePtr<eDVBA if ((!i->m_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; } |
