X-Git-Url: http://code.vuplus.com/gitweb/?p=vuplus_dvbapp;a=blobdiff_plain;f=lib%2Fdvb_ci%2Fdvbci.cpp;h=0a32b8f2b18e488ccb0f3a4e2890ed7e560cf248;hp=64b029d46f1645ffa2433dfc2a5de43589547657;hb=c8bba1502bb3809d55fade29a0a9566875aa8745;hpb=be08b778383b2c996e61692cbcd0afe864ea2def diff --git a/lib/dvb_ci/dvbci.cpp b/lib/dvb_ci/dvbci.cpp index 64b029d..0a32b8f 100644 --- a/lib/dvb_ci/dvbci.cpp +++ b/lib/dvb_ci/dvbci.cpp @@ -200,36 +200,39 @@ int eDVBCIInterfaces::cancelEnq(int slotid) void eDVBCIInterfaces::ciRemoved(eDVBCISlot *slot) { - eDebug("CI Slot %d: removed... usecount %d", slot->getSlotID(), slot->use_count); - for (PMTHandlerList::iterator it(m_pmt_handlers.begin()); - it != m_pmt_handlers.end(); ++it) + if (slot->use_count) { - if (it->cislot == slot) // remove the base slot - it->cislot = slot->linked_next; - else if (it->cislot) + eDebug("CI Slot %d: removed... usecount %d", slot->getSlotID(), slot->use_count); + for (PMTHandlerList::iterator it(m_pmt_handlers.begin()); + it != m_pmt_handlers.end(); ++it) { - eDVBCISlot *prevSlot = it->cislot, *hSlot = it->cislot->linked_next; - while (hSlot) + if (it->cislot == slot) // remove the base slot + it->cislot = slot->linked_next; + else if (it->cislot) { - if (hSlot == slot) { - prevSlot->linked_next = slot->linked_next; - break; + eDVBCISlot *prevSlot = it->cislot, *hSlot = it->cislot->linked_next; + while (hSlot) + { + if (hSlot == slot) { + prevSlot->linked_next = slot->linked_next; + break; + } + prevSlot = hSlot; + hSlot = hSlot->linked_next; } - prevSlot = hSlot; - hSlot = hSlot->linked_next; } } + if (slot->linked_next) + slot->linked_next->setSource(slot->current_source); + else // last CI in chain + setInputSource(slot->current_tuner, slot->current_source); + slot->linked_next = 0; + slot->use_count=0; + slot->plugged=true; + slot->user_mapped=false; + slot->removeService(0xFFFF); + recheckPMTHandlers(); } - if (slot->linked_next) - slot->linked_next->setSource(slot->current_source); - else // last CI in chain - setInputSource(slot->current_tuner, slot->current_source); - slot->linked_next = 0; - slot->use_count=0; - slot->plugged=true; - slot->user_mapped=false; - slot->removeService(0xFFFF); - recheckPMTHandlers(); } static bool canDescrambleMultipleServices(int slotid) @@ -574,7 +577,7 @@ void eDVBCIInterfaces::removePMTHandler(eDVBServicePMTHandler *pmthandler) { if (!sameServiceExist) { - if (slot->getNumOfServices() > 1) +// if (slot->getNumOfServices() > 1) { eDebug("[eDVBCIInterfaces] remove last pmt handler for service %s send empty capmt", service_to_remove.toString().c_str());