/** \fn SignalMonitor::Start() * \brief Start signal monitoring thread. */ void SignalMonitor::Start(bool waitfor_tune) { DBG_SM("Start", "begin"); { QMutexLocker locker(&startStopLock); // When used for scanning, don't wait for the tuning thread is_tuned = !waitfor_tune; if (waitfor_tune) { m_channelTimeout = 40000; // 40 seconds (in milliseconds) m_channelTimer.start(); } if (!running) { int rval = pthread_create( &monitor_thread, NULL, SpawnMonitorLoop, this); if (0 != rval) { VERBOSE(VB_IMPORTANT, "Failed to create signal monitor thread"); return; } } while (!running) usleep(50); } DBG_SM("Start", "end"); }
/** \fn SignalMonitor::Start() * \brief Start signal monitoring thread. */ void SignalMonitor::Start() { DBG_SM("Start", "begin"); { QMutexLocker locker(&startStopLock); exit = false; start(); while (!running) startStopWait.wait(locker.mutex()); } DBG_SM("Start", "end"); }
/** \fn SignalMonitor::Stop() * \brief Stop signal monitoring thread. */ void SignalMonitor::Stop() { DBG_SM("Stop", "begin"); { QMutexLocker locker(&startStopLock); if (running) { exit = true; pthread_join(monitor_thread, NULL); } } DBG_SM("Stop", "end"); }
/** \fn SignalMonitor::Stop() * \brief Stop signal monitoring thread. */ void SignalMonitor::Stop() { DBG_SM("Stop", "begin"); { QMutexLocker locker(&startStopLock); if (running) { exit = true; wait(); } } DBG_SM("Stop", "end"); }
/** \fn SignalMonitor::Start() * \brief Start signal monitoring thread. */ void SignalMonitor::Start() { DBG_SM("Start", "begin"); { QMutexLocker locker(&startStopLock); start(); while (!running) usleep(5000); } DBG_SM("Start", "end"); }
/** \fn IPTVSignalMonitor::Stop(void) * \brief Stop signal monitoring and table monitoring threads. */ void IPTVSignalMonitor::Stop(void) { DBG_SM("Stop", "begin"); GetChannel()->GetFeeder()->RemoveListener(this); SignalMonitor::Stop(); if (tableMonitorThread) { GetChannel()->GetFeeder()->Stop(); dtvMonitorRunning = false; tableMonitorThread->wait(); delete tableMonitorThread; tableMonitorThread = NULL; } DBG_SM("Stop", "end"); }
/** \fn IPTVSignalMonitor::RunTableMonitor(void) */ void IPTVSignalMonitor::RunTableMonitor(void) { DBG_SM("Run", "begin"); dtvMonitorRunning = true; GetStreamData()->AddListeningPID(0); GetChannel()->GetFeeder()->AddListener(this); GetChannel()->GetFeeder()->Run(); GetChannel()->GetFeeder()->RemoveListener(this); while (dtvMonitorRunning) usleep(10000); DBG_SM("Run", "end"); }
/** \fn IPTVSignalMonitor::UpdateValues(void) * \brief Fills in frontend stats and emits status Qt signals. * * This is automatically called by run(), after Start() * has been used to start the signal monitoring thread. */ void IPTVSignalMonitor::UpdateValues(void) { if (!running || exit) return; if (dtvMonitorRunning) { EmitStatus(); if (IsAllGood()) SendMessageAllGood(); // TODO dtv signals... update_done = true; return; } bool isLocked = false; { QMutexLocker locker(&statusLock); isLocked = signalLock.IsGood(); } EmitStatus(); if (IsAllGood()) SendMessageAllGood(); // Start table monitoring if we are waiting on any table // and we have a lock. if (isLocked && GetStreamData() && HasAnyFlag(kDTVSigMon_WaitForPAT | kDTVSigMon_WaitForPMT | kDTVSigMon_WaitForMGT | kDTVSigMon_WaitForVCT | kDTVSigMon_WaitForNIT | kDTVSigMon_WaitForSDT)) { tableMonitorThread = new IPTVTableMonitorThread(this); DBG_SM("UpdateValues", "Waiting for table monitor to start"); while (!dtvMonitorRunning) usleep(5000); DBG_SM("UpdateValues", "Table monitor started"); } update_done = true; }
void SignalMonitor::RemoveFlags(uint64_t _flags) { DBG_SM("RemoveFlags", sm_flags_to_string(_flags)); flags &= ~_flags; }
void SignalMonitor::AddFlags(uint64_t _flags) { DBG_SM("AddFlags", sm_flags_to_string(_flags)); flags |= _flags; }