summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--HISTORY1
-rw-r--r--ci.c11
-rw-r--r--ci.h4
-rw-r--r--device.c6
-rw-r--r--device.h20
-rw-r--r--dvbdevice.c22
6 files changed, 43 insertions, 21 deletions
diff --git a/HISTORY b/HISTORY
index 5c38a542..1763de2f 100644
--- a/HISTORY
+++ b/HISTORY
@@ -4126,3 +4126,4 @@ Video Disk Recorder Revision History
Andreas Böttger).
- The file 'ca.conf' is obsolete and has been removed.
- Revised all descriptions regarding CICAM.
+- Adapted c(Dvb)Device::ProvidesCa() to the dynamic CA handling.
diff --git a/ci.c b/ci.c
index f2c4240f..863be533 100644
--- a/ci.c
+++ b/ci.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: ci.c 1.41 2005/12/30 15:41:38 kls Exp $
+ * $Id: ci.c 1.42 2006/01/07 15:07:16 kls Exp $
*/
#include "ci.h"
@@ -1639,6 +1639,15 @@ int cCiHandler::CloseAllSessions(int Slot)
return result;
}
+int cCiHandler::NumCams(void)
+{
+ int result = 0;
+ for (int i = 0; i < MAX_CI_SLOT; i++)
+ if (moduleReady[i])
+ result++;
+ return result;
+}
+
bool cCiHandler::Ready(void)
{
cMutexLock MutexLock(&mutex);
diff --git a/ci.h b/ci.h
index 7790701d..3817a89b 100644
--- a/ci.h
+++ b/ci.h
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: ci.h 1.20 2005/12/03 11:59:05 kls Exp $
+ * $Id: ci.h 1.21 2006/01/07 15:03:05 kls Exp $
*/
#ifndef __CI_H
@@ -127,6 +127,8 @@ public:
///< Creates a new cCiHandler for the given CA device.
int NumSlots(void) { return numSlots; }
///< Returns the number of CAM slots provided by this CA device.
+ int NumCams(void);
+ ///< Returns the number of actual CAMs inserted into this CA device.
bool Ready(void);
///< Returns true if all CAMs in this CA device are ready.
bool Process(int Slot = -1);
diff --git a/device.c b/device.c
index 829cd5b1..cd896a21 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.118 2006/01/07 14:09:17 kls Exp $
+ * $Id: device.c 1.119 2006/01/07 14:50:45 kls Exp $
*/
#include "device.h"
@@ -302,7 +302,7 @@ cDevice *cDevice::GetDevice(const cChannel *Channel, int Priority, bool *NeedsDe
pri = 6; // receiving with same priority but fewer Ca's
else
pri = 7; // all others
- if (pri < select) {
+ if (pri <= select) {
select = pri;
d = device[i];
if (NeedsDetachReceivers)
@@ -1147,7 +1147,7 @@ int cDevice::ProvidesCa(const cChannel *Channel) const
int Ca = Channel->Ca();
if (Ca == CardIndex() + 1)
return 1; // exactly _this_ card was requested
- if (Ca && Ca <= MAXDEVICES)
+ if (Ca && Ca <= CA_DVB_MAX)
return 0; // a specific card was requested, but not _this_ one
return !Ca; // by default every card can provide FTA
}
diff --git a/device.h b/device.h
index 327a707e..6e1df435 100644
--- a/device.h
+++ b/device.h
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: device.h 1.68 2006/01/06 13:20:25 kls Exp $
+ * $Id: device.h 1.69 2006/01/07 14:50:45 kls Exp $
*/
#ifndef __DEVICE_H
@@ -170,14 +170,16 @@ public:
///< Returns the card index of this device (0 ... MAXDEVICES - 1).
int DeviceNumber(void) const;
///< Returns the number of this device (0 ... MAXDEVICES - 1).
- virtual int ProvidesCa(const cChannel *Channel) const;//XXX PLUGINS.html!!!
- //XXX describe changed functionality!!!
- ///< Checks whether this device provides the given value in its
- ///< caCaps. Returns 0 if the value is not provided, 1 if only this
- ///< value is provided, and > 1 if this and other values are provided.
- ///< If the given value is equal to the number of this device,
- ///< 1 is returned. If it is 0 (FTA), 1 plus the number of other values
- ///< in caCaps is returned.
+ virtual int ProvidesCa(const cChannel *Channel) const;
+ ///< Checks whether this device provides the conditional access
+ ///< facilities to decrypt the given Channel.
+ ///< Returns 0 if the Channel can't be decrypted, 1 if this is a
+ ///< Free To Air channel or only exactly this device can decrypt it,
+ ///< and > 1 if this device can decrypt the Channel.
+ ///< If the result is greater than 1 and the device has more than one
+ ///< CAM, the value will be increased by the number of CAMs, which
+ ///< allows to select the device with the smallest number of CAMs
+ ///< in order to preserve resources for other recordings.
virtual bool HasDecoder(void) const;
///< Tells whether this device has an MPEG decoder.
diff --git a/dvbdevice.c b/dvbdevice.c
index 52c52cea..7fa39cce 100644
--- a/dvbdevice.c
+++ b/dvbdevice.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: dvbdevice.c 1.148 2006/01/07 14:05:59 kls Exp $
+ * $Id: dvbdevice.c 1.149 2006/01/07 15:15:01 kls Exp $
*/
#include "dvbdevice.h"
@@ -503,13 +503,21 @@ bool cDvbDevice::Ready(void)
int cDvbDevice::ProvidesCa(const cChannel *Channel) const
{
- if (Channel->Ca() >= CA_ENCRYPTED_MIN && ciHandler) {
- unsigned short ids[MAXCAIDS + 1];
- for (int i = 0; i <= MAXCAIDS; i++) // '<=' copies the terminating 0!
- ids[i] = Channel->Ca(i);
- return ciHandler->ProvidesCa(ids);
+ int NumCams = 0;
+ if (ciHandler) {
+ NumCams = ciHandler->NumCams();
+ if (Channel->Ca() >= CA_ENCRYPTED_MIN) {
+ unsigned short ids[MAXCAIDS + 1];
+ for (int i = 0; i <= MAXCAIDS; i++) // '<=' copies the terminating 0!
+ ids[i] = Channel->Ca(i);
+ if (ciHandler->ProvidesCa(ids))
+ return NumCams + 1;
+ }
}
- return cDevice::ProvidesCa(Channel);
+ int result = cDevice::ProvidesCa(Channel);
+ if (result > 0)
+ result += NumCams;
+ return result;
}
cSpuDecoder *cDvbDevice::GetSpuDecoder(void)