1
0
mirror of https://github.com/VDR4Arch/vdr.git synced 2023-10-10 13:36:52 +02:00

Simultaneous recording and replay of encrypted channels with a single DVB card

This commit is contained in:
Klaus Schmidinger 2003-04-19 14:46:58 +02:00
parent 2c4da57287
commit 3c9a408d43
2 changed files with 15 additions and 8 deletions

View File

@ -2043,3 +2043,8 @@ Video Disk Recorder Revision History
by that CAM. by that CAM.
- Re-enabled CAM communication during replay and on non-Ca channels. This requires - Re-enabled CAM communication during replay and on non-Ca channels. This requires
a DVB driver with firmware version 2613 or later. a DVB driver with firmware version 2613 or later.
- It is now possible to do simultaneous recording and replay with a single DVB
card, even with encrypted channels. This requires the use of the Link Layer
firmware, version 2613 or higher; the -icam firmware is still limited to live
encrypted channels only. Finally we have time shift for encrypted channels on
single card systems!

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 1.53 2003/04/19 10:29:09 kls Exp $ * $Id: dvbdevice.c 1.54 2003/04/19 14:24:25 kls Exp $
*/ */
#include "dvbdevice.h" #include "dvbdevice.h"
@ -116,13 +116,14 @@ bool cDvbTuner::IsTunedTo(const cChannel *Channel) const
void cDvbTuner::Set(const cChannel *Channel, bool Tune) void cDvbTuner::Set(const cChannel *Channel, bool Tune)
{ {
cMutexLock MutexLock(&mutex); cMutexLock MutexLock(&mutex);
channel = *Channel; bool CaChange = !(Channel->GetChannelID() == channel.GetChannelID());
if (Tune) if (Tune)
tunerStatus = tsSet; tunerStatus = tsSet;
else if (tunerStatus == tsCam) else if (tunerStatus == tsCam && CaChange)
tunerStatus = tsTuned; tunerStatus = tsTuned;
if (Channel->Ca()) if (Channel->Ca() && CaChange)
startTime = time(NULL); startTime = time(NULL);
channel = *Channel;
newSet.Broadcast(); newSet.Broadcast();
} }
@ -590,7 +591,8 @@ bool cDvbDevice::ProvidesChannel(const cChannel *Channel, int Priority, bool *Ne
if (!HasPid(Channel->Vpid())) { if (!HasPid(Channel->Vpid())) {
#ifdef DO_MULTIPLE_RECORDINGS #ifdef DO_MULTIPLE_RECORDINGS
if (Channel->Ca() > CACONFBASE) if (Channel->Ca() > CACONFBASE)
needsDetachReceivers = true; needsDetachReceivers = !ciHandler // only LL-firmware can do non-live CA channels
|| Ca() != Channel->Ca();
else if (!IsPrimaryDevice()) else if (!IsPrimaryDevice())
result = true; result = true;
#ifdef DO_REC_AND_PLAY_ON_PRIMARY_DEVICE #ifdef DO_REC_AND_PLAY_ON_PRIMARY_DEVICE
@ -611,7 +613,7 @@ bool cDvbDevice::ProvidesChannel(const cChannel *Channel, int Priority, bool *Ne
bool cDvbDevice::SetChannelDevice(const cChannel *Channel, bool LiveView) bool cDvbDevice::SetChannelDevice(const cChannel *Channel, bool LiveView)
{ {
bool IsEncrypted = Channel->Ca() > CACONFBASE; bool IsEncrypted = Channel->Ca() > CACONFBASE && !ciHandler; // only LL-firmware can do non-live CA channels
bool DoTune = !dvbTuner->IsTunedTo(Channel); bool DoTune = !dvbTuner->IsTunedTo(Channel);
@ -716,7 +718,7 @@ int cDvbDevice::NumAudioTracksDevice(void) const
int n = 0; int n = 0;
if (aPid1) if (aPid1)
n++; n++;
if (Ca() <= MAXDEVICES && aPid2 && aPid1 != aPid2) // a Ca recording session blocks switching live audio tracks if (Ca() <= MAXDEVICES && aPid2 && aPid1 != aPid2) // a CA recording session blocks switching live audio tracks
n++; n++;
return n; return n;
} }
@ -748,7 +750,7 @@ bool cDvbDevice::CanReplay(void) const
if (Receiving()) if (Receiving())
return false; return false;
#endif #endif
return cDevice::CanReplay() && Ca() <= MAXDEVICES; // we can only replay if there is no Ca recording going on return cDevice::CanReplay() && (Ca() <= MAXDEVICES || ciHandler); // with non-LL-firmware we can only replay if there is no CA recording going on
} }
bool cDvbDevice::SetPlayMode(ePlayMode PlayMode) bool cDvbDevice::SetPlayMode(ePlayMode PlayMode)