X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/be08b778383b2c996e61692cbcd0afe864ea2def..26b52ce2c34af4e3a20777a6ee0b1200c677032d:/lib/dvb_ci/dvbci.cpp diff --git a/lib/dvb_ci/dvbci.cpp b/lib/dvb_ci/dvbci.cpp index 64b029d4..883fb5a4 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) @@ -549,6 +552,7 @@ void eDVBCIInterfaces::removePMTHandler(eDVBServicePMTHandler *pmthandler) if (it != m_pmt_handlers.end()) { eDVBCISlot *slot = it->cislot; + eDVBCISlot *base_slot = slot; eDVBServicePMTHandler *pmthandler = it->pmthandler; m_pmt_handlers.erase(it); @@ -572,20 +576,17 @@ void eDVBCIInterfaces::removePMTHandler(eDVBServicePMTHandler *pmthandler) while(slot) { + eDVBCISlot *next = slot->linked_next; if (!sameServiceExist) { - if (slot->getNumOfServices() > 1) - { - eDebug("[eDVBCIInterfaces] remove last pmt handler for service %s send empty capmt", - service_to_remove.toString().c_str()); - std::vector caids; - caids.push_back(0xFFFF); - slot->sendCAPMT(pmthandler, caids); // send a capmt without caids to remove a running service - } + eDebug("[eDVBCIInterfaces] remove last pmt handler for service %s send empty capmt", + service_to_remove.toString().c_str()); + std::vector caids; + caids.push_back(0xFFFF); + slot->sendCAPMT(pmthandler, caids); // send a capmt without caids to remove a running service slot->removeService(service_to_remove.getServiceID().get()); } - eDVBCISlot *next = slot->linked_next; if (!--slot->use_count) { if (slot->linked_next) @@ -593,9 +594,7 @@ void eDVBCIInterfaces::removePMTHandler(eDVBServicePMTHandler *pmthandler) else setInputSource(slot->current_tuner, slot->current_source); - if (it->cislot == slot) // remove the base slot - it->cislot = slot->linked_next; - else + if (base_slot != slot) { eDVBCISlot *tmp = it->cislot; while(tmp->linked_next != slot) @@ -606,6 +605,8 @@ void eDVBCIInterfaces::removePMTHandler(eDVBServicePMTHandler *pmthandler) else tmp->linked_next = 0; } + else // removed old base slot.. update ptr + base_slot = slot->linked_next; slot->linked_next = 0; slot->user_mapped = false; } @@ -1187,10 +1188,11 @@ int eDVBCISlot::sendCAPMT(eDVBServicePMTHandler *pmthandler, const std::vector::iterator it = running_services.find(program_number); + bool sendEmpty = caids.size() == 1 && caids[0] == 0xFFFF; if ( it != running_services.end() && (pmt_version == it->second) && - !(caids.size() == 1 && caids[0] == 0xFFFF) ) + !sendEmpty ) { eDebug("[eDVBCISlot] dont send self capmt version twice"); return -1; @@ -1215,7 +1217,7 @@ int eDVBCISlot::sendCAPMT(eDVBServicePMTHandler *pmthandler, const std::vectorsendCAPMT(raw_data + hlen, wp - hlen); running_services[program_number] = pmt_version;