X-Git-Url: http://code.vuplus.com/gitweb/?a=blobdiff_plain;f=lib%2Fdvb%2Fdvb.cpp;h=72d4687ae06bc4356caeaab2df857a40e8ed7fce;hb=27e06ba9c8b055c20ea8c70a405deb0e4019edc5;hp=62b01d233c9f3fb42068a1642bddc9839f4aa90a;hpb=a48c08bd5cff6e23bc94ccf0b183a20d4dc0252b;p=vuplus_dvbapp diff --git a/lib/dvb/dvb.cpp b/lib/dvb/dvb.cpp index 62b01d2..72d4687 100755 --- a/lib/dvb/dvb.cpp +++ b/lib/dvb/dvb.cpp @@ -6,6 +6,9 @@ #include #include +#include +#include + #include #include #include @@ -26,6 +29,14 @@ eDVBAllocatedFrontend::eDVBAllocatedFrontend(eDVBRegisteredFrontend *fe): m_fe(f eDVBAllocatedFrontend::~eDVBAllocatedFrontend() { m_fe->dec_use(); + if (m_fe->m_frontend->is_FBCTuner()) + { + eFBCTunerManager* fbcmng = eFBCTunerManager::getInstance(); + if (fbcmng) + { + fbcmng->unset(m_fe); + } + } } DEFINE_REF(eDVBAllocatedDemux); @@ -422,13 +433,31 @@ void eDVBResourceManager::setFrontendType(int index, const char *type) RESULT eDVBResourceManager::allocateFrontend(ePtr &fe, ePtr &feparm, bool simulate) { eSmartPtrList &frontends = simulate ? m_simulate_frontend : m_frontend; - ePtr best; +// ePtr best; + eDVBRegisteredFrontend *best = NULL; int bestval = 0; int foundone = 0; + int check_fbc_linked = 0; + eDVBRegisteredFrontend *fbc_fe = NULL; + eDVBRegisteredFrontend *best_fbc_fe = NULL; + eFBCTunerManager* fbcmng = eFBCTunerManager::getInstance(); + for (eSmartPtrList::iterator i(frontends.begin()); i != frontends.end(); ++i) { - int c = i->m_frontend->isCompatibleWith(feparm); + int c = 0; + fbc_fe = NULL; + if (!check_fbc_linked && i->m_frontend->is_FBCTuner() && fbcmng && fbcmng->canLink(*i)) + { + check_fbc_linked = 1; + c = fbcmng->isCompatibleWith(feparm, *i, fbc_fe, simulate); + +// eDebug("[eDVBResourceManager::allocateFrontend] fbcmng->isCompatibleWith slotid : %p (%d), fbc_fe : %p (%d), score : %d", (eDVBRegisteredFrontend *)*i, i->m_frontend->getSlotID(), fbc_fe, fbc_fe?fbc_fe->m_frontend->getSlotID():-1, c); + } + else + { + c = i->m_frontend->isCompatibleWith(feparm); + } if (c) /* if we have at least one frontend which is compatible with the source, flag this. */ foundone = 1; @@ -439,15 +468,26 @@ RESULT eDVBResourceManager::allocateFrontend(ePtr &fe, eP if (c > bestval) { bestval = c; - best = i; +// best = i; + best = *i; + best_fbc_fe = fbc_fe; } } -// else + else + { // eDebug("Slot %d, score %d... but BUSY!!!!!!!!!!!", i->m_frontend->getSlotID(), c); + } + + eDVBRegisteredFrontend *tmp = *i; } if (best) { + if (fbcmng && best_fbc_fe) + { + fbcmng->addLink(best, best_fbc_fe, simulate); + } + fe = new eDVBAllocatedFrontend(best); return 0; } @@ -667,12 +707,6 @@ RESULT eDVBResourceManager::getChannelList(ePtr &list) if (!simulate) \ eDebug(x); \ } while(0) -// else \ -// { \ -// eDebugNoNewLine("SIMULATE:"); \ -// eDebug(x); \ -// } \ - RESULT eDVBResourceManager::allocateChannel(const eDVBChannelID &channelid, eUsePtr &channel, bool simulate) { @@ -877,14 +911,27 @@ int eDVBResourceManager::canAllocateFrontend(ePtr &fepar eSmartPtrList &frontends = simulate ? m_simulate_frontend : m_frontend; ePtr best; int bestval = 0; + int check_fbc_link = 0; + eFBCTunerManager *fbcmng = eFBCTunerManager::getInstance(); for (eSmartPtrList::iterator i(frontends.begin()); i != frontends.end(); ++i) + { if (!i->m_inuse) { - int c = i->m_frontend->isCompatibleWith(feparm); + int c = 0; + if(fbcmng && i->m_frontend->is_FBCTuner() && fbcmng->canLink(*i) && !check_fbc_link) + { + check_fbc_link = 1; + c = fbcmng->isCompatibleWith(feparm, *i, simulate); + } + else + { + c = i->m_frontend->isCompatibleWith(feparm); + } if (c > bestval) bestval = c; } + } return bestval; } @@ -942,6 +989,56 @@ int eDVBResourceManager::canAllocateChannel(const eDVBChannelID &channelid, cons int *decremented_cached_channel_fe_usecount=NULL, *decremented_fe_usecount=NULL; + /* check FCC channels */ + std::vector fcc_decremented_fe_usecounts; + std::map fcc_chids; + int apply_to_ignore = 0; + if (!eFCCServiceManager::getFCCChannelID(fcc_chids)) + { + for (std::map::iterator i(fcc_chids.begin()); i != fcc_chids.end(); ++i) + { + //eDebug("[eDVBResourceManager::canAllocateChannel] FCC NS : %08x, TSID : %04x, ONID : %04x", i->first.dvbnamespace.get(), i->first.transport_stream_id.get(), i->first.original_network_id.get()); + if (ignore == i->first) + { + apply_to_ignore = i->second; + continue; + } + for (std::list::iterator ii(active_channels.begin()); ii != active_channels.end(); ++ii) + { + eSmartPtrList &frontends = simulate ? m_simulate_frontend : m_frontend; + if (ii->m_channel_id == i->first) + { + eDVBChannel *channel = (eDVBChannel*) &(*ii->m_channel); + + int check_usecount = channel == &(*m_cached_channel) ? 1 : 0; + check_usecount += i->second * 2; // one is used in eDVBServicePMTHandler and another is used in eDVBScan. + //eDebug("[eDVBResourceManager::canAllocateChannel] channel->getUseCount() : %d , check_usecount : %d (cached : %d)", channel->getUseCount(), check_usecount, channel == &(*m_cached_channel)); + if (channel->getUseCount() == check_usecount) + { + ePtr fe; + if (!ii->m_channel->getFrontend(fe)) + { + for (eSmartPtrList::iterator iii(frontends.begin()); iii != frontends.end(); ++iii) + { + if ( &(*fe) == &(*iii->m_frontend) ) + { + //eDebug("[eDVBResourceManager::canAllocateChannel] fcc : decrease fcc fe use_count! feid : %d (%d -> %d)", iii->m_frontend->getSlotID(), iii->m_inuse, iii->m_inuse-1); + --iii->m_inuse; + int *tmp_decremented_fe_usecount = &iii->m_inuse; + fcc_decremented_fe_usecounts.push_back(tmp_decremented_fe_usecount); + if (channel == &(*m_cached_channel)) + decremented_cached_channel_fe_usecount = tmp_decremented_fe_usecount; + break; + } + } + } + } + break; + } + } + } + } + for (std::list::iterator i(active_channels.begin()); i != active_channels.end(); ++i) { eSmartPtrList &frontends = simulate ? m_simulate_frontend : m_frontend; @@ -953,7 +1050,10 @@ int eDVBResourceManager::canAllocateChannel(const eDVBChannelID &channelid, cons // another on eUsePtr is used in the eDVBScan instance used in eDVBServicePMTHandler (for SDT scan) // so we must check here if usecount is 3 (when the channel is equal to the cached channel) // or 2 when the cached channel is not equal to the compared channel - if (channel == &(*m_cached_channel) ? channel->getUseCount() == 3 : channel->getUseCount() == 2) // channel only used once.. + int check_usecount = channel == &(*m_cached_channel) ? 1 : 0; + check_usecount += (apply_to_ignore+1) * 2; // one is used in eDVBServicePMTHandler and another is used in eDVBScan. + //eDebug("[eDVBResourceManager::canAllocateChannel] channel->getUseCount() : %d , check_usecount : %d (cached : %d)", channel->getUseCount(), check_usecount, channel == &(*m_cached_channel)); + if (channel->getUseCount() == check_usecount) // channel only used once..(except fcc) { ePtr fe; if (!i->m_channel->getFrontend(fe)) @@ -962,6 +1062,7 @@ int eDVBResourceManager::canAllocateChannel(const eDVBChannelID &channelid, cons { if ( &(*fe) == &(*ii->m_frontend) ) { + //eDebug("[eDVBResourceManager::canAllocateChannel] ignore : decrease fcc fe use_count! feid : %d (%d -> %d)", ii->m_frontend->getSlotID(), ii->m_inuse, ii->m_inuse-1); --ii->m_inuse; decremented_fe_usecount = &ii->m_inuse; if (channel == &(*m_cached_channel)) @@ -1024,6 +1125,14 @@ error: ++(*decremented_fe_usecount); if (decremented_cached_channel_fe_usecount) ++(*decremented_cached_channel_fe_usecount); + if (fcc_decremented_fe_usecounts.size()) + { + for (std::vector::iterator i(fcc_decremented_fe_usecounts.begin()); i != fcc_decremented_fe_usecounts.end(); ++i) + { + //eDebug("[eDVBResourceManager::canAllocateChannel] fcc : increase fcc fe use_count!"); + ++(**i); + } + } return ret; }