X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/49990dc5d536344c2a5793d0d21cb2880e5c5247..4f48015e6f008575d6a6c59b9e6f78cb3c7c244b:/lib/dvb_ci/dvbci.cpp diff --git a/lib/dvb_ci/dvbci.cpp b/lib/dvb_ci/dvbci.cpp index 800a40d2..0c18e4f6 100644 --- a/lib/dvb_ci/dvbci.cpp +++ b/lib/dvb_ci/dvbci.cpp @@ -45,15 +45,21 @@ eDVBCIInterfaces::eDVBCIInterfaces() ++num_ci; } -#if defined(DM8000) - setInputSource(0, TUNER_A); - setInputSource(1, TUNER_B); - setInputSource(2, TUNER_C); - setInputSource(3, TUNER_D); -#else // force DM7025 - setInputSource(0, TUNER_A); - setInputSource(1, TUNER_B); -#endif + for (eSmartPtrList::iterator it(m_slots.begin()); it != m_slots.end(); ++it) + it->setSource(TUNER_A); + + if (num_ci > 1) // // FIXME .. we force DM8000 when more than one CI Slot is avail + { + setInputSource(0, TUNER_A); + setInputSource(1, TUNER_B); + setInputSource(2, TUNER_C); + setInputSource(3, TUNER_D); + } + else + { + setInputSource(0, TUNER_A); + setInputSource(1, TUNER_B); + } eDebug("done, found %d common interface slots", num_ci); } @@ -199,21 +205,21 @@ void eDVBCIInterfaces::ciRemoved(eDVBCISlot *slot) { if (slot->linked_next) slot->linked_next->setSource(slot->current_source); - else + else // last CI in chain setInputSource(slot->current_tuner, slot->current_source); if (it->cislot == slot) // remove the base slot it->cislot = slot->linked_next; else { + eDVBCISlot *tmp = it->cislot; + while(tmp->linked_next != slot) + tmp = tmp->linked_next; + ASSERT(tmp); if (slot->linked_next) - { - eDVBCISlot *tmp = it->cislot; - while(tmp->linked_next != slot) - tmp = tmp->linked_next; - ASSERT(tmp); tmp->linked_next = slot->linked_next; - } + else + tmp->linked_next = 0; } slot->linked_next=0; } @@ -368,6 +374,7 @@ void eDVBCIInterfaces::recheckPMTHandlers() { if (tmp == ci_it) break; + tmp=tmp->linked_next; } if (tmp) // ignore already assigned cislots... @@ -398,7 +405,7 @@ void eDVBCIInterfaces::recheckPMTHandlers() if (!channel->getFrontend(frontend)) { eDVBFrontend *fe = (eDVBFrontend*) &(*frontend); - tunernum = fe->getID(); + tunernum = fe->getSlotID(); } } ASSERT(tunernum != -1); @@ -504,14 +511,14 @@ void eDVBCIInterfaces::removePMTHandler(eDVBServicePMTHandler *pmthandler) it->cislot = slot->linked_next; else { + eDVBCISlot *tmp = it->cislot; + while(tmp->linked_next != slot) + tmp = tmp->linked_next; + ASSERT(tmp); if (slot->linked_next) - { - eDVBCISlot *tmp = it->cislot; - while(tmp->linked_next != slot) - tmp = tmp->linked_next; - ASSERT(tmp); tmp->linked_next = slot->linked_next; - } + else + tmp->linked_next = 0; } slot->linked_next=0; } @@ -552,82 +559,85 @@ int eDVBCIInterfaces::setInputSource(int tuner_no, data_source source) { // eDebug("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); // eDebug("eDVBCIInterfaces::setInputSource(%d %d)", tuner_no, (int)source); -#if defined(DM8000) - char buf[64]; - snprintf(buf, 64, "/proc/stb/tsmux/input%d", tuner_no); + if (getNumOfSlots() > 1) // FIXME .. we force DM8000 when more than one CI Slot is avail + { + char buf[64]; + snprintf(buf, 64, "/proc/stb/tsmux/input%d", tuner_no); - FILE *input=0; - if((input = fopen(buf, "wb")) == NULL) { - eDebug("cannot open %s", buf); - return 0; - } + FILE *input=0; + if((input = fopen(buf, "wb")) == NULL) { + eDebug("cannot open %s", buf); + return 0; + } - if (input > 3) - eDebug("setInputSource(%d, %d) failed... dm8000 just have four inputs", tuner_no, (int)source); + if (tuner_no > 3) + eDebug("setInputSource(%d, %d) failed... dm8000 just have four inputs", tuner_no, (int)source); - switch(source) - { - case CI_A: - fprintf(input, "CI0"); - break; - case CI_B: - fprintf(input, "CI1"); - break; - case CI_C: - fprintf(input, "CI2"); - break; - case CI_D: - fprintf(input, "CI3"); - break; - case TUNER_A: - fprintf(input, "A"); - break; - case TUNER_B: - fprintf(input, "B"); - break; - case TUNER_C: - fprintf(input, "C"); - break; - case TUNER_D: - fprintf(input, "D"); - break; - default: - eDebug("setInputSource for input %d failed!!!\n", (int)source); + switch(source) + { + case CI_A: + fprintf(input, "CI0"); + break; + case CI_B: + fprintf(input, "CI1"); + break; + case CI_C: + fprintf(input, "CI2"); break; + case CI_D: + fprintf(input, "CI3"); + break; + case TUNER_A: + fprintf(input, "A"); + break; + case TUNER_B: + fprintf(input, "B"); + break; + case TUNER_C: + fprintf(input, "C"); + break; + case TUNER_D: + fprintf(input, "D"); + break; + default: + eDebug("setInputSource for input %d failed!!!\n", (int)source); + break; + } + + fclose(input); } + else // DM7025 + { + char buf[64]; + snprintf(buf, 64, "/proc/stb/tsmux/input%d", tuner_no); - fclose(input); -#else // force DM7025 - char buf[64]; - snprintf(buf, 64, "/proc/stb/tsmux/input%d", tuner_no); + if (tuner_no > 1) + eDebug("setInputSource(%d, %d) failed... dm7025 just have two inputs", tuner_no, (int)source); - if (tuner_no > 1) - eDebug("setInputSource(%d, %d) failed... dm7025 just have two inputs", tuner_no, (int)source); + FILE *input=0; + if((input = fopen(buf, "wb")) == NULL) { + eDebug("cannot open %s", buf); + return 0; + } - FILE *input=0; - if((input = fopen(buf, "wb")) == NULL) { - eDebug("cannot open %s", buf); - return 0; - } + switch(source) + { + case CI_A: + fprintf(input, "CI"); + break; + case TUNER_A: + fprintf(input, "A"); + break; + case TUNER_B: + fprintf(input, "B"); + break; + default: + eDebug("setInputSource for input %d failed!!!\n", (int)source); + break; + } - switch(source) - { - case CI_A: - fprintf(input, "CI"); - break; - case TUNER_A: - fprintf(input, "A"); - break; - case TUNER_B: - fprintf(input, "B"); - break; - default: - eDebug("setInputSource for input %d failed!!!\n", (int)source); - break; + fclose(input); } - - fclose(input); -#endif eDebug("eDVBCIInterfaces->setInputSource(%d, %d)", tuner_no, (int)source); return 0; } @@ -894,7 +904,6 @@ eDVBCISlot::eDVBCISlot(eMainloop *context, int nr) { perror(filename); } - setSource(TUNER_A); } eDVBCISlot::~eDVBCISlot() @@ -1040,9 +1049,9 @@ int eDVBCISlot::sendCAPMT(eDVBServicePMTHandler *pmthandler, const std::vectorgetNumOfSlots() > 1) // FIXME .. we force DM8000 when more than one CI Slot is avail { - case CI_A: - fprintf(ci, "CI0"); - break; - case CI_B: - fprintf(ci, "CI1"); - break; - case CI_C: - fprintf(ci, "CI2"); - break; - case CI_D: - fprintf(ci, "CI3"); - break; - case TUNER_A: - fprintf(ci, "A"); - break; - case TUNER_B: - fprintf(ci, "B"); - break; - case TUNER_C: - fprintf(ci, "C"); - break; - case TUNER_D: - fprintf(ci, "D"); - break; - default: - eDebug("setSource %d failed!!!\n", (int)source); - break; + char buf[64]; + snprintf(buf, 64, "/proc/stb/tsmux/ci%d_input", slotid); + FILE *ci = fopen(buf, "wb"); + switch(source) + { + case CI_A: + fprintf(ci, "CI0"); + break; + case CI_B: + fprintf(ci, "CI1"); + break; + case CI_C: + fprintf(ci, "CI2"); + break; + case CI_D: + fprintf(ci, "CI3"); + break; + case TUNER_A: + fprintf(ci, "A"); + break; + case TUNER_B: + fprintf(ci, "B"); + break; + case TUNER_C: + fprintf(ci, "C"); + break; + case TUNER_D: + fprintf(ci, "D"); + break; + default: + eDebug("setSource %d failed!!!\n", (int)source); + break; + } + fclose(ci); } - fclose(ci); -#else // force DM7025 -// eDebug("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); -// eDebug("eDVBCISlot::enableTS(%d %d)", enable, (int)source); - FILE *ci = fopen("/proc/stb/tsmux/input2", "wb"); - if(ci == NULL) { - eDebug("cannot open /proc/stb/tsmux/input2"); - return 0; + else // DM7025 + { +// eDebug("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); +// eDebug("eDVBCISlot::enableTS(%d %d)", enable, (int)source); + FILE *ci = fopen("/proc/stb/tsmux/input2", "wb"); + if(ci == NULL) { + eDebug("cannot open /proc/stb/tsmux/input2"); + return 0; + } + if (source != TUNER_A && source != TUNER_B) + eDebug("setSource %d failed!!!\n", (int)source); + else + fprintf(ci, "%s", source==TUNER_A ? "A" : "B"); // configure CI data source (TunerA, TunerB) + fclose(ci); } - if (source != TUNER_A && source != TUNER_B) - eDebug("setSource %d failed!!!\n", (int)source); - else - fprintf(ci, "%s", source==TUNER_A ? "A" : "B"); // configure CI data source (TunerA, TunerB) - fclose(ci); -#endif eDebug("eDVBCISlot->setSource(%d)", (int)source); return 0; }