Ticket #1945: dvbdevtree_signalmonitor.patch
File dvbdevtree_signalmonitor.patch, 6.0 KB (added by , 19 years ago) |
---|
-
libs/libmythtv/dvbsignalmonitor.h
10 10 11 11 typedef QMap<uint,int> FilterMap; 12 12 13 #define RETUNE_TIMEOUT 5000 14 13 15 class DVBSignalMonitor: public DTVSignalMonitor 14 16 { 15 17 Q_OBJECT … … 30 32 void StatusSignalToNoise(const SignalMonitorValue&); 31 33 void StatusBitErrorRate(const SignalMonitorValue&); 32 34 void StatusUncorrectedBlocks(const SignalMonitorValue&); 35 void StatusRotorPosition(const SignalMonitorValue&); 33 36 34 37 protected: 35 38 DVBSignalMonitor(void); … … 38 41 virtual void UpdateValues(void); 39 42 void EmitDVBSignals(void); 40 43 44 void RetuneMonitor(void); 41 45 static void *TableMonitorThread(void *param); 42 46 void RunTableMonitor(void); 43 47 void RunTableMonitorTS(void); … … 52 56 SignalMonitorValue signalToNoise; 53 57 SignalMonitorValue bitErrorRate; 54 58 SignalMonitorValue uncorrectedBlocks; 59 SignalMonitorValue rotorPosition; 55 60 56 61 bool useSectionReader; 57 62 bool dtvMonitorRunning; 58 63 pthread_t table_monitor_thread; 59 64 60 65 FilterMap filters; ///< PID filters for table monitoring 66 67 bool is_rotor_done; 61 68 }; 62 69 63 70 #endif // DVBSIGNALMONITOR_H -
libs/libmythtv/signalmonitor.h
55 55 kDVBSigMon_WaitForSNR = 0x01000000, 56 56 kDVBSigMon_WaitForBER = 0x02000000, 57 57 kDVBSigMon_WaitForUB = 0x04000000, 58 kDVBSigMon_WaitForPos = 0x08000000, ///< Wait for rotor 58 59 }; 59 60 60 61 inline QString sm_flags_to_string(uint); -
libs/libmythtv/dvbsignalmonitor.cpp
19 19 20 20 #include "dvbchannel.h" 21 21 #include "dvbrecorder.h" 22 #include "dvbdevtree.h" 22 23 23 24 #undef DBG_SM 24 25 #define DBG_SM(FUNC, MSG) VERBOSE(VB_CHANNEL, \ … … 54 55 65535, false, 0, 65535, 0), 55 56 uncorrectedBlocks(tr("Uncorrected Blocks"), "ucb", 56 57 65535, false, 0, 65535, 0), 58 rotorPosition (tr("Rotor Progress"), "pos", 59 100, true, 0, 100, 0), 57 60 useSectionReader(false), 58 dtvMonitorRunning(false) 61 dtvMonitorRunning(false), 62 is_rotor_done(true) 59 63 { 60 64 // These two values should probably come from the database... 61 65 int wait = 3000; // timeout when waiting on signal … … 151 155 list<<bitErrorRate.GetName()<<bitErrorRate.GetStatus(); 152 156 if (HasFlags(kDVBSigMon_WaitForUB)) 153 157 list<<uncorrectedBlocks.GetName()<<uncorrectedBlocks.GetStatus(); 158 if (HasFlags(kDVBSigMon_WaitForPos)) 159 list<<rotorPosition.GetName()<<rotorPosition.GetStatus(); 154 160 statusLock.unlock(); 155 161 return list; 156 162 } … … 332 338 FD_SET (dvr_fd, &fd_select_set); 333 339 while (dtvMonitorRunning && GetStreamData()) 334 340 { 341 RetuneMonitor(); 335 342 UpdateFiltersFromStreamData(); 336 343 337 344 // timeout gets reset by select, so we need to create new one … … 391 398 392 399 while (dtvMonitorRunning && GetStreamData()) 393 400 { 401 RetuneMonitor(); 394 402 UpdateFiltersFromStreamData(); 395 403 396 404 bool readSomething = false; … … 479 487 return supports_ts; 480 488 } 481 489 490 void DVBSignalMonitor::RetuneMonitor(void) 491 { 492 DVBChannel* dvbchan = dynamic_cast<DVBChannel*>(channel); 493 int fd_frontend = dvbchan->GetFd(); 494 495 // Get lock status 496 bool is_locked = true; 497 fe_status_t status; 498 if(ioctl(fd_frontend, FE_READ_STATUS, &status) != -1) 499 { 500 is_locked = (status & FE_HAS_LOCK); 501 signalLock.SetValue(is_locked ? 1 : 0); 502 } 503 504 // Rotor position 505 const DVBDevRotor* rotor = dvbchan->GetRotor(); 506 if(rotor) 507 { 508 if(rotor->IsPositionKnown()) 509 { 510 double progress = rotor->Progress(); 511 if(progress >= 1.0 && !is_rotor_done) 512 { 513 DBG_SM("UpdateValues", "Retuning for rotor completion"); 514 dvbchan->Retune(); 515 is_rotor_done = true; 516 } 517 else if(progress < 1.0) 518 { 519 if(is_rotor_done) 520 DBG_SM("UpdateValues", "Rotor is moving"); 521 is_rotor_done = false; 522 } 523 524 if (HasFlags(kDVBSigMon_WaitForPos)) 525 rotorPosition.SetValue((int)(progress * 100)); 526 } 527 } 528 else if (HasFlags(kDVBSigMon_WaitForPos)) 529 rotorPosition.SetValue(100); 530 531 // Periodically retune if card can't recover 532 if(!dvbchan->CanRecover() && !is_locked && 533 dvbchan->ElapsedSinceTune() > RETUNE_TIMEOUT) 534 { 535 DBG_SM("UpdateValues", "Retuning for lock loss"); 536 dvbchan->Retune(); 537 } 538 } 539 482 540 void DVBSignalMonitor::RunTableMonitor(void) 483 541 { 484 542 dtvMonitorRunning = true; … … 515 573 return; 516 574 } 517 575 576 RetuneMonitor(); 577 518 578 bool wasLocked = false, isLocked = false; 519 579 // We use uint16_t for sig & snr because this is correct for DVB API 4.0, 520 580 // and works better than the correct int16_t for the 3.x API … … 569 629 // Start table monitoring if we are waiting on any table 570 630 // and we have a lock. 571 631 if (isLocked && GetStreamData() && 632 (!HasFlags(kDVBSigMon_WaitForPos) || rotorPosition.IsGood()) && 572 633 HasAnyFlag(kDTVSigMon_WaitForPAT | kDTVSigMon_WaitForPMT | 573 634 kDTVSigMon_WaitForMGT | kDTVSigMon_WaitForVCT | 574 635 kDTVSigMon_WaitForNIT | kDTVSigMon_WaitForSDT)) … … 605 666 EMIT(StatusBitErrorRate, bitErrorRate); 606 667 if (HasFlags(kDVBSigMon_WaitForUB)) 607 668 EMIT(StatusUncorrectedBlocks, uncorrectedBlocks); 669 if (HasFlags(kDVBSigMon_WaitForPos)) 670 EMIT(StatusRotorPosition, rotorPosition); 608 671 } 609 672 610 673 #undef EMIT