From e4e7f6e8cec4e5e5c6646902a598fed377aa8cf2 Mon Sep 17 00:00:00 2001 From: Andreas Monzner Date: Thu, 17 Jul 2008 21:11:30 +0000 Subject: [PATCH 1/1] add own demux policy for dm8000 which now have 5 demux devices one for each tuner and one for playback --- lib/dvb/demux.cpp | 4 ++- lib/dvb/demux.h | 3 +- lib/dvb/dvb.cpp | 86 ++++++++++++++++++++++++++++++++++------------- 3 files changed, 68 insertions(+), 25 deletions(-) diff --git a/lib/dvb/demux.cpp b/lib/dvb/demux.cpp index 6a7e50db..29bbf264 100644 --- a/lib/dvb/demux.cpp +++ b/lib/dvb/demux.cpp @@ -76,11 +76,12 @@ 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"); + else + source = fenum; ::close(fd); return res; #endif @@ -93,6 +94,7 @@ RESULT eDVBDemux::setSourcePVR(int pvrnum) int fd = openDemux(); int n = DMX_SOURCE_DVR0 + pvrnum; int res = ::ioctl(fd, DMX_SET_SOURCE, &n); + source = -1; ::close(fd); return res; #endif diff --git a/lib/dvb/demux.h b/lib/dvb/demux.h index 3541974e..1c0da47c 100644 --- a/lib/dvb/demux.h +++ b/lib/dvb/demux.h @@ -15,6 +15,7 @@ public: virtual ~eDVBDemux(); RESULT setSourceFrontend(int fenum); + int getSource() { return source; } RESULT setSourcePVR(int pvrnum); RESULT createSectionReader(eMainloop *context, ePtr &reader); @@ -28,7 +29,7 @@ public: int getRefCount() { return ref; } private: - int adapter, demux; + int adapter, demux, source; int m_dvr_busy; friend class eDVBSectionReader; diff --git a/lib/dvb/dvb.cpp b/lib/dvb/dvb.cpp index 23a9d5a9..11902507 100644 --- a/lib/dvb/dvb.cpp +++ b/lib/dvb/dvb.cpp @@ -374,40 +374,80 @@ RESULT eDVBResourceManager::allocateDemux(eDVBRegisteredFrontend *fe, ePtr::iterator i(m_demux.begin()); - + + int n=0; + if (i == m_demux.end()) return -1; - - int n=0; - /* FIXME: hardware demux policy */ - if (!(cap & iDVBChannel::capDecode)) + + ePtr unused; + + if (m_demux.length() < 5) { - if (m_demux.size() > 2) /* assumed to be true, otherwise we have lost anyway */ + /* FIXME: hardware demux policy */ + if (!(cap & iDVBChannel::capDecode)) { - ++i, ++n; - ++i, ++n; + if (m_demux.size() > 2) /* assumed to be true, otherwise we have lost anyway */ + { + ++i, ++n; + ++i, ++n; + } } - } - - for (; i != m_demux.end(); ++i, ++n) - { - int is_decode = n < 2; + + for (; i != m_demux.end(); ++i, ++n) + { + int is_decode = n < 2; - int in_use = is_decode ? (i->m_demux->getRefCount() != 2) : i->m_inuse; + int in_use = is_decode ? (i->m_demux->getRefCount() != 2) : i->m_inuse; - if ((!in_use) && ((!fe) || (i->m_adapter == fe->m_adapter))) + if ((!in_use) && ((!fe) || (i->m_adapter == fe->m_adapter))) + { + if ((cap & iDVBChannel::capDecode) && !is_decode) + continue; + unused = i; + break; + } + } + } + else // we asume dm8000 + { + for (; i != m_demux.end(); ++i, ++n) { - if ((cap & iDVBChannel::capDecode) && !is_decode) - continue; - - demux = new eDVBAllocatedDemux(i); if (fe) - demux->get().setSourceFrontend(fe->m_frontend->getDVBID()); - else - demux->get().setSourcePVR(0); - return 0; + { + if (!i->m_inuse) + { + if (!unused) + unused = i; + } + else if (i->m_adapter == fe->m_adapter && + i->m_demux->getSource() == fe->m_frontend->getDVBID()) + { + demux = new eDVBAllocatedDemux(i); + return 0; + } + } + else if (n == 4) // always use demux4 for PVR (demux 4 can not descramble...) + { + if (i->m_inuse) { + demux = new eDVBAllocatedDemux(i); + return 0; + } + unused = i; + } } } + + if (unused) + { + demux = new eDVBAllocatedDemux(unused); + if (fe) + demux->get().setSourceFrontend(fe->m_frontend->getDVBID()); + else + demux->get().setSourcePVR(0); + return 0; + } + eDebug("demux not found"); return -1; } -- 2.30.2