if (slot->linked_next)
slot->linked_next->setSource(slot->current_source);
else // last CI in chain
+ {
setInputSource(slot->current_tuner, slot->current_source);
+ slot->removeVtunerPid();
+ }
slot->linked_next = 0;
slot->use_count=0;
slot->plugged=true;
eDebug("The CI in Slot %d has said it can handle caid %04x... so use it", ci_it->getSlotID(), *z);
useThis = true;
user_mapped = false;
+ ci_it->addVtunerPid(pmthandler);
break;
}
}
data_source tuner_source = TUNER_A;
switch (tunernum)
{
- case 0: tuner_source = TUNER_A; break;
- case 1: tuner_source = TUNER_B; break;
- case 2: tuner_source = TUNER_C; break;
- case 3: tuner_source = TUNER_D; break;
+ case 0 ... 22:
+ tuner_source = (data_source)tunernum;
+ break;
default:
eDebug("try to get source for tuner %d!!\n", tunernum);
break;
if (slot->linked_next)
slot->linked_next->setSource(slot->current_source);
else
+ {
setInputSource(slot->current_tuner, slot->current_source);
+ slot->removeVtunerPid();
+ }
if (base_slot != slot)
{
return slot->getMMIState();
}
+static const char *tuner_source[] = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "CI0", "CI1", "CI2", "CI3"};
+
int eDVBCIInterfaces::setInputSource(int tuner_no, data_source source)
{
// eDebug("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
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");
+ case TUNER_A ... CI_D:
+ fprintf(input, tuner_source[(int)source]);
break;
default:
eDebug("setInputSource for input %d failed!!!\n", (int)source);
if (!slot)
{
char tmp[255];
- snprintf(tmp, 255, "eDVBCIInterfaces::getDescrambleRules try to get rules for CI Slot %d... but just %d slots are available", slotid, m_slots.size());
+ snprintf(tmp, 255, "eDVBCIInterfaces::getDescrambleRules try to get rules for CI Slot %d... but just %zd slots are available", slotid, m_slots.size());
PyErr_SetString(PyExc_StandardError, tmp);
return 0;
}
if (!slot)
{
char tmp[255];
- snprintf(tmp, 255, "eDVBCIInterfaces::setDescrambleRules try to set rules for CI Slot %d... but just %d slots are available", slotid, m_slots.size());
+ snprintf(tmp, 255, "eDVBCIInterfaces::setDescrambleRules try to set rules for CI Slot %d... but just %zd slots are available", slotid, m_slots.size());
PyErr_SetString(PyExc_StandardError, tmp);
return -1;
}
if (PyTuple_Size(tuple) != 2)
{
char buf[255];
- snprintf(buf, 255, "eDVBCIInterfaces::setDescrambleRules provider tuple has %d instead of 2 entries!!", PyTuple_Size(tuple));
+ snprintf(buf, 255, "eDVBCIInterfaces::setDescrambleRules provider tuple has %zd instead of 2 entries!!", PyTuple_Size(tuple));
PyErr_SetString(PyExc_StandardError, buf);
return -1;
}
if (!slot)
{
char tmp[255];
- snprintf(tmp, 255, "eDVBCIInterfaces::readCICaIds try to get CAIds for CI Slot %d... but just %d slots are available", slotid, m_slots.size());
+ snprintf(tmp, 255, "eDVBCIInterfaces::readCICaIds try to get CAIds for CI Slot %d... but just %zd slots are available", slotid, m_slots.size());
PyErr_SetString(PyExc_StandardError, tmp);
}
else
{
perror(filename);
}
+
+ for(int i = 0; i < NUM_OF_ECM ; i++)
+ {
+ m_ecm[i] = 0;
+ }
+ ecm_num = 0;
+
}
eDVBCISlot::~eDVBCISlot()
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");
+ case TUNER_A ... CI_D:
+ fprintf(ci, tuner_source[(int)source]);
break;
default:
eDebug("CI Slot %d: setSource %d failed!!!\n", getSlotID(), (int)source);
return -1;
}
+void eDVBCISlot::addVtunerPid(eDVBServicePMTHandler *pmthandler)
+{
+ ePtr<iDVBDemux> demux;
+ eDVBServicePMTHandler::program p;
+
+ if (!pmthandler->getDataDemux(demux) && !ecm_num)
+ {
+
+ if (!pmthandler->getProgramInfo(p))
+ {
+ for (std::list<eDVBServicePMTHandler::program::capid_pair>::const_iterator i(p.caids.begin());
+ i != p.caids.end(); ++i)
+ {
+ if (i->capid >= 0)
+ {
+ eDebug("PES Start ECM PID = %d Caid = %d ecm_num=%d", i->capid, i->caid, ecm_num);
+ m_ecm[ecm_num] = new eDVBECMParser(demux);
+ m_ecm[ecm_num++]->start(i->capid);
+ }
+ }
+ }
+ }
+
+}
+
+void eDVBCISlot::removeVtunerPid(void)
+{
+ for(int i = 0; i < ecm_num ; i++)
+ {
+ if(m_ecm[i])
+ {
+ m_ecm[i]->stop();
+ m_ecm[i] = 0;
+ }
+ }
+ ecm_num = 0;
+}
+
eAutoInitP0<eDVBCIInterfaces> init_eDVBCIInterfaces(eAutoInitNumbers::dvb, "CI Slots");