Implemented 'occupied' for devices

This commit is contained in:
Klaus Schmidinger 2011-10-16 14:02:34 +02:00
parent ae8627e6fc
commit a964269fe9
4 changed files with 40 additions and 13 deletions

View File

@ -6743,7 +6743,7 @@ Video Disk Recorder Revision History
extends over TS packet boundaries is now done by locally skipping TS packets extends over TS packet boundaries is now done by locally skipping TS packets
in cFrameDetector. in cFrameDetector.
2011-10-09: Version 1.7.22 2011-10-16: Version 1.7.22
- Fixed scaling subtitles in case the primary device's GetVideoSize() function doesn't - Fixed scaling subtitles in case the primary device's GetVideoSize() function doesn't
return actual values (thanks to Luca Olivetti). return actual values (thanks to Luca Olivetti).
@ -6762,3 +6762,6 @@ Video Disk Recorder Revision History
to Rolf Ahrenberg). to Rolf Ahrenberg).
- Added cap_net_raw to the capabilities that are not dropped (thanks to Dominic Evans). - Added cap_net_raw to the capabilities that are not dropped (thanks to Dominic Evans).
- Fixed setting the start time of an edited recording (thanks to Christoph Haubrich). - Fixed setting the start time of an edited recording (thanks to Christoph Haubrich).
- Temporarily switching free devices to transponders in order to have their running
status updated is now done by marking the devices as "occupied" for a certain
amount of time.

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: device.c 2.42 2011/08/26 12:56:00 kls Exp $ * $Id: device.c 2.43 2011/10/16 14:01:30 kls Exp $
*/ */
#include "device.h" #include "device.h"
@ -95,6 +95,8 @@ cDevice::cDevice(void)
camSlot = NULL; camSlot = NULL;
startScrambleDetection = 0; startScrambleDetection = 0;
occupiedTimeout = 0;
player = NULL; player = NULL;
isPlayingVideo = false; isPlayingVideo = false;
ClrAvailableTracks(); ClrAvailableTracks();
@ -645,7 +647,7 @@ bool cDevice::IsTunedToTransponder(const cChannel *Channel)
bool cDevice::MaySwitchTransponder(void) bool cDevice::MaySwitchTransponder(void)
{ {
return !Receiving(true) && !(pidHandles[ptAudio].pid || pidHandles[ptVideo].pid || pidHandles[ptDolby].pid); return time(NULL) > occupiedTimeout && !Receiving(true) && !(pidHandles[ptAudio].pid || pidHandles[ptVideo].pid || pidHandles[ptDolby].pid);
} }
bool cDevice::SwitchChannel(const cChannel *Channel, bool LiveView) bool cDevice::SwitchChannel(const cChannel *Channel, bool LiveView)
@ -786,6 +788,18 @@ void cDevice::ForceTransferMode(void)
} }
} }
int cDevice::Occupied(void) const
{
int Seconds = occupiedTimeout - time(NULL);
return Seconds > 0 ? Seconds : 0;
}
void cDevice::SetOccupied(int Seconds)
{
if (Seconds >= 0)
occupiedTimeout = time(NULL) + min(Seconds, MAXOCCUPIEDTIMEOUT);
}
bool cDevice::SetChannelDevice(const cChannel *Channel, bool LiveView) bool cDevice::SetChannelDevice(const cChannel *Channel, bool LiveView)
{ {
return false; return false;

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: device.h 2.27 2011/08/26 12:52:29 kls Exp $ * $Id: device.h 2.28 2011/10/16 13:27:23 kls Exp $
*/ */
#ifndef __DEVICE_H #ifndef __DEVICE_H
@ -30,6 +30,7 @@
#define MAXRECEIVERS 16 // the maximum number of receivers per device #define MAXRECEIVERS 16 // the maximum number of receivers per device
#define MAXVOLUME 255 #define MAXVOLUME 255
#define VOLUMEDELTA 5 // used to increase/decrease the volume #define VOLUMEDELTA 5 // used to increase/decrease the volume
#define MAXOCCUPIEDTIMEOUT 99 // max. time (in seconds) a device may be occupied
enum eSetChannelResult { scrOk, scrNotAvailable, scrNoTransfer, scrFailed }; enum eSetChannelResult { scrOk, scrNotAvailable, scrNoTransfer, scrFailed };
@ -220,6 +221,8 @@ public:
// Channel facilities // Channel facilities
private:
time_t occupiedTimeout;
protected: protected:
static int currentChannel; static int currentChannel;
public: public:
@ -300,6 +303,16 @@ public:
///< channel number while replaying. ///< channel number while replaying.
void ForceTransferMode(void); void ForceTransferMode(void);
///< Forces the device into transfermode for the current channel. ///< Forces the device into transfermode for the current channel.
int Occupied(void) const;
///< Returns the number of seconds this device is still occupied for.
void SetOccupied(int Seconds);
///< Sets the occupied timeout for this device to the given number of
///< Seconds, This can be used to tune a device to a particular transponder
///< and make sure it will stay there for a certain amount of time, for
///< instance to collect EPG data. This function shall only be called
///< after the device has been successfully tuned to the requested transponder.
///< Seconds will be silently limited to MAXOCCUPIEDTIMEOUT. Values less than
///< 0 will be silently ignored.
virtual bool HasLock(int TimeoutMs = 0); virtual bool HasLock(int TimeoutMs = 0);
///< Returns true if the device has a lock on the requested transponder. ///< Returns true if the device has a lock on the requested transponder.
///< Default is true, a specific device implementation may return false ///< Default is true, a specific device implementation may return false

15
vdr.c
View File

@ -22,7 +22,7 @@
* *
* The project's page is at http://www.tvdr.de * The project's page is at http://www.tvdr.de
* *
* $Id: vdr.c 2.25 2011/09/23 13:09:37 kls Exp $ * $Id: vdr.c 2.26 2011/10/16 14:02:34 kls Exp $
*/ */
#include <getopt.h> #include <getopt.h>
@ -860,7 +860,6 @@ int main(int argc, char *argv[])
static time_t LastTimerCheck = 0; static time_t LastTimerCheck = 0;
if (Now - LastTimerCheck > TIMERCHECKDELTA) { // don't do this too often if (Now - LastTimerCheck > TIMERCHECKDELTA) { // don't do this too often
InhibitEpgScan = false; InhibitEpgScan = false;
static time_t DeviceUsed[MAXDEVICES] = { 0 };
for (cTimer *Timer = Timers.First(); Timer; Timer = Timers.Next(Timer)) { for (cTimer *Timer = Timers.First(); Timer; Timer = Timers.Next(Timer)) {
bool InVpsMargin = false; bool InVpsMargin = false;
bool NeedsTransponder = false; bool NeedsTransponder = false;
@ -900,19 +899,17 @@ int main(int argc, char *argv[])
Device = d; Device = d;
break; break;
} }
bool timeout = Now - DeviceUsed[d->DeviceNumber()] > TIMERDEVICETIMEOUT; // only check other devices if they have been left alone for a while
if (d->MaySwitchTransponder()) { if (d->MaySwitchTransponder()) {
DeviceAvailable = true; // avoids using the actual device below DeviceAvailable = true; // avoids using the actual device below
if (timeout) Device = d;
Device = d; // only check other devices if they have been left alone for a while
} }
else if (timeout && !Device && InVpsMargin && !d->Receiving() && d->ProvidesTransponderExclusively(Timer->Channel())) else if (!d->Occupied() && !Device && InVpsMargin && !d->Receiving() && d->ProvidesTransponderExclusively(Timer->Channel()))
Device = d; // use this one only if no other with less impact can be found Device = d; // use this one only if no other with less impact can be found
} }
} }
if (!Device && InVpsMargin && !DeviceAvailable) { if (!Device && InVpsMargin && !DeviceAvailable) {
cDevice *d = cDevice::ActualDevice(); cDevice *d = cDevice::ActualDevice();
if (!d->Receiving() && d->ProvidesTransponder(Timer->Channel()) && Now - DeviceUsed[d->DeviceNumber()] > TIMERDEVICETIMEOUT) if (!d->Receiving() && d->ProvidesTransponder(Timer->Channel()) && !d->Occupied())
Device = d; // use the actual device as a last resort Device = d; // use the actual device as a last resort
} }
// Switch the device to the transponder: // Switch the device to the transponder:
@ -921,8 +918,8 @@ int main(int argc, char *argv[])
if (Device == cDevice::ActualDevice() && !Device->IsPrimaryDevice()) if (Device == cDevice::ActualDevice() && !Device->IsPrimaryDevice())
cDevice::PrimaryDevice()->StopReplay(); // stop transfer mode cDevice::PrimaryDevice()->StopReplay(); // stop transfer mode
dsyslog("switching device %d to channel %d", Device->DeviceNumber() + 1, Timer->Channel()->Number()); dsyslog("switching device %d to channel %d", Device->DeviceNumber() + 1, Timer->Channel()->Number());
Device->SwitchChannel(Timer->Channel(), false); if (Device->SwitchChannel(Timer->Channel(), false))
DeviceUsed[Device->DeviceNumber()] = Now; Device->SetOccupied(TIMERDEVICETIMEOUT);
} }
if (cDevice::PrimaryDevice()->HasDecoder() && !cDevice::PrimaryDevice()->HasProgramme()) { if (cDevice::PrimaryDevice()->HasDecoder() && !cDevice::PrimaryDevice()->HasProgramme()) {
// the previous SwitchChannel() has switched away the current live channel // the previous SwitchChannel() has switched away the current live channel