From 59d0cf2db78ecd561d7f7edee6f8e9e725aa655a Mon Sep 17 00:00:00 2001
From: Sascha Hinck <SHinck@web.de>
Date: Sat, 18 Aug 2012 16:30:53 +0200
Subject: [PATCH] No use of CAM-Module and decrypting at EIT-Scan or not encrypted channels

SignalMonitor or Recorder initializes CAM-Module and sends CA_PMT for all
channels and programs, not only encrypted. They also do so for grabbing
EIT-Data with EIT-Scans. So all the time every few minutes during EIT-Scan
if channels change CAM is stopped and restarted (shows also up in syslog).
This fixes the behaviour. The CAM is only initialized and CA_PMT is sent if
a stream or program is encrypted and we want to record or look live-TV.
---
 mythtv/libs/libmythtv/dtvsignalmonitor.cpp |   10 ++++++++++
 mythtv/libs/libmythtv/dtvsignalmonitor.h   |    2 ++
 mythtv/libs/libmythtv/dvbchannel.cpp       |    6 +++---
 mythtv/libs/libmythtv/dvbrecorder.cpp      |    3 ++-
 mythtv/libs/libmythtv/dvbsignalmonitor.cpp |    4 ++--
 5 files changed, 19 insertions(+), 6 deletions(-)

diff --git a/mythtv/libs/libmythtv/dtvsignalmonitor.cpp b/mythtv/libs/libmythtv/dtvsignalmonitor.cpp
index 7ed61f3..63148c0 100644
--- a/mythtv/libs/libmythtv/dtvsignalmonitor.cpp
+++ b/mythtv/libs/libmythtv/dtvsignalmonitor.cpp
@@ -370,7 +370,12 @@ void DTVSignalMonitor::HandlePMT(uint, const ProgramMapTable *pmt)
     {
         if (pmt->IsEncrypted(GetDTVChannel()->GetSIStandard()) &&
             !ignore_encrypted)
+        {
+            DVBChannel *dvbchannel = GetDVBChannel();
+            if (dvbchannel)
+                dvbchannel->SetPMT(pmt);
             AddFlags(kDTVSigMon_WaitForCrypt);
+        }
 
         AddFlags(kDTVSigMon_PMTMatch);
     }
@@ -534,6 +539,11 @@ const ScanStreamData *DTVSignalMonitor::GetScanStreamData() const
     return dynamic_cast<const ScanStreamData*>(stream_data);
 }
 
+DVBChannel *DTVSignalMonitor::GetDVBChannel(void)
+{
+    return dynamic_cast<DVBChannel*>(channel);
+}
+
 bool DTVSignalMonitor::IsAllGood(void) const
 {
     QMutexLocker locker(&statusLock);
diff --git a/mythtv/libs/libmythtv/dtvsignalmonitor.h b/mythtv/libs/libmythtv/dtvsignalmonitor.h
index 0d14b7f..2be4302 100644
--- a/mythtv/libs/libmythtv/dtvsignalmonitor.h
+++ b/mythtv/libs/libmythtv/dtvsignalmonitor.h
@@ -11,6 +11,7 @@ using namespace std;
 #include "streamlisteners.h"
 
 class DTVChannel;
+class DVBChannel;
 
 class DTVSignalMonitor : public SignalMonitor,
                          public MPEGStreamListener,
@@ -103,6 +104,7 @@ class DTVSignalMonitor : public SignalMonitor,
 
   protected:
     DTVChannel *GetDTVChannel(void);
+    DVBChannel *GetDVBChannel(void);
     void UpdateMonitorValues(void);
     void UpdateListeningForEIT(void);
 
diff --git a/mythtv/libs/libmythtv/dvbchannel.cpp b/mythtv/libs/libmythtv/dvbchannel.cpp
index 5f25854..ef51851 100644
--- a/mythtv/libs/libmythtv/dvbchannel.cpp
+++ b/mythtv/libs/libmythtv/dvbchannel.cpp
@@ -272,8 +272,6 @@ bool DVBChannel::Open(DVBChannel *who)
             diseqc_tree->Open(fd_frontend);
     }
 
-    dvbcam->Start();
-
     first_tune = true;
 
     if (!InitializeInputs())
@@ -464,7 +462,7 @@ bool DVBChannel::CheckCodeRate(DTVCodeRate rate) const
 }
 
 /**
- *  \brief Return true iff modulation is supported modulation on the frontend
+ *  \brief Return true if modulation is supported modulation on the frontend
  */
 bool DVBChannel::CheckModulation(DTVModulation modulation) const
 {
@@ -491,6 +489,8 @@ bool DVBChannel::CheckModulation(DTVModulation modulation) const
  */
 void DVBChannel::SetPMT(const ProgramMapTable *pmt)
 {
+    if (!dvbcam->IsRunning())
+        dvbcam->Start();
     if (pmt && dvbcam->IsRunning())
         dvbcam->SetPMT(this, pmt);
 }
diff --git a/mythtv/libs/libmythtv/dvbrecorder.cpp b/mythtv/libs/libmythtv/dvbrecorder.cpp
index c1b66d5..8677071 100644
--- a/mythtv/libs/libmythtv/dvbrecorder.cpp
+++ b/mythtv/libs/libmythtv/dvbrecorder.cpp
@@ -179,7 +179,8 @@ QString DVBRecorder::GetSIStandard(void) const
 
 void DVBRecorder::SetCAMPMT(const ProgramMapTable *pmt)
 {
-    _channel->SetPMT(pmt);
+    if (pmt->IsEncrypted(_channel->GetSIStandard()))
+        _channel->SetPMT(pmt);
 }
 
 void DVBRecorder::UpdateCAMTimeOffset(void)
diff --git a/mythtv/libs/libmythtv/dvbsignalmonitor.cpp b/mythtv/libs/libmythtv/dvbsignalmonitor.cpp
index 1fa010e..db91fbe 100644
--- a/mythtv/libs/libmythtv/dvbsignalmonitor.cpp
+++ b/mythtv/libs/libmythtv/dvbsignalmonitor.cpp
@@ -17,7 +17,6 @@
 #include "cardutil.h"
 
 #include "dvbtypes.h"
-#include "dvbchannel.h"
 #include "dvbrecorder.h"
 #include "dvbstreamhandler.h"
 
@@ -171,12 +170,13 @@ void DVBSignalMonitor::HandlePMT(uint program_num, const ProgramMapTable *pmt)
 {
     DTVSignalMonitor::HandlePMT(program_num, pmt);
 
-    if (pmt->ProgramNumber() == (uint)programNumber)
+/*    if (pmt->ProgramNumber() == (uint)programNumber)
     {
         DVBChannel *dvbchannel = GetDVBChannel();
         if (dvbchannel)
             dvbchannel->SetPMT(pmt);
     }
+*/
 }
 
 void DVBSignalMonitor::HandleSTT(const SystemTimeTable *stt)
