aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorAndreas Monzner <andreas.monzner@multimedia-labs.de>2008-07-17 21:11:30 +0000
committerAndreas Monzner <andreas.monzner@multimedia-labs.de>2008-07-17 21:11:30 +0000
commite4e7f6e8cec4e5e5c6646902a598fed377aa8cf2 (patch)
tree6db1007c695fe0bba335abfd6e2b167f50edddc1 /lib
parente035ecc2c81574da1c1dbead323d4fc76ed74a7d (diff)
downloadenigma2-e4e7f6e8cec4e5e5c6646902a598fed377aa8cf2.tar.gz
enigma2-e4e7f6e8cec4e5e5c6646902a598fed377aa8cf2.zip
add own demux policy for dm8000 which now have 5 demux devices one for each
tuner and one for playback
Diffstat (limited to 'lib')
-rw-r--r--lib/dvb/demux.cpp4
-rw-r--r--lib/dvb/demux.h3
-rw-r--r--lib/dvb/dvb.cpp86
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<iDVBSectionReader> &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<eDVBA
eDebug("allocate demux");
eSmartPtrList<eDVBRegisteredDemux>::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<eDVBRegisteredDemux> 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;
}