Ticket #11018: 20201230-trac11018.patch
File 20201230-trac11018.patch, 7.9 KB (added by , 3 years ago) |
---|
-
mythtv/libs/libmythtv/tv_rec.cpp
diff --git a/mythtv/libs/libmythtv/tv_rec.cpp b/mythtv/libs/libmythtv/tv_rec.cpp index 9c538f6a1e..b27b815cdb 100644
a b void TVRec::FinishedRecording(RecordingInfo *curRec, RecordingQuality *recq) 998 998 * to the kState_None state, as this is used to shutdown TV in RunTV. 999 999 * 1000 1000 */ 1001 1001 1002 void TVRec::HandleStateChange(void) 1002 1003 { 1003 1004 TVState nextState = m_internalState; … … void TVRec::HandleStateChange(void) 1030 1031 if (TRANSITION(kState_None, kState_WatchingLiveTV)) 1031 1032 { 1032 1033 m_tuningRequests.enqueue(TuningRequest(kFlagLiveTV)); 1034 SetEITScanPaused(); // KdW test -- #11018 1033 1035 SET_NEXT(); 1034 1036 } 1035 1037 else if (TRANSITION(kState_WatchingLiveTV, kState_None)) 1036 1038 { 1037 1039 m_tuningRequests.enqueue(TuningRequest(kFlagKillRec|kFlagKillRingBuffer)); 1040 ClearEITScanPaused(); // KdW test -- #11018 1038 1041 SET_NEXT(); 1039 1042 } 1040 1043 else if (TRANSITION(kState_WatchingLiveTV, kState_RecordingOnly)) 1041 1044 { 1042 1045 SetPseudoLiveTVRecording(nullptr); 1043 1046 SetEITScanPaused(); // KdW test -- #11018 1044 1047 SET_NEXT(); 1045 1048 } 1046 1049 else if (TRANSITION(kState_None, kState_RecordingOnly)) 1047 1050 { 1048 1051 SetPseudoLiveTVRecording(nullptr); 1049 1052 m_tuningRequests.enqueue(TuningRequest(kFlagRecording, m_curRecording)); 1053 SetEITScanPaused(); // KdW test -- #11018 1050 1054 SET_NEXT(); 1051 1055 } 1052 1056 else if (TRANSITION(kState_RecordingOnly, kState_None)) … … void TVRec::HandleStateChange(void) 1054 1058 m_tuningRequests.enqueue( 1055 1059 TuningRequest(kFlagCloseRec|kFlagKillRingBuffer| 1056 1060 (GetFlags()&kFlagKillRec))); 1061 ClearEITScanPaused(); // KdW test -- #11018 1057 1062 SET_NEXT(); 1058 1063 } 1059 1064 … … void TVRec::CloseChannel(void) 1174 1179 CardUtil::IsV4L(m_genOpt.m_inputType))) 1175 1180 { 1176 1181 m_channel->Close(); 1182 1183 // KdW test -- #11018 1184 LOG(VB_GENERAL, LOG_INFO, LOC + QString("#11018 Close Card %1") 1185 .arg(CardUtil::ProbeDVBFrontendName(CardUtil::GetVideoDevice(m_inputId)))); 1177 1186 } 1178 1187 } 1179 1188 … … static int eit_start_rand(uint inputId, int eitTransportTimeout) 1265 1274 return timeout; 1266 1275 } 1267 1276 1277 // ============================================================================ 1278 1279 // KdW test -- #11018 1280 QMutex TVRec::s_eitInputsLock; 1281 std::vector<uint> TVRec::s_eitInputs; 1282 1283 // Add EIT scanning input to list 1284 // 1285 void TVRec::AddEITScanInput(void) 1286 { 1287 QMutexLocker eitLock(&s_eitInputsLock); 1288 s_eitInputs.push_back(m_inputId); 1289 for (auto id : std::as_const(s_eitInputs)) 1290 { 1291 LOG(VB_GENERAL, LOG_INFO, QString("KdW added %1 s_eitInputs:%2").arg(m_inputId).arg(id)); 1292 } 1293 } 1294 1295 // Pause active EIT scanning on all other inputs 1296 // 1297 void TVRec::SetEITScanPaused(void) 1298 { 1299 QMutexLocker eitLock(&s_eitInputsLock); 1300 for (auto id : std::as_const(s_eitInputs)) 1301 { 1302 if (id != m_inputId) 1303 { 1304 TVRec *rec = GetTVRec(id); 1305 if (rec && !rec->HasFlags(kFlagEITScanPaused)) 1306 { 1307 rec->SetFlags(kFlagEITScanPaused, __FILE__, __LINE__); 1308 } 1309 } 1310 } 1311 } 1312 1313 // Resume active EIT scanning on all other inputs 1314 // 1315 void TVRec::ClearEITScanPaused(void) 1316 { 1317 m_eitScanStartTime = QDateTime::currentDateTime(); 1318 TVRec *arec = nullptr; 1319 QMutexLocker eitLock(&s_eitInputsLock); 1320 for (auto id : std::as_const(s_eitInputs)) 1321 { 1322 if (id != m_inputId) 1323 { 1324 TVRec *rec = GetTVRec(id); 1325 if (!HasFlags(kFlagEITScanPaused)) 1326 { 1327 if (rec && rec->HasFlags(kFlagEITScanPaused)) 1328 { 1329 rec->m_eitScanStartTime = m_eitScanStartTime.addSecs( 1330 m_eitCrawlIdleStart + eit_start_rand(id, m_eitTransportTimeout)); 1331 rec->ClearFlags(kFlagEITScanPaused, __FILE__, __LINE__); 1332 LOG(VB_IDLE, LOG_INFO, LOC + "Start EIT-ActiveScan idle-timer for " + 1333 QString("input %1, next start time: ").arg(id) + 1334 rec->m_eitScanStartTime.toString(Qt::ISODate)); 1335 } 1336 } 1337 else if (rec && rec->GetState() != kState_None) 1338 { 1339 arec = rec; 1340 } 1341 } 1342 } 1343 if (arec) 1344 { 1345 arec->ClearFlags(kFlagEITScanPaused, __FILE__, __LINE__); 1346 } 1347 } 1348 // ============================================================================ 1349 1268 1350 /// \brief Event handling method, contains event loop. 1269 1351 void TVRec::run(void) 1270 1352 { … … void TVRec::run(void) 1282 1364 m_scanner = new EITScanner(m_inputId); 1283 1365 m_eitScanStartTime = m_eitScanStartTime.addSecs( 1284 1366 m_eitCrawlIdleStart + eit_start_rand(m_inputId, m_eitTransportTimeout)); 1367 1368 AddEITScanInput(); // KdW test -- #11018 1285 1369 } 1286 1370 else 1287 1371 { … … void TVRec::run(void) 1425 1509 ClearFlags(kFlagExitPlayer, __FILE__, __LINE__); 1426 1510 } 1427 1511 1512 // if (m_scanner && m_channel && 1513 // MythDate::current() > m_eitScanStartTime) 1428 1514 if (m_scanner && m_channel && 1429 MythDate::current() > m_eitScanStartTime) 1515 MythDate::current() > m_eitScanStartTime && 1516 !HasFlags(kFlagEITScanPaused)) // KdW test -- #11018 1430 1517 { 1431 1518 if (!m_dvbOpt.m_dvbEitScan) 1432 1519 { … … void TVRec::run(void) 1462 1549 else 1463 1550 { 1464 1551 LOG(VB_EIT, LOG_INFO, LOC + QString( 1465 "Postponing EIT scan on input [%1]"1552 "Postponing EIT scan on input %1 " 1466 1553 "because input %2 is busy") 1467 1554 .arg(m_inputId).arg(busy_input.m_inputId)); 1468 1555 m_eitScanStartTime = m_eitScanStartTime.addSecs(300); … … void TVRec::run(void) 1471 1558 } 1472 1559 } 1473 1560 1561 // KdW test -- #11018 1562 // Stop EIT-Scanning if pause requested 1563 if (m_scanner && HasFlags(kFlagEITScanPaused) && 1564 HasFlags(kFlagEITScannerRunning)) 1565 { 1566 m_scanner->StopActiveScan(); 1567 ClearFlags(kFlagEITScannerRunning, __FILE__, __LINE__); 1568 TuningShutdowns(TuningRequest(kFlagNoRec)); 1569 } 1570 1474 1571 // We should be no more than a few thousand milliseconds, 1475 1572 // as the end recording code does not have a trigger... 1476 1573 // NOTE: If you change anything here, make sure that … … QString TVRec::FlagToString(uint f) 4454 4551 msg += "Errored,"; 4455 4552 if (kFlagCancelNextRecording & f) 4456 4553 msg += "CancelNextRecording,"; 4554 if (kFlagEITScanPaused & f) // KdW test -- #11018 4555 msg += "EITScanPaused,"; 4457 4556 4458 4557 // Tuning flags 4459 4558 if ((kFlagRec & f) == kFlagRec) -
mythtv/libs/libmythtv/tv_rec.h
diff --git a/mythtv/libs/libmythtv/tv_rec.h b/mythtv/libs/libmythtv/tv_rec.h index 0c0a5def09..71bace40b0 100644
a b class MTV_PUBLIC TVRec : public SignalMonitorListener, public QRunnable 436 436 static const uint kFlagFinishRecording = 0x00000008; 437 437 static const uint kFlagErrored = 0x00000010; 438 438 static const uint kFlagCancelNextRecording = 0x00000020; 439 static const uint kFlagEITScanPaused = 0x00000040; // KdW test - #11018 439 440 440 441 // Tuning flags 441 442 /// final result desired is LiveTV recording … … class MTV_PUBLIC TVRec : public SignalMonitorListener, public QRunnable 475 476 // Tuning state 476 477 static const uint kFlagRingBufferReady = 0x40000000; 477 478 static const uint kFlagDetect = 0x80000000; 479 480 // KdW test -- #11018 481 public: 482 static QMutex s_eitInputsLock; 483 static std::vector<uint> s_eitInputs; 484 void AddEITScanInput(void); 485 void SetEITScanPaused(void); 486 void ClearEITScanPaused(void); 487 478 488 }; 479 489 480 490 #endif