mirror of
https://github.com/vdr-projects/vdr.git
synced 2025-12-27 07:11:05 +01:00
Implemented support for MTD
This commit is contained in:
86
device.c
86
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 4.7 2017/02/21 13:38:01 kls Exp $
|
||||
* $Id: device.c 4.8 2017/03/18 15:45:53 kls Exp $
|
||||
*/
|
||||
|
||||
#include "device.h"
|
||||
@@ -281,8 +281,13 @@ cDevice *cDevice::GetDevice(const cChannel *Channel, int Priority, bool LiveView
|
||||
continue; // CAM slot can't be used with this device
|
||||
bool ndr;
|
||||
if (device[i]->ProvidesChannel(Channel, Priority, &ndr)) { // this device is basically able to do the job
|
||||
if (NumUsableSlots && !HasInternalCam && device[i]->CamSlot() && device[i]->CamSlot() != CamSlots.Get(j))
|
||||
ndr = true; // using a different CAM slot requires detaching receivers
|
||||
if (NumUsableSlots && !HasInternalCam) {
|
||||
if (cCamSlot *csi = device[i]->CamSlot()) {
|
||||
cCamSlot *csj = CamSlots.Get(j);
|
||||
if ((csj->MtdActive() ? csi->MasterSlot() : csi) != csj)
|
||||
ndr = true; // using a different CAM slot requires detaching receivers
|
||||
}
|
||||
}
|
||||
// Put together an integer number that reflects the "impact" using
|
||||
// this device would have on the overall system. Each condition is represented
|
||||
// by one bit in the number (or several bits, if the condition is actually
|
||||
@@ -319,12 +324,75 @@ cDevice *cDevice::GetDevice(const cChannel *Channel, int Priority, bool LiveView
|
||||
if (NeedsDetachReceivers)
|
||||
d->DetachAllReceivers();
|
||||
if (s) {
|
||||
if (s->Device() != d) {
|
||||
if (s->Device())
|
||||
s->Device()->DetachAllReceivers();
|
||||
if (d->CamSlot())
|
||||
d->CamSlot()->Assign(NULL);
|
||||
s->Assign(d);
|
||||
// Some of the following statements could probably be combined, but let's keep them
|
||||
// explicit so we can clearly see every single aspect of the decisions made here.
|
||||
if (d->CamSlot()) {
|
||||
if (s->MtdActive()) {
|
||||
if (s == d->CamSlot()->MasterSlot()) {
|
||||
// device d already has a proper CAM slot, so nothing to do here
|
||||
}
|
||||
else {
|
||||
// device d has a CAM slot, but it's not the right one
|
||||
d->CamSlot()->Assign(NULL);
|
||||
s = s->MtdSpawn();
|
||||
s->Assign(d);
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (s->Device()) {
|
||||
if (s->Device() != d) {
|
||||
// CAM slot s is currently assigned to a different device than d
|
||||
if (Priority > s->Priority()) {
|
||||
s->Device()->DetachAllReceivers();
|
||||
d->CamSlot()->Assign(NULL);
|
||||
s->Assign(d);
|
||||
}
|
||||
else {
|
||||
d = NULL;
|
||||
s = NULL;
|
||||
}
|
||||
}
|
||||
else {
|
||||
// device d already has a proper CAM slot, so nothing to do here
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (s != d->CamSlot()) {
|
||||
// device d has a CAM slot, but it's not the right one
|
||||
d->CamSlot()->Assign(NULL);
|
||||
s->Assign(d);
|
||||
}
|
||||
else {
|
||||
// device d already has a proper CAM slot, so nothing to do here
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
// device d has no CAM slot, ...
|
||||
if (s->MtdActive()) {
|
||||
// ... so we assign s with MTD support
|
||||
s = s->MtdSpawn();
|
||||
s->Assign(d);
|
||||
}
|
||||
else {
|
||||
// CAM slot s has no MTD support ...
|
||||
if (s->Device()) {
|
||||
// ... but it is assigned to a different device, so we reassign it to d
|
||||
if (Priority > s->Priority()) {
|
||||
s->Device()->DetachAllReceivers();
|
||||
s->Assign(d);
|
||||
}
|
||||
else {
|
||||
d = NULL;
|
||||
s = NULL;
|
||||
}
|
||||
}
|
||||
else {
|
||||
// ... and is not assigned to any device, so we just assign it to d
|
||||
s->Assign(d);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (d->CamSlot() && !d->CamSlot()->IsDecrypting())
|
||||
|
||||
Reference in New Issue
Block a user