create global (real) config entries, update setup on hotplug (untested), fix apply...
[enigma2.git] / lib / dvb_ci / dvbci.cpp
index 800a40d2b98fa8ac93c5edf262ffc30ea7512689..85c18794209c367892e71c53636ee0a146fcaccf 100644 (file)
@@ -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<eDVBCISlot>::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,11 +904,11 @@ eDVBCISlot::eDVBCISlot(eMainloop *context, int nr)
        {
                perror(filename);
        }
-       setSource(TUNER_A);
 }
 
 eDVBCISlot::~eDVBCISlot()
 {
+       delete notifier;
 }
 
 void eDVBCISlot::setAppManager( eDVBCIApplicationManagerSession *session )
@@ -1040,9 +1050,9 @@ int eDVBCISlot::sendCAPMT(eDVBServicePMTHandler *pmthandler, const std::vector<u
                {
                        unsigned char raw_data[2048];
 
-//                     eDebug("send %s capmt for service %04x",
+//                     eDebug("send %s capmt for service %04x to slot %d",
 //                             it != running_services.end() ? "UPDATE" : running_services.empty() ? "ONLY" : "ADD",
-//                             program_number);
+//                             program_number, slotid);
 
                        CaProgramMapSection capmt(*i++,
                                it != running_services.end() ? 0x05 /*update*/ : running_services.empty() ? 0x03 /*only*/ : 0x04 /*add*/, 0x01, caids );
@@ -1105,55 +1115,58 @@ void eDVBCISlot::removeService(uint16_t program_number)
 int eDVBCISlot::setSource(data_source source)
 {
        current_source = source;
-#if defined(DM8000)
-       char buf[64];
-       snprintf(buf, 64, "/proc/stb/tsmux/ci%d_input", slotid);
-       FILE *ci = fopen(buf, "wb");
-       switch(source)
+       if (eDVBCIInterfaces::getInstance()->getNumOfSlots() > 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;
 }