X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/30e53d8378cc256fcdefa303b9e5772fd3fc4254..f03c85f8c3575d22eb065313857d8d3e57960e95:/lib/dvb/dvb.cpp diff --git a/lib/dvb/dvb.cpp b/lib/dvb/dvb.cpp index f5ca483e..f04dac0b 100644 --- a/lib/dvb/dvb.cpp +++ b/lib/dvb/dvb.cpp @@ -320,10 +320,11 @@ RESULT eDVBResourceManager::allocateFrontendByIndex(ePtr if (!i->m_inuse && i->m_frontend->getSlotID() == slot_index) { // check if another slot linked to this is in use - eDVBRegisteredFrontend *satpos_depends_to_fe = - (eDVBRegisteredFrontend*) i->m_frontend->m_data[eDVBFrontend::SATPOS_DEPENDS_PTR]; - if ( (long)satpos_depends_to_fe != -1 ) + long tmp; + i->m_frontend->getData(eDVBFrontend::SATPOS_DEPENDS_PTR, tmp); + if ( tmp != -1 ) { + eDVBRegisteredFrontend *satpos_depends_to_fe = (eDVBRegisteredFrontend *)tmp; if (satpos_depends_to_fe->m_inuse) { eDebug("another satpos depending frontend is in use.. so allocateFrontendByIndex not possible!"); @@ -333,29 +334,29 @@ RESULT eDVBResourceManager::allocateFrontendByIndex(ePtr } else // check linked tuners { - eDVBRegisteredFrontend *next = - (eDVBRegisteredFrontend *) i->m_frontend->m_data[eDVBFrontend::LINKED_NEXT_PTR]; - while ( (long)next != -1 ) + i->m_frontend->getData(eDVBFrontend::LINKED_NEXT_PTR, tmp); + while ( tmp != -1 ) { + eDVBRegisteredFrontend *next = (eDVBRegisteredFrontend *) tmp; if (next->m_inuse) { eDebug("another linked frontend is in use.. so allocateFrontendByIndex not possible!"); err = errAllSourcesBusy; goto alloc_fe_by_id_not_possible; } - next = (eDVBRegisteredFrontend *)next->m_frontend->m_data[eDVBFrontend::LINKED_NEXT_PTR]; + next->m_frontend->getData(eDVBFrontend::LINKED_NEXT_PTR, tmp); } - eDVBRegisteredFrontend *prev = (eDVBRegisteredFrontend *) - i->m_frontend->m_data[eDVBFrontend::LINKED_PREV_PTR]; - while ( (long)prev != -1 ) + i->m_frontend->getData(eDVBFrontend::LINKED_PREV_PTR, tmp); + while ( tmp != -1 ) { + eDVBRegisteredFrontend *prev = (eDVBRegisteredFrontend *) tmp; if (prev->m_inuse) { eDebug("another linked frontend is in use.. so allocateFrontendByIndex not possible!"); err = errAllSourcesBusy; goto alloc_fe_by_id_not_possible; } - prev = (eDVBRegisteredFrontend *)prev->m_frontend->m_data[eDVBFrontend::LINKED_PREV_PTR]; + prev->m_frontend->getData(eDVBFrontend::LINKED_PREV_PTR, tmp); } } fe = new eDVBAllocatedFrontend(i); @@ -373,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.size() < 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; }