Moin!
Seit ich mit vdr 1.7.16 herumexperimentiere, sehe ich auch diese Meldung. Hab dann ein wenig gewühlt und folgende Veränderungen im Konstruktor von cDvbDevice von 1.7.14 nach 1.7.15 gefunden:
dvbdevice.c (1.7.14)
if (fd_frontend >= 0) {
if (ioctl(fd_frontend, FE_GET_INFO, &frontendInfo) >= 0) {
switch (frontendInfo.type) {
case FE_QPSK: frontendType = (frontendInfo.caps & FE_CAN_2G_MODULATION) ? SYS_DVBS2 : SYS_DVBS; break;
case FE_OFDM: frontendType = SYS_DVBT; break;
case FE_QAM: frontendType = SYS_DVBC_ANNEX_AC; break;
case FE_ATSC: frontendType = SYS_ATSC; break;
default: esyslog("ERROR: unknown frontend type %d on frontend %d/%d", frontendInfo.type, adapter, frontend);
}
}
else
LOG_ERROR;
if (frontendType != SYS_UNDEFINED) {
numProvidedSystems++;
if (frontendType == SYS_DVBS2)
numProvidedSystems++;
isyslog("frontend %d/%d provides %s (\"%s\")", adapter, frontend, DeliverySystems[frontendType], frontendInfo.name);
dvbTuner = new cDvbTuner(CardIndex() + 1, fd_frontend, adapter, frontend, frontendType);
}
}
Alles anzeigen
dvbdevice.c (1.7.15)
if (fd_frontend >= 0) {
if (ioctl(fd_frontend, FE_GET_INFO, &frontendInfo) >= 0) {
switch (frontendInfo.type) {
case FE_QPSK: frontendType = (frontendInfo.caps & FE_CAN_2G_MODULATION) ? SYS_DVBS2 : SYS_DVBS; break;
case FE_OFDM: frontendType = SYS_DVBT; break;
case FE_QAM: frontendType = SYS_DVBC_ANNEX_AC; break;
case FE_ATSC: frontendType = SYS_ATSC; break;
default: esyslog("ERROR: unknown frontend type %d on frontend %d/%d", frontendInfo.type, adapter, frontend);
}
}
else
LOG_ERROR;
if (frontendType != SYS_UNDEFINED) {
numProvidedSystems++;
if (frontendType == SYS_DVBS2)
numProvidedSystems++;
char Modulations[64];
char *p = Modulations;
if (frontendInfo.caps & FE_CAN_QPSK) { numProvidedSystems++; p += sprintf(p, ",%s", MapToUserString(QPSK, ModulationValues)); }
if (frontendInfo.caps & FE_CAN_QAM_16) { numProvidedSystems++; p += sprintf(p, ",%s", MapToUserString(QAM_16, ModulationValues)); }
if (frontendInfo.caps & FE_CAN_QAM_32) { numProvidedSystems++; p += sprintf(p, ",%s", MapToUserString(QAM_32, ModulationValues)); }
if (frontendInfo.caps & FE_CAN_QAM_64) { numProvidedSystems++; p += sprintf(p, ",%s", MapToUserString(QAM_64, ModulationValues)); }
if (frontendInfo.caps & FE_CAN_QAM_128) { numProvidedSystems++; p += sprintf(p, ",%s", MapToUserString(QAM_128, ModulationValues)); }
if (frontendInfo.caps & FE_CAN_QAM_256) { numProvidedSystems++; p += sprintf(p, ",%s", MapToUserString(QAM_256, ModulationValues)); }
if (frontendInfo.caps & FE_CAN_8VSB) { numProvidedSystems++; p += sprintf(p, ",%s", MapToUserString(VSB_8, ModulationValues)); }
if (frontendInfo.caps & FE_CAN_16VSB) { numProvidedSystems++; p += sprintf(p, ",%s", MapToUserString(VSB_16, ModulationValues)); }
if (frontendInfo.caps & FE_CAN_TURBO_FEC){numProvidedSystems++; p += sprintf(p, ",%s", "TURBO_FEC"); }
if (p != Modulations)
p = Modulations + 1; // skips first ','
else
p = (char *)"unknown modulations";
isyslog("frontend %d/%d provides %s with %s (\"%s\")", adapter, frontend, DeliverySystems[frontendType], p, frontendInfo.name);
dvbTuner = new cDvbTuner(CardIndex() + 1, fd_frontend, adapter, frontend, frontendType, this);
}
}
Alles anzeigen
Meine Satelco EasyWatch sorgt dann für folgende Meldung im Log:
frontend 1/0 provides DVB-C with QPSK,QAM16,QAM32,QAM64,QAM128,QAM256 ("Philips TDA10023 DVB-C")
In cDevice::GetDevice versucht nun der vdr eine Karte zu finden, die für eine Aufnahme oder streamdev oder was auch immer benutzt werden kann. Dabei versucht er, keine Karte auszuwählen, die mehrere Systeme unterstützt. Das soll z.B. verhindern, dass ein DVB-S-Kanal auf einer Karte geguckt wird, die DVB-S und DVB-S2 unterstützt. Damit dann eine spätere Aufnahme auf der jeweils anderen Modulation auch eine Karte findet.
Es wird also versucht, die Karte mit den wenigsten Modulations-System zu benutzen. Die Meldung ist nicht unbedingt schlimm, es bedeutet nur, dass Karten mit unterstützten Systemen über eine gewisse Anzahl hinaus nicht mehr unterschieden werden.
Aber eigentlich sind in der Funktion GetClippedNumProvidedSystems 4 Bits für die Anzahl reserviert, es sollten also eigentlich 15 Systeme unterschieden werden können. Warum da die Variable MaxNumProvidedSystems als 4 und nicht als 15 ausgerechnet wird, hab ich keine Ahnung...
int MaxNumProvidedSystems = (1 << AvailableBits) - 1;
AvailableBits ist 4, das hab ich mit einer Log-Meldung überprüft. Dann wird MaxNumProvidedSystems auch richtig ausgerechnet und der Fehler taucht nicht auf.
Vielleicht eine komische Compiler-Optimierung? Ich nutze gcc 4.4.3.
Lars.