From 35f73199d4a8ecc82479ebc6a3f5ba4f9cd28f75 Mon Sep 17 00:00:00 2001 From: Klaus Schmidinger Date: Mon, 12 Jan 2015 10:44:58 +0100 Subject: [PATCH] Fixed resetting the receiver for EMM pids for CAMs that need to receive the TS (cont'd) --- ci.c | 9 +++++++-- receiver.h | 3 ++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/ci.c b/ci.c index fc50071e..73618fb5 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 3.14 2015/01/09 09:41:20 kls Exp $ + * $Id: ci.c 3.15 2015/01/12 10:44:58 kls Exp $ */ #include "ci.h" @@ -123,7 +123,7 @@ public: virtual ~cCaPidReceiver() { Detach(); } virtual void Receive(uchar *Data, int Length); bool HasCaPids(void) { return NumPids() - emmPids.Size() - 1 > 0; } - void Reset(void) { DelEmmPids(); } + void Reset(void) { DelEmmPids(); catVersion = -1; } }; cCaPidReceiver::cCaPidReceiver(void) @@ -163,6 +163,9 @@ void cCaPidReceiver::Receive(uchar *Data, int Length) if (v != catVersion) { if (Data[11] == 0 && Data[12] == 0) { // section number, last section number if (l <= TS_SIZE - 8) { + cDevice *AttachedDevice = Device(); + if (AttachedDevice) + AttachedDevice->Detach(this); DelEmmPids(); for (int i = 13; i < l + 8 - 4; i++) { // +8 = header, -4 = checksum if (Data[i] == 0x09) { @@ -179,6 +182,8 @@ void cCaPidReceiver::Receive(uchar *Data, int Length) i += Data[i + 1] - 1; // -1 to compensate for the loop increment } } + if (AttachedDevice) + AttachedDevice->AttachReceiver(this); } else dsyslog("multi packet CAT section - unhandled!"); diff --git a/receiver.h b/receiver.h index 8d6fee66..1623f595 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 3.1 2014/01/01 11:45:09 kls Exp $ + * $Id: receiver.h 3.2 2015/01/12 10:24:20 kls Exp $ */ #ifndef __RECEIVER_H @@ -24,6 +24,7 @@ private: int numPids; bool WantsPid(int Pid); protected: + cDevice *Device(void) { return device; } void Detach(void); virtual void Activate(bool On) {} ///< This function is called just before the cReceiver gets attached to