1 | From 4d9594d56ad423782a320352baf548562641337d Mon Sep 17 00:00:00 2001 |
---|
2 | From: Sascha Hinck <SHinck@web.de> |
---|
3 | Date: Sun, 26 Aug 2012 01:23:24 +0200 |
---|
4 | Subject: [PATCH] libmythtv: Stop EIT-Active scan during recording |
---|
5 | |
---|
6 | During recording and Live-TV EIT-Active scan will be stopped on all |
---|
7 | Capture-Cards. Active-Scan-IdleTimer will be restarted after the last |
---|
8 | recording exited. |
---|
9 | --- |
---|
10 | mythtv/libs/libmythtv/eitscanner.cpp | 4 ++ |
---|
11 | mythtv/libs/libmythtv/tv_rec.cpp | 92 +++++++++++++++++++++++++- |
---|
12 | mythtv/libs/libmythtv/tv_rec.h | 3 + |
---|
13 | mythtv/programs/mythbackend/main_helpers.cpp | 4 +- |
---|
14 | 4 files changed, 100 insertions(+), 3 deletions(-) |
---|
15 | |
---|
16 | diff --git a/mythtv/libs/libmythtv/eitscanner.cpp b/mythtv/libs/libmythtv/eitscanner.cpp |
---|
17 | index 0c2a70e..8063899 100644 |
---|
18 | --- a/mythtv/libs/libmythtv/eitscanner.cpp |
---|
19 | +++ b/mythtv/libs/libmythtv/eitscanner.cpp |
---|
20 | @@ -226,6 +226,8 @@ void EITScanner::StopPassiveScan(void) |
---|
21 | |
---|
22 | eitHelper->WriteEITCache(); |
---|
23 | eitHelper->SetSourceID(0); |
---|
24 | + |
---|
25 | + LOG(VB_EIT, LOG_INFO, LOC_ID + "Stopped passive scan."); |
---|
26 | } |
---|
27 | |
---|
28 | void EITScanner::StartActiveScan(TVRec *_rec, uint max_seconds_per_source) |
---|
29 | @@ -302,4 +304,6 @@ void EITScanner::StopActiveScan(void) |
---|
30 | activeScanCond.wait(&lock, 100); |
---|
31 | |
---|
32 | rec = NULL; |
---|
33 | + |
---|
34 | + LOG(VB_EIT, LOG_INFO, LOC_ID + "Stopped active scan."); |
---|
35 | } |
---|
36 | diff --git a/mythtv/libs/libmythtv/tv_rec.cpp b/mythtv/libs/libmythtv/tv_rec.cpp |
---|
37 | index 5387ce5..7063660 100644 |
---|
38 | --- a/mythtv/libs/libmythtv/tv_rec.cpp |
---|
39 | +++ b/mythtv/libs/libmythtv/tv_rec.cpp |
---|
40 | @@ -36,6 +36,7 @@ |
---|
41 | #include "tv_rec.h" |
---|
42 | #include "mythdate.h" |
---|
43 | #include "osd.h" |
---|
44 | +#include "cardutil.h" |
---|
45 | |
---|
46 | #define DEBUG_CHANNEL_PREFIX 0 /**< set to 1 to channel prefixing */ |
---|
47 | |
---|
48 | @@ -988,6 +989,10 @@ void TVRec::HandleStateChange(void) |
---|
49 | |
---|
50 | bool changed = false; |
---|
51 | |
---|
52 | + LOG(VB_GENERAL, LOG_INFO, LOC + "GetCardIDs to stop EITscan"); |
---|
53 | + vector<uint> cardids = CardUtil::GetCardIDs("","DVB",""); |
---|
54 | + uint no_cards = cardids.size(); |
---|
55 | + |
---|
56 | QString transMsg = QString(" %1 to %2") |
---|
57 | .arg(StateToString(nextState)) |
---|
58 | .arg(StateToString(desiredNextState)); |
---|
59 | @@ -1012,11 +1017,46 @@ void TVRec::HandleStateChange(void) |
---|
60 | if (TRANSITION(kState_None, kState_WatchingLiveTV)) |
---|
61 | { |
---|
62 | tuningRequests.enqueue(TuningRequest(kFlagLiveTV)); |
---|
63 | + for (uint i = 0; i < no_cards; i++) |
---|
64 | + { |
---|
65 | + if (cardids[i] != cardid) |
---|
66 | + { |
---|
67 | + TVRec *rec = GetTVRec(cardids[i]); |
---|
68 | + if (rec && !rec->HasFlags(kFlagEITScanPaused)) |
---|
69 | + rec->SetFlags(kFlagEITScanPaused); |
---|
70 | + } |
---|
71 | + } |
---|
72 | SET_NEXT(); |
---|
73 | } |
---|
74 | else if (TRANSITION(kState_WatchingLiveTV, kState_None)) |
---|
75 | { |
---|
76 | tuningRequests.enqueue(TuningRequest(kFlagKillRec|kFlagKillRingBuffer)); |
---|
77 | + eitScanStartTime = QDateTime::currentDateTime(); |
---|
78 | + uint j = 0; |
---|
79 | + TVRec *arec = NULL; |
---|
80 | + for (uint i = 0; i < no_cards; i++) |
---|
81 | + { |
---|
82 | + if (cardids[i] != cardid) |
---|
83 | + { |
---|
84 | + TVRec *rec = GetTVRec(cardids[i]); |
---|
85 | + if (!HasFlags(kFlagEITScanPaused)) |
---|
86 | + { |
---|
87 | + if (rec && rec->HasFlags(kFlagEITScanPaused)) |
---|
88 | + { |
---|
89 | + rec->eitScanStartTime = eitScanStartTime.addSecs( |
---|
90 | + eitCrawlIdleStart + eit_start_rand(cardids[i], eitTransportTimeout)); |
---|
91 | + rec->ClearFlags(kFlagEITScanPaused); |
---|
92 | + LOG(VB_IDLE, LOG_INFO, LOC + "Start EIT-ActiveScanIdle-Timer for " + |
---|
93 | + QString("cardid %1, next start time: ").arg(cardids[i]) + |
---|
94 | + rec->eitScanStartTime.toString(Qt::ISODate)); |
---|
95 | + } |
---|
96 | + } |
---|
97 | + else if (rec && rec->GetState() != kState_None) |
---|
98 | + arec = rec; j++; |
---|
99 | + } |
---|
100 | + } |
---|
101 | + if (j == 1) |
---|
102 | + arec->ClearFlags(kFlagEITScanPaused); |
---|
103 | SET_NEXT(); |
---|
104 | } |
---|
105 | else if (TRANSITION(kState_WatchingLiveTV, kState_RecordingOnly)) |
---|
106 | @@ -1029,6 +1069,15 @@ void TVRec::HandleStateChange(void) |
---|
107 | { |
---|
108 | SetPseudoLiveTVRecording(NULL); |
---|
109 | tuningRequests.enqueue(TuningRequest(kFlagRecording, curRecording)); |
---|
110 | + for (uint i = 0; i < no_cards; i++) |
---|
111 | + { |
---|
112 | + if (cardids[i] != cardid) |
---|
113 | + { |
---|
114 | + TVRec *rec = GetTVRec(cardids[i]); |
---|
115 | + if (rec && !rec->HasFlags(kFlagEITScanPaused)) |
---|
116 | + rec->SetFlags(kFlagEITScanPaused); |
---|
117 | + } |
---|
118 | + } |
---|
119 | SET_NEXT(); |
---|
120 | } |
---|
121 | else if (TRANSITION(kState_RecordingOnly, kState_None)) |
---|
122 | @@ -1036,6 +1085,32 @@ void TVRec::HandleStateChange(void) |
---|
123 | tuningRequests.enqueue( |
---|
124 | TuningRequest(kFlagCloseRec|kFlagKillRingBuffer| |
---|
125 | (GetFlags()&kFlagKillRec))); |
---|
126 | + eitScanStartTime = QDateTime::currentDateTime(); |
---|
127 | + uint j = 0; |
---|
128 | + TVRec *arec = NULL; |
---|
129 | + for (uint i = 0; i < no_cards; i++) |
---|
130 | + { |
---|
131 | + if (cardids[i] != cardid) |
---|
132 | + { |
---|
133 | + TVRec *rec = GetTVRec(cardids[i]); |
---|
134 | + if (!HasFlags(kFlagEITScanPaused)) |
---|
135 | + { |
---|
136 | + if (rec && rec->HasFlags(kFlagEITScanPaused)) |
---|
137 | + { |
---|
138 | + rec->eitScanStartTime = eitScanStartTime.addSecs( |
---|
139 | + eitCrawlIdleStart + eit_start_rand(cardids[i], eitTransportTimeout)); |
---|
140 | + rec->ClearFlags(kFlagEITScanPaused); |
---|
141 | + LOG(VB_IDLE, LOG_INFO, LOC + "Start EIT-ActiveScanIdle-Timer for " + |
---|
142 | + QString("cardid %1, next start time: ").arg(cardids[i]) + |
---|
143 | + rec->eitScanStartTime.toString(Qt::ISODate)); |
---|
144 | + } |
---|
145 | + } |
---|
146 | + else if (rec && rec->GetState() != kState_None) |
---|
147 | + arec = rec; j++; |
---|
148 | + } |
---|
149 | + } |
---|
150 | + if (j == 1) |
---|
151 | + arec->ClearFlags(kFlagEITScanPaused); |
---|
152 | SET_NEXT(); |
---|
153 | } |
---|
154 | |
---|
155 | @@ -1147,6 +1222,9 @@ void TVRec::CloseChannel(void) |
---|
156 | CardUtil::IsV4L(genOpt.cardtype))) |
---|
157 | { |
---|
158 | channel->Close(); |
---|
159 | + LOG(VB_GENERAL, LOG_INFO, LOC + QString("Close Card %1") |
---|
160 | + .arg(CardUtil::ProbeDVBFrontendName(CardUtil::GetVideoDevice(cardid))) ); |
---|
161 | +// GetDeviceLabel(cardid)) |
---|
162 | } |
---|
163 | } |
---|
164 | |
---|
165 | @@ -1391,7 +1469,8 @@ void TVRec::run(void) |
---|
166 | } |
---|
167 | |
---|
168 | if (scanner && channel && |
---|
169 | - MythDate::current() > eitScanStartTime) |
---|
170 | + MythDate::current() > eitScanStartTime && |
---|
171 | + !HasFlags(kFlagEITScanPaused)) |
---|
172 | { |
---|
173 | if (!dvbOpt.dvb_eitscan) |
---|
174 | { |
---|
175 | @@ -1413,6 +1492,15 @@ void TVRec::run(void) |
---|
176 | } |
---|
177 | } |
---|
178 | |
---|
179 | + //Stop EIT-Scanning if recording begins on another card, |
---|
180 | + if (scanner && HasFlags(kFlagEITScanPaused) && |
---|
181 | + HasFlags(kFlagEITScannerRunning)) |
---|
182 | + { |
---|
183 | + scanner->StopActiveScan(); |
---|
184 | + ClearFlags(kFlagEITScannerRunning); |
---|
185 | + TuningShutdowns(TuningRequest(kFlagNoRec)); |
---|
186 | + } |
---|
187 | + |
---|
188 | // We should be no more than a few thousand milliseconds, |
---|
189 | // as the end recording code does not have a trigger... |
---|
190 | // NOTE: If you change anything here, make sure that |
---|
191 | @@ -4272,6 +4360,8 @@ QString TVRec::FlagToString(uint f) |
---|
192 | msg += "Errored,"; |
---|
193 | if (kFlagCancelNextRecording & f) |
---|
194 | msg += "CancelNextRecording,"; |
---|
195 | + if (kFlagEITScanPaused & f) |
---|
196 | + msg += "EITScanPaused,"; |
---|
197 | |
---|
198 | // Tuning flags |
---|
199 | if ((kFlagRec & f) == kFlagRec) |
---|
200 | diff --git a/mythtv/libs/libmythtv/tv_rec.h b/mythtv/libs/libmythtv/tv_rec.h |
---|
201 | index 664b712..f93ab80 100644 |
---|
202 | --- a/mythtv/libs/libmythtv/tv_rec.h |
---|
203 | +++ b/mythtv/libs/libmythtv/tv_rec.h |
---|
204 | @@ -156,6 +156,8 @@ class MTV_PUBLIC TVRec : public SignalMonitorListener, public QRunnable |
---|
205 | void FinishRecording(void) { SetFlags(kFlagFinishRecording); } |
---|
206 | /// \brief Tells TVRec that the frontend's TV class is ready for messages. |
---|
207 | void FrontendReady(void) { SetFlags(kFlagFrontendReady); } |
---|
208 | + void PauseEITActiveScan(void) { SetFlags(kFlagEITScanPaused); } |
---|
209 | + void RestartEITActiveScan(void) { ClearFlags(kFlagEITScanPaused); } |
---|
210 | void CancelNextRecording(bool cancel); |
---|
211 | ProgramInfo *GetRecording(void); |
---|
212 | |
---|
213 | @@ -411,6 +413,7 @@ class MTV_PUBLIC TVRec : public SignalMonitorListener, public QRunnable |
---|
214 | static const uint kFlagFinishRecording = 0x00000008; |
---|
215 | static const uint kFlagErrored = 0x00000010; |
---|
216 | static const uint kFlagCancelNextRecording = 0x00000020; |
---|
217 | + static const uint kFlagEITScanPaused = 0x00000040; |
---|
218 | |
---|
219 | // Tuning flags |
---|
220 | /// final result desired is LiveTV recording |
---|
221 | diff --git a/mythtv/programs/mythbackend/main_helpers.cpp b/mythtv/programs/mythbackend/main_helpers.cpp |
---|
222 | index bc9d698..d2a8b8e 100644 |
---|
223 | --- a/mythtv/programs/mythbackend/main_helpers.cpp |
---|
224 | +++ b/mythtv/programs/mythbackend/main_helpers.cpp |
---|
225 | @@ -195,8 +195,8 @@ bool setupTVs(bool ismaster, bool &error) |
---|
226 | } |
---|
227 | else |
---|
228 | { |
---|
229 | - LOG(VB_GENERAL, LOG_ERR, "Problem with capture cards" + |
---|
230 | - cidmsg + "failed init"); |
---|
231 | + LOG(VB_GENERAL, LOG_ERR, "Problem with capture cards - " + |
---|
232 | + cidmsg + " failed init"); |
---|
233 | delete tv; |
---|
234 | } |
---|
235 | } |
---|