Added a Query parameter to cDevice::GetDevice(), so that devices can be queried without side effects when zapping

This commit is contained in:
Klaus Schmidinger 2012-03-02 10:43:26 +01:00
parent 28bc34b245
commit c8808a854b
4 changed files with 14 additions and 8 deletions

View File

@ -6944,3 +6944,5 @@ Video Disk Recorder Revision History
attached to the device. Its boolean parameter has no meaning any more.
+ The default value for the Priority parameter of the function cDevice::ProvidesChannel()
has been changed to IDLEPRIORITY.
- Added a Query parameter to cDevice::GetDevice(), so that devices can be queried
without side effects when zapping.

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: device.c 2.52 2012/03/02 10:18:44 kls Exp $
* $Id: device.c 2.53 2012/03/02 10:33:35 kls Exp $
*/
#include "device.h"
@ -226,7 +226,7 @@ static int GetClippedNumProvidedSystems(int AvailableBits, cDevice *Device)
return NumProvidedSystems;
}
cDevice *cDevice::GetDevice(const cChannel *Channel, int Priority, bool LiveView)
cDevice *cDevice::GetDevice(const cChannel *Channel, int Priority, bool LiveView, bool Query)
{
cDevice *AvoidDevice = avoidDevice;
avoidDevice = NULL;
@ -301,7 +301,7 @@ cDevice *cDevice::GetDevice(const cChannel *Channel, int Priority, bool LiveView
if (!NumUsableSlots)
break; // no CAM necessary, so just one loop over the devices
}
if (d) {
if (d && !Query) {
if (NeedsDetachReceivers)
d->DetachAllReceivers();
if (s) {
@ -687,7 +687,7 @@ bool cDevice::SwitchChannel(int Direction)
cChannel *channel;
while ((channel = Channels.GetByNumber(n, Direction)) != NULL) {
// try only channels which are currently available
if (GetDevice(channel, LIVEPRIORITY, true))
if (GetDevice(channel, LIVEPRIORITY, true, true))
break;
n = channel->Number() + Direction;
}

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: device.h 2.35 2012/02/29 12:19:28 kls Exp $
* $Id: device.h 2.36 2012/03/02 10:23:13 kls Exp $
*/
#ifndef __DEVICE_H
@ -139,7 +139,7 @@ public:
///< Gets the device with the given Index.
///< \param Index must be in the range 0..numDevices-1.
///< \return A pointer to the device, or NULL if the Index was invalid.
static cDevice *GetDevice(const cChannel *Channel, int Priority, bool LiveView);
static cDevice *GetDevice(const cChannel *Channel, int Priority, bool LiveView, bool Query = false);
///< Returns a device that is able to receive the given Channel at the
///< given Priority, with the least impact on active recordings and
///< live viewing. The LiveView parameter tells whether the device will
@ -153,6 +153,10 @@ public:
///< after detaching any receivers because the channel can't be decrypted,
///< this device/CAM combination will be skipped in the next call to
///< GetDevice().
///< If Query is true, no actual CAM assignments or receiver detachments will
///< be done, so that this function can be called without any side effects
///< in order to just determine whether a device is available for the given
///< Channel.
///< See also ProvidesChannel().
static void SetAvoidDevice(cDevice *Device) { avoidDevice = Device; }
///< Sets the given Device to be temporarily avoided in the next call to

4
menu.c
View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: menu.c 2.38 2012/02/25 13:50:49 kls Exp $
* $Id: menu.c 2.39 2012/03/02 10:33:17 kls Exp $
*/
#include "menu.h"
@ -3653,7 +3653,7 @@ cChannel *cDisplayChannel::NextAvailableChannel(cChannel *Channel, int Direction
Channel = Direction > 0 ? Channels.Next(Channel) : Channels.Prev(Channel);
if (!Channel && Setup.ChannelsWrap)
Channel = Direction > 0 ? Channels.First() : Channels.Last();
if (Channel && !Channel->GroupSep() && cDevice::GetDevice(Channel, LIVEPRIORITY, true))
if (Channel && !Channel->GroupSep() && cDevice::GetDevice(Channel, LIVEPRIORITY, true, true))
return Channel;
}
}