On 06/07/08 12:43, Udo Richter wrote:
Hi list,
Is there a proper way to attach another stream receiver to the currently receiving channel, and - more important - disconnect it properly on channel change?
The problem arises from difficulties with the osdteletext plugin. (see http://www.vdr-portal.de/board/thread.php?threadid=70372 )
The problem of the current implementation is that on channel change the teletext receiving stream is disconnected on cStatus::ChannelSwitch(dev,0), which is _after_ GetDevice picked the device for the next channel. And since the teletext stream is still being received, the primary receiving device (FF card) is 'in use' and has NeedsDetachReceiver set - so a budget card is preferred for live viewing. (FF cards normally use no cReceivers at all for live view, so the device is automatically 'free' on channel switch.)
(Btw: On 2x budget only systems, it seems as if the live view will constantly switch between the devices for the same reason, or?)
Taking a look at the subtitles receiver shows that the subtitles stream is disconnected at the beginning of cDevice::SetChannel, which is right before the GetDevice call, thus a FF card is 'free' again at the GetDevice call.
If there's no proper way to solve this right now, I could imagine a few VDR changes that would:
- Find a way to mark a receiver as being 'live related' and disconnect
it before live channel switching.
- Find a way to mark a receiver as being 'extremely unimportant', and
don't count them as NeedsDetachReceiver or as Receiving() in that case, maybe by using -1 as priority.
Using a negative priority would be the right way:
cReceiver(tChannelID ChannelID, int Priority, int Pid, const int *Pids1 = NULL, const int *Pids2 = NULL, const int *Pids3 = NULL); ///< ... ///< Priority may be any value in the range -99..99. Negative values indicate ///< that this cReceiver may be detached at any time (without blocking the ///< cDevice it is attached to).
Why does the osdteletext plugin use a non-negative priority at all?
- Extend GetDevice to ignore some receivers that will be disconnected
afterwards anyway - maybe define 'related' receivers that will disconnect together.
- Notify plugins about the upcoming channel switch _before_ the
GetDevice call, so live receivers can be disconnected.
Klaus