X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/a4c3836577b7fab796563c6657257cf7e4a9ee73..cab018779de4f2f01e0fe651e71112754ebd0ef8:/lib/dvb/dvb.cpp diff --git a/lib/dvb/dvb.cpp b/lib/dvb/dvb.cpp index 6f72cb17..f04dac0b 100644 --- a/lib/dvb/dvb.cpp +++ b/lib/dvb/dvb.cpp @@ -242,8 +242,8 @@ void eDVBResourceManager::addAdapter(iDVBAdapter *adapter) { if (prev_dvbt_frontend) { - prev_dvbt_frontend->m_frontend->setData(eDVBFrontend::LINKED_NEXT_PTR, (int)new_fe); - frontend->setData(eDVBFrontend::LINKED_PREV_PTR, (int)&(*prev_dvbt_frontend)); + prev_dvbt_frontend->m_frontend->setData(eDVBFrontend::LINKED_NEXT_PTR, (long)new_fe); + frontend->setData(eDVBFrontend::LINKED_PREV_PTR, (long)&(*prev_dvbt_frontend)); } prev_dvbt_frontend = new_fe; } @@ -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 ( (int)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 ( (int)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 ( (int)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; } @@ -748,6 +789,15 @@ error: return ret; } +bool eDVBResourceManager::canMeasureFrontendInputPower() +{ + for (eSmartPtrList::iterator i(m_frontend.begin()); i != m_frontend.end(); ++i) + { + return i->m_frontend->readInputpower() >= 0; + } + return false; +} + class eDVBChannelFilePush: public eFilePushThread { public: @@ -1014,6 +1064,9 @@ void eDVBChannel::pvrEvent(int event) void eDVBChannel::cueSheetEvent(int event) { + /* we might end up here if playing failed or stopped, but the client hasn't (yet) noted. */ + if (!m_pvr_thread) + return; switch (event) { case eCueSheet::evtSeek: @@ -1051,7 +1104,6 @@ void eDVBChannel::cueSheetEvent(int event) m_skipmode_n = m_skipmode_m = 0; } } - ASSERT(m_pvr_thread); m_pvr_thread->setIFrameSearch(m_skipmode_n != 0); if (m_cue->m_skipmode_ratio != 0) m_pvr_thread->setTimebaseChange(0x10000 * 9000 / (m_cue->m_skipmode_ratio / 10)); /* negative values are also ok */