Rantanen Teemu wrote: > Stefan Taferner wrote: > >>I think it is necessary to have that checking for a CI. Otherwise >>it wont work well on systems that have mixed CI and non-CI cards. >>Or two cards with different CI (e.g. premiere + orf). > > > This sounds good, at least it would fix this for me. > > In the meantime I modified for-loop in cDevice::GetDevice() to: > > for (int i = numDevices-1; i >= 0; i--) > > My full-card (with CI) is the first device, followed by 2 budget cards > (non-CI). Now budget cards will be selected if they are free and can > receive the channel. > > You should consider this as a (very) temporary solution, which may or > may not help you (depending on the order of DVB cards in your system). > For the real fix, wait for what Klaus has to say... I believe one problem here is that with the old DVB driver the sequence in which the DVB cards were detected is different than with the dvb-kernel driver (or maybe it's because of the different kernel). Anyway, the following patch should make VDR prefer budget cards (i.e. cards that don't have an MPEG decoder) when selecting a device for recording. I still need to do some work on the ProvidesCa() function, because this is still based on the old CA handling, before VDR did the CA communication itself. Klaus --- device.c 2005/05/05 14:48:01 1.100 +++ device.c 2005/05/07 15:04:17 @@ -270,7 +270,7 @@ cDevice *cDevice::GetDevice(const cChannel *Channel, int Priority, bool *NeedsDetachReceivers) { cDevice *d = NULL; - int select = 7, pri; + int select = 8, pri; for (int i = 0; i < numDevices; i++) { bool ndr; @@ -279,16 +279,18 @@ pri = 0; // receiving and allows additional receivers else if (d && !device[i]->Receiving() && device[i]->ProvidesCa(Channel) < d->ProvidesCa(Channel)) pri = 1; // free and fewer Ca's + else if (!device[i]->Receiving() && !device[i]->HasDecoder()) + pri = 2; // free and not a full featured card else if (!device[i]->Receiving() && !device[i]->IsPrimaryDevice()) - pri = 2; // free and not the primary device + pri = 3; // free and not the primary device else if (!device[i]->Receiving()) - pri = 3; // free + pri = 4; // free else if (d && device[i]->Priority() < d->Priority()) - pri = 4; // receiving but priority is lower + pri = 5; // receiving but priority is lower else if (d && device[i]->Priority() == d->Priority() && device[i]->ProvidesCa(Channel) < d->ProvidesCa(Channel)) - pri = 5; // receiving with same priority but fewer Ca's + pri = 6; // receiving with same priority but fewer Ca's else - pri = 6; // all others + pri = 7; // all others if (pri < select) { select = pri; d = device[i];