On 02.03.2012 18:13, Udo Richter wrote:
Am 02.03.2012 11:06, schrieb Klaus Schmidinger:
On 29.02.2012 21:33, Udo Richter wrote:
Roughly, the callback should be at the places where these two get called:
DELETENULL(liveSubtitle); DELETENULL(dvbSubtitleConverter);
(Thats how VDR's own receivers get out of way.)
There are two places in GetDevice() where cStatus::MsgChannelSwitch(this, 0) is called, but they are both *after* the final call to GetDevice(). And there is this comment
// only report status if we are actually going to switch the channel
which refers to a change that was made in version 1.1.10:
- Only calling cStatus::MsgChannelSwitch() if a channel is actually
going to be switched or has actually been switched successfully (thanks to Stefan Huelswitt).
Good point. What if VDR wants to switch, but fails. Is it possible that the channel change still fails after deleting liveSubtitle and dvbSubtitleConverter? How does VDR itself handle this? Need to investigate this.
If switching to a certain channel fails, VDR will notice that the primary device no longer HasProgramme() and will try to switch to a different channel.
If a call to MsgChannelSwitch(this, 0) was done on channel change, we have to make sure that the corresponding call for the new channel does happen, or - worst case - there's a call for the old channel again.
What I really see as a problem here now is that the first call to GetDevice() may call a device's DetachAllReceivers() and the second GetDevice() call may then decide to actually use a different device. I'm currently considering giving GetDevice() another parameter:
static cDevice *GetDevice(const cChannel *Channel, int Priority, bool LiveView, bool Query = false);
+1, as I know that something like this was on some wish lists for some time. ;)
I'll release version 1.7.25 later today, so that all these changes can be reviewed and tested.
Klaus