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:
parent
2c4da57287
commit
3c9a408d43
5
HISTORY
5
HISTORY
@ -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!
|
||||||
|
18
dvbdevice.c
18
dvbdevice.c
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user