Revised priority handling to allow receivers with a priority that is lower than that of live viewing

This commit is contained in:
Klaus Schmidinger 2012-03-02 10:19:00 +01:00
parent a188928e6e
commit 28bc34b245
15 changed files with 66 additions and 43 deletions

View File

@ -2405,6 +2405,8 @@ Frank Schmirler <vdr@schmirler.de>
recordings of the same broadcast made by different instances of VDR recordings of the same broadcast made by different instances of VDR
for fixing EntriesOnSameFileSystem() to avoid using f_fsid, which may be 0 for fixing EntriesOnSameFileSystem() to avoid using f_fsid, which may be 0
for fixing the German translation of "Folder name must not contain '%c'!" for fixing the German translation of "Folder name must not contain '%c'!"
for suggestions used in revising priority handling to allow receivers with a priority
that is lower than that of live viewing
Jörn Reder <joern@zyn.de> Jörn Reder <joern@zyn.de>
for reporting that a recording may unnecessarily block a device with a CAM, while for reporting that a recording may unnecessarily block a device with a CAM, while

14
HISTORY
View File

@ -6889,7 +6889,7 @@ Video Disk Recorder Revision History
- Fixed switching into time shift mode when pausing live video (thanks to Reinhard - Fixed switching into time shift mode when pausing live video (thanks to Reinhard
Nissl for helping to debug this one). Nissl for helping to debug this one).
2012-02-27: Version 1.7.25 2012-03-02: Version 1.7.25
- The fps value for channels where it differs from the default is now set correctly - The fps value for channels where it differs from the default is now set correctly
when pausing live video. when pausing live video.
@ -6932,3 +6932,15 @@ Video Disk Recorder Revision History
used --rcu with a device path, use -P"rcu -d<device>". used --rcu with a device path, use -P"rcu -d<device>".
- Added support for automatically selecting subtitles when playing old PES - Added support for automatically selecting subtitles when playing old PES
recordings made with the subtitles plugin (thanks to Anssi Hannula). recordings made with the subtitles plugin (thanks to Anssi Hannula).
- Revised priority handling to allow receivers with a priority that is lower than
that of live viewing (with suggestions from Frank Schmirler):
+ An idle device (one that is not used for live viewing and has no receiver
attached to it) now has priority IDLEPRIORITY (-100).
+ An unused CAM slot now has priority IDLEPRIORITY.
+ The default priority of a cReceiver is now MINPRIORITY (-99).
+ A device that is used only for live viewing (no matter whether it's in Transfer
Mode or real live mode) now has priority TRANSFERPRIORITY (-1).
+ The function cDevice::Receiving() now returns true if there is any receiver
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.

View File

@ -1509,7 +1509,10 @@ member functions of <tt>cReceiver</tt>.
The above example sets up a receiver that wants to receive data from only one The above example sets up a receiver that wants to receive data from only one
PID (for example the Teletext PID). In order to not interfere with other recording PID (for example the Teletext PID). In order to not interfere with other recording
operations, it sets its priority to <tt>-1</tt> (any negative value will allow operations, it sets its priority to <tt>-1</tt> (any negative value will allow
a <tt>cReceiver</tt> to be detached from its <tt>cDevice</tt> at any time. a <tt>cReceiver</tt> to be detached from its <tt>cDevice</tt> at any time
<div class="modified">
in favor of a timer recording or live viewing).
</div modified>
<p> <p>
Once a <tt>cReceiver</tt> has been created, it needs to be <i>attached</i> to Once a <tt>cReceiver</tt> has been created, it needs to be <i>attached</i> to
a <tt>cDevice</tt>: a <tt>cDevice</tt>:

4
ci.c
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: ci.c 2.7 2011/05/21 15:21:33 kls Exp $ * $Id: ci.c 2.8 2012/02/29 10:24:41 kls Exp $
*/ */
#include "ci.h" #include "ci.h"
@ -1841,7 +1841,7 @@ const int *cCamSlot::GetCaSystemIds(void)
int cCamSlot::Priority(void) int cCamSlot::Priority(void)
{ {
cDevice *d = Device(); cDevice *d = Device();
return d ? d->Priority() : -1; return d ? d->Priority() : IDLEPRIORITY;
} }
bool cCamSlot::ProvidesCa(const int *CaSystemIds) bool cCamSlot::ProvidesCa(const int *CaSystemIds)

4
ci.h
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: ci.h 2.1 2011/12/04 13:38:17 kls Exp $ * $Id: ci.h 2.2 2012/02/29 10:24:27 kls Exp $
*/ */
#ifndef __CI_H #ifndef __CI_H
@ -192,7 +192,7 @@ public:
///< Gets a pending enquiry, or NULL if there is no enquiry. ///< Gets a pending enquiry, or NULL if there is no enquiry.
int Priority(void); int Priority(void);
///< Returns the priority if the device this slot is currently assigned ///< Returns the priority if the device this slot is currently assigned
///< to, or -1 if it is not assigned to any device. ///< to, or IDLEPRIORITY if it is not assigned to any device.
bool ProvidesCa(const int *CaSystemIds); bool ProvidesCa(const int *CaSystemIds);
///< Returns true if the CAM in this slot provides one of the given ///< Returns true if the CAM in this slot provides one of the given
///< CaSystemIds. This doesn't necessarily mean that it will be ///< CaSystemIds. This doesn't necessarily mean that it will be

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: config.c 2.19 2012/02/25 13:31:46 kls Exp $ * $Id: config.c 2.20 2012/02/29 10:15:54 kls Exp $
*/ */
#include "config.h" #include "config.h"
@ -407,7 +407,7 @@ cSetup::cSetup(void)
ZapTimeout = 3; ZapTimeout = 3;
ChannelEntryTimeout = 1000; ChannelEntryTimeout = 1000;
DefaultPriority = 50; DefaultPriority = 50;
DefaultLifetime = 99; DefaultLifetime = MAXLIFETIME;
PauseKeyHandling = 2; PauseKeyHandling = 2;
PausePriority = 10; PausePriority = 10;
PauseLifetime = 1; PauseLifetime = 1;

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: config.h 2.42 2012/02/25 13:31:34 kls Exp $ * $Id: config.h 2.43 2012/02/29 12:28:01 kls Exp $
*/ */
#ifndef __CONFIG_H #ifndef __CONFIG_H
@ -36,8 +36,12 @@
// plugins to work with newer versions of the core VDR as long as no // plugins to work with newer versions of the core VDR as long as no
// VDR header files have changed. // VDR header files have changed.
#define MAXPRIORITY 99 #define MAXPRIORITY 99
#define MAXLIFETIME 99 #define MINPRIORITY (-MAXPRIORITY)
#define LIVEPRIORITY 0 // priority used when selecting a device for live viewing
#define TRANSFERPRIORITY (LIVEPRIORITY - 1) // priority used for actual local Transfer Mode
#define IDLEPRIORITY (MINPRIORITY - 1) // priority of an idle device
#define MAXLIFETIME 99
#define MINOSDWIDTH 480 #define MINOSDWIDTH 480
#define MAXOSDWIDTH 1920 #define MAXOSDWIDTH 1920

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.51 2012/02/28 09:25:57 kls Exp $ * $Id: device.c 2.52 2012/03/02 10:18:44 kls Exp $
*/ */
#include "device.h" #include "device.h"
@ -281,8 +281,8 @@ cDevice *cDevice::GetDevice(const cChannel *Channel, int Priority, bool LiveView
imp <<= 1; imp |= device[i]->Receiving(); // avoid devices that are receiving imp <<= 1; imp |= device[i]->Receiving(); // avoid devices that are receiving
imp <<= 4; imp |= GetClippedNumProvidedSystems(4, device[i]) - 1; // avoid cards which support multiple delivery systems imp <<= 4; imp |= GetClippedNumProvidedSystems(4, device[i]) - 1; // avoid cards which support multiple delivery systems
imp <<= 1; imp |= device[i] == cTransferControl::ReceiverDevice(); // avoid the Transfer Mode receiver device imp <<= 1; imp |= device[i] == cTransferControl::ReceiverDevice(); // avoid the Transfer Mode receiver device
imp <<= 8; imp |= min(max(device[i]->Priority() + MAXPRIORITY, 0), 0xFF); // use the device with the lowest priority (+MAXPRIORITY to assure that values -99..99 can be used) imp <<= 8; imp |= device[i]->Priority() - IDLEPRIORITY; // use the device with the lowest priority (- IDLEPRIORITY to assure that values -100..99 can be used)
imp <<= 8; imp |= min(max((NumUsableSlots ? SlotPriority[j] : 0) + MAXPRIORITY, 0), 0xFF); // use the CAM slot with the lowest priority (+MAXPRIORITY to assure that values -99..99 can be used) imp <<= 8; imp |= (NumUsableSlots ? SlotPriority[j] : IDLEPRIORITY) - IDLEPRIORITY; // use the CAM slot with the lowest priority (- IDLEPRIORITY to assure that values -100..99 can be used)
imp <<= 1; imp |= ndr; // avoid devices if we need to detach existing receivers imp <<= 1; imp |= ndr; // avoid devices if we need to detach existing receivers
imp <<= 1; imp |= NumUsableSlots ? 0 : device[i]->HasCi(); // avoid cards with Common Interface for FTA channels imp <<= 1; imp |= NumUsableSlots ? 0 : device[i]->HasCi(); // avoid cards with Common Interface for FTA channels
imp <<= 1; imp |= device[i]->AvoidRecording(); // avoid SD full featured cards imp <<= 1; imp |= device[i]->AvoidRecording(); // avoid SD full featured cards
@ -652,7 +652,7 @@ bool cDevice::IsTunedToTransponder(const cChannel *Channel) const
bool cDevice::MaySwitchTransponder(const cChannel *Channel) const bool cDevice::MaySwitchTransponder(const cChannel *Channel) const
{ {
return time(NULL) > occupiedTimeout && !Receiving(true) && !(pidHandles[ptAudio].pid || pidHandles[ptVideo].pid || pidHandles[ptDolby].pid); return time(NULL) > occupiedTimeout && !Receiving() && !(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)
@ -1494,6 +1494,8 @@ int cDevice::PlayTs(const uchar *Data, int Length, bool VideoOnly)
int cDevice::Priority(void) const int cDevice::Priority(void) const
{ {
int priority = IDLEPRIORITY; int priority = IDLEPRIORITY;
if (IsPrimaryDevice() && !Replaying() && ActualDevice() == PrimaryDevice())
priority = TRANSFERPRIORITY; // we use the same value here, no matter whether it's actual Transfer Mode or real live viewing
cMutexLock MutexLock(&mutexReceiver); cMutexLock MutexLock(&mutexReceiver);
for (int i = 0; i < MAXRECEIVERS; i++) { for (int i = 0; i < MAXRECEIVERS; i++) {
if (receiver[i]) if (receiver[i])
@ -1507,11 +1509,11 @@ bool cDevice::Ready(void)
return true; return true;
} }
bool cDevice::Receiving(bool CheckAny) const bool cDevice::Receiving(bool Dummy) const
{ {
cMutexLock MutexLock(&mutexReceiver); cMutexLock MutexLock(&mutexReceiver);
for (int i = 0; i < MAXRECEIVERS; i++) { for (int i = 0; i < MAXRECEIVERS; i++) {
if (receiver[i] && (CheckAny || receiver[i]->priority >= 0)) // cReceiver with priority < 0 doesn't count if (receiver[i])
return true; return true;
} }
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.34 2012/02/25 12:54:39 kls Exp $ * $Id: device.h 2.35 2012/02/29 12:19:28 kls Exp $
*/ */
#ifndef __DEVICE_H #ifndef __DEVICE_H
@ -31,8 +31,6 @@
#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 #define MAXOCCUPIEDTIMEOUT 99 // max. time (in seconds) a device may be occupied
#define LIVEPRIORITY 0 // priority used when selecting a device for live viewing
#define IDLEPRIORITY (-MAXPRIORITY - 1)
enum eSetChannelResult { scrOk, scrNotAvailable, scrNoTransfer, scrFailed }; enum eSetChannelResult { scrOk, scrNotAvailable, scrNoTransfer, scrFailed };
@ -237,11 +235,11 @@ public:
virtual bool ProvidesTransponderExclusively(const cChannel *Channel) const; virtual bool ProvidesTransponderExclusively(const cChannel *Channel) const;
///< Returns true if this is the only device that is able to provide ///< Returns true if this is the only device that is able to provide
///< the given channel's transponder. ///< the given channel's transponder.
virtual bool ProvidesChannel(const cChannel *Channel, int Priority = -1, bool *NeedsDetachReceivers = NULL) const; virtual bool ProvidesChannel(const cChannel *Channel, int Priority = IDLEPRIORITY, bool *NeedsDetachReceivers = NULL) const;
///< Returns true if this device can provide the given channel. ///< Returns true if this device can provide the given channel.
///< In case the device has cReceivers attached to it, Priority is used to ///< In case the device has cReceivers attached to it, Priority is used to
///< decide whether the caller's request can be honored. ///< decide whether the caller's request can be honored.
///< The special Priority value -1 will tell the caller whether this device ///< The special Priority value IDLEPRIORITY will tell the caller whether this device
///< is principally able to provide the given Channel, regardless of any ///< is principally able to provide the given Channel, regardless of any
///< attached cReceivers. ///< attached cReceivers.
///< If NeedsDetachReceivers is given, the resulting value in it will tell the ///< If NeedsDetachReceivers is given, the resulting value in it will tell the
@ -736,8 +734,8 @@ protected:
///< false in case of a non recoverable error, otherwise it returns true, ///< false in case of a non recoverable error, otherwise it returns true,
///< even if Data is NULL. ///< even if Data is NULL.
public: public:
bool Receiving(bool CheckAny = false) const; bool Receiving(bool Dummy = false) const;
///< Returns true if we are currently receiving. ///< Returns true if we are currently receiving. The parameter has no meaning (for backwards compatibility only).
bool AttachReceiver(cReceiver *Receiver); bool AttachReceiver(cReceiver *Receiver);
///< Attaches the given receiver to this device. ///< Attaches the given receiver to this device.
void Detach(cReceiver *Receiver); void Detach(cReceiver *Receiver);

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: dvbdevice.c 2.64 2012/02/25 12:10:12 kls Exp $ * $Id: dvbdevice.c 2.65 2012/02/29 12:23:43 kls Exp $
*/ */
#include "dvbdevice.h" #include "dvbdevice.h"
@ -420,7 +420,7 @@ bool cDvbTuner::BondingOk(const cChannel *Channel, bool ConsiderOccupied) const
if (cDvbTuner *t = bondedTuner) { if (cDvbTuner *t = bondedTuner) {
cString BondingParams = GetBondingParams(Channel); cString BondingParams = GetBondingParams(Channel);
do { do {
if (t->device->Receiving() || t->tunerStatus != tsIdle && (t->device == cDevice::ActualDevice() || ConsiderOccupied && t->device->Occupied())) { if (t->device->Receiving() || ConsiderOccupied && t->device->Occupied()) {
if (strcmp(BondingParams, t->GetBondingParams()) != 0) if (strcmp(BondingParams, t->GetBondingParams()) != 0)
return false; return false;
} }
@ -1437,14 +1437,14 @@ bool cDvbDevice::ProvidesTransponder(const cChannel *Channel) const
bool cDvbDevice::ProvidesChannel(const cChannel *Channel, int Priority, bool *NeedsDetachReceivers) const bool cDvbDevice::ProvidesChannel(const cChannel *Channel, int Priority, bool *NeedsDetachReceivers) const
{ {
bool result = false; bool result = false;
bool hasPriority = Priority < 0 || Priority > this->Priority(); bool hasPriority = Priority == IDLEPRIORITY || Priority > this->Priority();
bool needsDetachReceivers = false; bool needsDetachReceivers = false;
needsDetachBondedReceivers = false; needsDetachBondedReceivers = false;
if (dvbTuner && ProvidesTransponder(Channel)) { if (dvbTuner && ProvidesTransponder(Channel)) {
result = hasPriority; result = hasPriority;
if (Priority >= 0) { if (Priority >= 0) {
if (Receiving(true)) { if (Receiving()) {
if (dvbTuner->IsTunedTo(Channel)) { if (dvbTuner->IsTunedTo(Channel)) {
if (Channel->Vpid() && !HasPid(Channel->Vpid()) || Channel->Apid(0) && !HasPid(Channel->Apid(0))) { if (Channel->Vpid() && !HasPid(Channel->Vpid()) || Channel->Apid(0) && !HasPid(Channel->Apid(0))) {
if (CamSlot() && Channel->Ca() >= CA_ENCRYPTED_MIN) { if (CamSlot() && Channel->Ca() >= CA_ENCRYPTED_MIN) {
@ -1460,7 +1460,7 @@ bool cDvbDevice::ProvidesChannel(const cChannel *Channel, int Priority, bool *Ne
result = true; result = true;
} }
else else
needsDetachReceivers = Receiving(true); needsDetachReceivers = Receiving();
} }
if (result) { if (result) {
if (!BondingOk(Channel)) { if (!BondingOk(Channel)) {
@ -1472,7 +1472,7 @@ bool cDvbDevice::ProvidesChannel(const cChannel *Channel, int Priority, bool *Ne
} }
} }
needsDetachBondedReceivers = true; needsDetachBondedReceivers = true;
needsDetachReceivers = Receiving(true); needsDetachReceivers = Receiving();
} }
} }
} }

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: dvbdevice.h 2.23 2012/02/17 11:18:55 kls Exp $ * $Id: dvbdevice.h 2.24 2012/02/29 12:20:51 kls Exp $
*/ */
#ifndef __DVBDEVICE_H #ifndef __DVBDEVICE_H
@ -179,7 +179,7 @@ public:
virtual bool ProvidesDeliverySystem(int DeliverySystem) const; virtual bool ProvidesDeliverySystem(int DeliverySystem) const;
virtual bool ProvidesSource(int Source) const; virtual bool ProvidesSource(int Source) const;
virtual bool ProvidesTransponder(const cChannel *Channel) const; virtual bool ProvidesTransponder(const cChannel *Channel) const;
virtual bool ProvidesChannel(const cChannel *Channel, int Priority = -1, bool *NeedsDetachReceivers = NULL) const; virtual bool ProvidesChannel(const cChannel *Channel, int Priority = IDLEPRIORITY, bool *NeedsDetachReceivers = NULL) const;
virtual bool ProvidesEIT(void) const; virtual bool ProvidesEIT(void) const;
virtual int NumProvidedSystems(void) const; virtual int NumProvidedSystems(void) const;
virtual int SignalStrength(void) const; virtual int SignalStrength(void) const;

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: receiver.c 2.4 2010/12/12 23:16:25 kls Exp $ * $Id: receiver.c 2.5 2012/02/29 11:49:36 kls Exp $
*/ */
#include "receiver.h" #include "receiver.h"
@ -16,7 +16,7 @@ cReceiver::cReceiver(tChannelID ChannelID, int Priority, int Pid, const int *Pid
{ {
device = NULL; device = NULL;
channelID = ChannelID; channelID = ChannelID;
priority = Priority; priority = constrain(Priority, MINPRIORITY, MAXPRIORITY);
numPids = 0; numPids = 0;
AddPid(Pid); AddPid(Pid);
AddPids(Pids1); AddPids(Pids1);
@ -28,7 +28,7 @@ cReceiver::cReceiver(tChannelID ChannelID, int Priority, int Pid, const int *Pid
cReceiver::cReceiver(const cChannel *Channel, int Priority) cReceiver::cReceiver(const cChannel *Channel, int Priority)
{ {
device = NULL; device = NULL;
priority = Priority; priority = constrain(Priority, MINPRIORITY, MAXPRIORITY);
numPids = 0; numPids = 0;
SetPids(Channel); SetPids(Channel);
} }

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: receiver.h 2.4 2012/02/25 12:49:31 kls Exp $ * $Id: receiver.h 2.5 2012/03/01 09:50:24 kls Exp $
*/ */
#ifndef __RECEIVER_H #ifndef __RECEIVER_H
@ -43,15 +43,15 @@ public:
#ifdef LEGACY_CRECEIVER #ifdef LEGACY_CRECEIVER
cReceiver(tChannelID ChannelID, int Priority, int Pid, const int *Pids1 = NULL, const int *Pids2 = NULL, const int *Pids3 = NULL); cReceiver(tChannelID ChannelID, int Priority, int Pid, const int *Pids1 = NULL, const int *Pids2 = NULL, const int *Pids3 = NULL);
#endif #endif
cReceiver(const cChannel *Channel = NULL, int Priority = -1); cReceiver(const cChannel *Channel = NULL, int Priority = MINPRIORITY);
///< Creates a new receiver for the given Channel with the given Priority. ///< Creates a new receiver for the given Channel with the given Priority.
///< If Channel is not NULL, its pids are set by a call to SetPids(). ///< If Channel is not NULL, its pids are set by a call to SetPids().
///< Otherwise pids can be added to the receiver by separate calls to the AddPid[s] ///< Otherwise pids can be added to the receiver by separate calls to the AddPid[s]
///< functions. ///< functions.
///< The total number of PIDs added to a receiver must not exceed MAXRECEIVEPIDS. ///< The total number of PIDs added to a receiver must not exceed MAXRECEIVEPIDS.
///< Priority may be any value in the range +/-MAXPRIORITY. Negative values indicate ///< Priority may be any value in the range MINPRIORITY...MAXPRIORITY. Negative values indicate
///< that this cReceiver may be detached at any time (without blocking the ///< that this cReceiver may be detached at any time in favor of a timer recording
///< cDevice it is attached to). ///< or live viewing (without blocking the cDevice it is attached to).
virtual ~cReceiver(); virtual ~cReceiver();
bool AddPid(int Pid); bool AddPid(int Pid);
///< Adds the given Pid to the list of PIDs of this receiver. ///< Adds the given Pid to the list of PIDs of this receiver.

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: tools.h 2.15 2012/02/18 15:29:50 kls Exp $ * $Id: tools.h 2.16 2012/02/29 10:41:00 kls Exp $
*/ */
#ifndef __TOOLS_H #ifndef __TOOLS_H
@ -57,6 +57,8 @@ template<class T> inline int sgn(T a) { return a < 0 ? -1 : a > 0 ? 1 : 0; }
template<class T> inline void swap(T &a, T &b) { T t = a; a = b; b = t; } template<class T> inline void swap(T &a, T &b) { T t = a; a = b; b = t; }
#endif #endif
template<class T> inline T constrain(T v, T l, T h) { return v < l ? l : v > h ? h : v; }
void syslog_with_tid(int priority, const char *format, ...) __attribute__ ((format (printf, 2, 3))); void syslog_with_tid(int priority, const char *format, ...) __attribute__ ((format (printf, 2, 3)));
#define BCDCHARTOINT(x) (10 * ((x & 0xF0) >> 4) + (x & 0xF)) #define BCDCHARTOINT(x) (10 * ((x & 0xF0) >> 4) + (x & 0xF))

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: transfer.c 2.5 2010/01/30 11:10:25 kls Exp $ * $Id: transfer.c 2.6 2012/02/29 14:16:23 kls Exp $
*/ */
#include "transfer.h" #include "transfer.h"
@ -12,7 +12,7 @@
// --- cTransfer ------------------------------------------------------------- // --- cTransfer -------------------------------------------------------------
cTransfer::cTransfer(const cChannel *Channel) cTransfer::cTransfer(const cChannel *Channel)
:cReceiver(Channel) :cReceiver(Channel, TRANSFERPRIORITY)
{ {
patPmtGenerator.SetChannel(Channel); patPmtGenerator.SetChannel(Channel);
} }