Hello Klaus,
Wouldn't it be enough to simply give your receiver a priority of -2 (anything less than -1 would do)? That way any recording and even a Transfer Mode (which uses priority -1) could detach your receiver.
Klaus
I didn't knew that I can use values less then -1 If I understand right, this should work:
PRIORECEIVER= -2 PRIOSWITCHCHANNEL= -3 receiver = new MyReceiver(PRIORECEIVER); :FOR ALL DEVICES device = cDevice::GetDevice(SomeDevice); if(device->ProvidesChannel(channel,PRIOSWITCHCHANNEL)){ device->SwitchChannel(channel,false); if (!device->AttachReceiver(receiver)){ esyslog("ERROR could not attach receiver to device."); } }
now I have replaced this with:
PRIORECEIVER= -2 PRIOSWITCHCHANNEL= -3 receiver = new MyReceiver(PRIORECEIVER); device = cDevice::GetDevice(channel, PRIOCHANGECHANNEL); if(device){ device->SwitchChannel(channel,false); if (!device->AttachReceiver(receiver)){ esyslog("ERROR could not attach receiver to device."); } }else{ dsyslog("no device can handle the channel"); }
In this case device->ProvidesChannel(channel,PRIOSWITCHCHANNEL) is always true If I use PRIORECEIVER= 11 PRIOSWITCHCHANNEL= 10 It works, but useraction will not detach myreceiver.
If I'm looking in dvbdevice.c ProvidesChannel:
bool cDvbDevice::ProvidesChannel(const cChannel *Channel, int Priority, bool *NeedsDetachReceivers) const { bool result = false; bool hasPriority = Priority < 0 || Priority > this->Priority(); ....
if (ProvidesSource(Channel->Source()) && ProvidesCa(Channel)) { result = hasPriority; if (Priority >= 0 && Receiving(true)) { ............. } ........ return result; }
So if I call this Function with a value < 0 and the device can ProvideSource and ProvideCa it will always return true. There is no check for other receiver(and the prio of them) are attached.
Should I try to reexplane my Problem?
Patrick