diff --git a/CONTRIBUTORS b/CONTRIBUTORS index 6ec0e79f..9e50e9e7 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -1763,6 +1763,7 @@ Christian Wieninger for his idea of going directly into the "Edit timer" menu for a timer created from the "Schedule" menu in case it starts withing the next two minutes for reporting a problem with a format string in recording.c on 64bit systems + for reporting a problem with the device selection in case of timer conflicts Thiemo Gehrke for suggesting to add a setup option to turn off the automatic timeout of the diff --git a/HISTORY b/HISTORY index f5493822..a995aba4 100644 --- a/HISTORY +++ b/HISTORY @@ -4736,3 +4736,5 @@ Video Disk Recorder Revision History - Fixed handling VPS timers in case the EPG event hasn't been 'seen' in a while. - Fixed calculating the cache size in cUnbufferedFile::Read() (thanks to Artur Skawina). - Removed -fPIC from VDR's and libsi's Makefile (suggested by Prakash Punnoor). +- Modifed the device selection to better handle timer conflicts (reported by + Christian Wieninger). diff --git a/device.c b/device.c index 14b88178..3fddd84f 100644 --- a/device.c +++ b/device.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: device.c 1.128 2006/04/14 14:34:43 kls Exp $ + * $Id: device.c 1.129 2006/05/27 09:43:37 kls Exp $ */ #include "device.h" @@ -281,32 +281,20 @@ cDevice *cDevice::GetDevice(int Index) cDevice *cDevice::GetDevice(const cChannel *Channel, int Priority, bool *NeedsDetachReceivers) { cDevice *d = NULL; - int select = INT_MAX; - + uint Impact = 0xFFFFFFFF; for (int i = 0; i < numDevices; i++) { bool ndr; if (device[i]->ProvidesChannel(Channel, Priority, &ndr)) { // this device is basicly able to do the job - int pri; - if (device[i]->Receiving() && !ndr) - pri = 0; // receiving and allows additional receivers - else if (!device[i]->Receiving(true) && d && device[i]->ProvidesCa(Channel) < d->ProvidesCa(Channel)) - pri = 1; // free and fewer Ca's - else if (!device[i]->Receiving() && !device[i]->HasDecoder()) - pri = 2; // free and not a full featured card - else if (!device[i]->Receiving() && device[i] != ActualDevice()) - pri = 3; // free and not the actual device - else if (!device[i]->Receiving() && !device[i]->IsPrimaryDevice()) - pri = 4; // free and not the primary device - else if (!device[i]->Receiving()) - pri = 5; // free - else if (d && device[i]->Priority() < d->Priority()) - pri = 6; // receiving but priority is lower - else if (d && device[i]->Priority() == d->Priority() && device[i]->ProvidesCa(Channel) < d->ProvidesCa(Channel)) - pri = 7; // receiving with same priority but fewer Ca's - else - pri = 8; // all others - if (pri <= select) { - select = pri; + uint imp = 0; + imp <<= 1; imp |= !device[i]->Receiving() || ndr; + imp <<= 1; imp |= device[i]->Receiving(); + imp <<= 1; imp |= device[i] == ActualDevice(); + imp <<= 1; imp |= device[i]->IsPrimaryDevice(); + imp <<= 1; imp |= device[i]->HasDecoder(); + imp <<= 8; imp |= min(max(device[i]->Priority() + MAXPRIORITY, 0), 0xFF); + imp <<= 8; imp |= min(max(device[i]->ProvidesCa(Channel), 0), 0xFF); + if (imp < Impact) { + Impact = imp; d = device[i]; if (NeedsDetachReceivers) *NeedsDetachReceivers = ndr; diff --git a/receiver.h b/receiver.h index 959f6d61..e1234997 100644 --- a/receiver.h +++ b/receiver.h @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: receiver.h 1.3 2005/01/16 14:05:10 kls Exp $ + * $Id: receiver.h 1.4 2006/05/27 09:04:22 kls Exp $ */ #ifndef __RECEIVER_H @@ -44,7 +44,7 @@ public: ///< Pids1...Pids3 are pointers to zero terminated lists of PIDs. ///< If any of these PIDs are 0, they will be silently ignored. ///< The total number of non-zero PIDs must not exceed MAXRECEIVEPIDS. - ///< Priority may be any value in the range 0..99. Negative values indicate + ///< 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). virtual ~cReceiver();