aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorghost <andreas.monzner@multimedia-labs.de>2009-06-04 22:23:42 +0200
committerghost <andreas.monzner@multimedia-labs.de>2009-06-04 22:23:42 +0200
commitb7f07b6052ac2ca6b5e2a2c9e322b26e2c506109 (patch)
treebbc10d38e84e725d9406df41793f765025c1ea05 /lib
parentd18113ea974703c0c6fc0396e83dbf59bc9e5b26 (diff)
downloadenigma2-b7f07b6052ac2ca6b5e2a2c9e322b26e2c506109.tar.gz
enigma2-b7f07b6052ac2ca6b5e2a2c9e322b26e2c506109.zip
dvb.cpp: detect boxtype via /proc/stb/info/model for demux policy
Diffstat (limited to 'lib')
-rw-r--r--lib/dvb/dvb.cpp34
-rw-r--r--lib/dvb/dvb.h4
2 files changed, 33 insertions, 5 deletions
diff --git a/lib/dvb/dvb.cpp b/lib/dvb/dvb.cpp
index d30be29c..e6d9a25d 100644
--- a/lib/dvb/dvb.cpp
+++ b/lib/dvb/dvb.cpp
@@ -82,8 +82,32 @@ eDVBResourceManager::eDVBResourceManager()
num_adapter++;
}
- eDebug("found %d adapter, %d frontends(%d sim) and %d demux",
- m_adapter.size(), m_frontend.size(), m_simulate_frontend.size(), m_demux.size());
+ int fd = open("/proc/stb/info/model", O_RDONLY);
+ char tmp[255];
+ int rd = fd >= 0 ? read(fd, tmp, 255) : 0;
+ if (fd >= 0)
+ close(fd);
+
+ if (!strncmp(tmp, "dm7025\n", rd))
+ m_boxtype = DM7025;
+ else if (!strncmp(tmp, "dm8000\n", rd))
+ m_boxtype = DM8000;
+ else if (!strncmp(tmp, "dm800\n", rd))
+ m_boxtype = DM800;
+ else if (!strncmp(tmp, "dm500hd\n", rd))
+ m_boxtype = DM500HD;
+ else {
+ eDebug("boxtype detection via /proc/stb/info not possible... use fallback via demux count!\n");
+ if (m_demux.size() == 3)
+ m_boxtype = DM800;
+ else if (m_demux.size() < 5)
+ m_boxtype = DM7025;
+ else
+ m_boxtype = DM8000;
+ }
+
+ eDebug("found %d adapter, %d frontends(%d sim) and %d demux, boxtype %d",
+ m_adapter.size(), m_frontend.size(), m_simulate_frontend.size(), m_demux.size(), m_boxtype);
eDVBCAService::registerChannelCallback(this);
@@ -429,7 +453,7 @@ RESULT eDVBResourceManager::allocateDemux(eDVBRegisteredFrontend *fe, ePtr<eDVBA
ePtr<eDVBRegisteredDemux> unused;
- if (m_demux.size() == 3) // dm800 / 500hd
+ if (m_boxtype == DM800 || m_boxtype == DM500HD) // dm800 / 500hd
{
for (; i != m_demux.end(); ++i, ++n)
{
@@ -457,7 +481,7 @@ RESULT eDVBResourceManager::allocateDemux(eDVBRegisteredFrontend *fe, ePtr<eDVBA
}
}
}
- else if (m_demux.size() < 5) // ATI
+ else if (m_boxtype == DM7025) // ATI
{
/* FIXME: hardware demux policy */
if (!(cap & iDVBChannel::capDecode))
@@ -484,7 +508,7 @@ RESULT eDVBResourceManager::allocateDemux(eDVBRegisteredFrontend *fe, ePtr<eDVBA
}
}
}
- else // we asume dm8000
+ else if (m_boxtype == DM8000)
{
for (; i != m_demux.end(); ++i, ++n)
{
diff --git a/lib/dvb/dvb.h b/lib/dvb/dvb.h
index 5399f45e..413462d6 100644
--- a/lib/dvb/dvb.h
+++ b/lib/dvb/dvb.h
@@ -135,6 +135,10 @@ class eDVBResourceManager: public iObject, public Object
DECLARE_REF(eDVBResourceManager);
int avail, busy;
+ enum { DM7025, DM800, DM500HD, DM8000 };
+
+ int m_boxtype;
+
eSmartPtrList<iDVBAdapter> m_adapter;
eSmartPtrList<eDVBRegisteredDemux> m_demux;
eSmartPtrList<eDVBRegisteredFrontend> m_frontend, m_simulate_frontend;