Anssi Hannula wrote: > Anssi Hannula wrote: >> The Receiving(bool CheckAny) is modified so that if it is called on the >> transfer-moded device, it returns true if receivers are found with >> priority < 0 even if CheckAny == false. > >> bool cDevice::Receiving(bool CheckAny) const >> { >> + if (this == ActualDevice()) >> + CheckAny = true; > > No, what if primary device is not receiving, but has -1 priority > receivers? This reports true then, when it shouldn't. > > It should be this instead: > + if (this == cTransferControl::ReceiverDevice()) > + return true; > > Attached is a revised patch. > > > ------------------------------------------------------------------------ > > diff -Nurp -x '*~' vdr-1.4.0/device.c vdr-1.4.0-fix/device.c > --- vdr-1.4.0/device.c 2006-04-14 17:34:43.000000000 +0300 > +++ vdr-1.4.0-fix/device.c 2006-05-12 06:31:20.000000000 +0300 > @@ -627,7 +627,7 @@ eSetChannelResult cDevice::SetChannel(co > // use the card that actually can receive it and transfer data from there: > > if (NeedsTransferMode) { > - cDevice *CaDevice = GetDevice(Channel, 0, &NeedsDetachReceivers); > + cDevice *CaDevice = GetDevice(Channel, Setup.PrimaryLimit, &NeedsDetachReceivers); > if (CaDevice && CanReplay()) { > cStatus::MsgChannelSwitch(this, 0); // only report status if we are actually going to switch the channel > if (CaDevice->SetChannel(Channel, false) == scrOk) { // calling SetChannel() directly, not SwitchChannel()! > @@ -1158,7 +1158,7 @@ int cDevice::Ca(void) const > > int cDevice::Priority(void) const > { > - int priority = IsPrimaryDevice() ? Setup.PrimaryLimit - 1 : DEFAULTPRIORITY; > + int priority = ActualDevice() == this ? Setup.PrimaryLimit - 1 : DEFAULTPRIORITY; > for (int i = 0; i < MAXRECEIVERS; i++) { > if (receiver[i]) > priority = max(receiver[i]->priority, priority); > @@ -1183,6 +1183,8 @@ int cDevice::ProvidesCa(const cChannel * > > bool cDevice::Receiving(bool CheckAny) const > { > + if (this == cTransferControl::ReceiverDevice()) > + return true; > for (int i = 0; i < MAXRECEIVERS; i++) { > if (receiver[i] && (CheckAny || receiver[i]->priority >= 0)) // cReceiver with priority < 0 doesn't count > return true; I'm afraid this patch has a nasty side effect. Asssume the following scenario: - two devices, primary is 1 - all channels are available on both devices, except for channels 10, 11 and 12 which can only be received by device 2 - channels 10 and 11 are on the same transponder, channel 12 is on a different one - switch directly to channel 10 -> transfer mode starts - press "Up" to switch to channel 11, but that channel is skipped and it switches to channel 12 So I guess I can't accept this patch. Klaus