/** * \brief This runs the event loop for EITScanner until 'exitThread' is true. */ void EITScanner::run(void) { static const uint sz[] = { 2000, 1800, 1600, 1400, 1200, }; static const float rt[] = { 0.0f, 0.2f, 0.4f, 0.6f, 0.8f, }; lock.lock(); MythTimer t; uint eitCount = 0; while (!exitThread) { lock.unlock(); uint list_size = eitHelper->GetListSize(); float rate = 1.0f; for (uint i = 0; i < 5; i++) { if (list_size >= sz[i]) { rate = rt[i]; break; } } lock.lock(); if (eitSource) eitSource->SetEITRate(rate); lock.unlock(); if (list_size) { eitCount += eitHelper->ProcessEvents(); t.start(); } // Tell the scheduler to run if // we are in passive scan // and there have been updated events since the last scheduler run // but not in the last 60 seconds if (!activeScan && eitCount && (t.elapsed() > 60 * 1000)) { LOG(VB_EIT, LOG_INFO, LOC_ID + QString("Added %1 EIT Events").arg(eitCount)); eitCount = 0; RescheduleRecordings(); } // Is it time to move to the next transport in active scan? if (activeScan && (MythDate::current() > activeScanNextTrig)) { // if there have been any new events, tell scheduler to run. if (eitCount) { LOG(VB_EIT, LOG_INFO, LOC_ID + QString("Added %1 EIT Events").arg(eitCount)); eitCount = 0; RescheduleRecordings(); } if (activeScanNextChan == activeScanChannels.end()) activeScanNextChan = activeScanChannels.begin(); if (!(*activeScanNextChan).isEmpty()) { eitHelper->WriteEITCache(); if (rec->QueueEITChannelChange(*activeScanNextChan)) { eitHelper->SetChannelID(ChannelUtil::GetChanID( rec->GetSourceID(), *activeScanNextChan)); LOG(VB_EIT, LOG_INFO, LOC_ID + QString("Now looking for EIT data on " "multiplex of channel %1") .arg(*activeScanNextChan)); } } activeScanNextTrig = MythDate::current() .addSecs(activeScanTrigTime); ++activeScanNextChan; // 24 hours ago eitHelper->PruneEITCache(activeScanNextTrig.toTime_t() - 86400); } lock.lock(); if ((activeScan || activeScanStopped) && !exitThread) exitThreadCond.wait(&lock, 400); // sleep up to 400 ms. if (!activeScan && !activeScanStopped) { activeScanStopped = true; activeScanCond.wakeAll(); } } if (eitCount) /* some events have been handled since the last schedule request */ { eitCount = 0; RescheduleRecordings(); } activeScanStopped = true; activeScanCond.wakeAll(); lock.unlock(); }
/** \fn EITScanner::RunEventLoop(void) * \brief This runs the event loop for EITScanner until 'exitThread' is true. */ void EITScanner::RunEventLoop(void) { static const uint sz[] = { 2000, 1800, 1600, 1400, 1200, }; static const float rt[] = { 0.0f, 0.2f, 0.4f, 0.6f, 0.8f, }; lock.lock(); exitThread = false; MythTimer t; uint eitCount = 0; while (!exitThread) { lock.unlock(); uint list_size = eitHelper->GetListSize(); float rate = 1.0f; for (uint i = 0; i < 5; i++) { if (list_size >= sz[i]) { rate = rt[i]; break; } } lock.lock(); if (eitSource) eitSource->SetEITRate(rate); lock.unlock(); if (list_size) { eitCount += eitHelper->ProcessEvents(); t.start(); } // If there have been any new events and we haven't // seen any in a while, tell scheduler to run. if (eitCount && (t.elapsed() > 60 * 1000)) { VERBOSE(VB_EIT, LOC_ID + "Added "<<eitCount<<" EIT Events"); eitCount = 0; RescheduleRecordings(); } if (activeScan && (QDateTime::currentDateTime() > activeScanNextTrig)) { // if there have been any new events, tell scheduler to run. if (eitCount) { VERBOSE(VB_EIT, LOC_ID + "Added "<<eitCount<<" EIT Events"); eitCount = 0; RescheduleRecordings(); } if (activeScanNextChan == activeScanChannels.end()) activeScanNextChan = activeScanChannels.begin(); if (!(*activeScanNextChan).isEmpty()) { eitHelper->WriteEITCache(); rec->SetChannel(*activeScanNextChan, TVRec::kFlagEITScan); VERBOSE(VB_EIT, LOC_ID + QString("Now looking for EIT data on " "multiplex of channel %1") .arg(*activeScanNextChan)); } activeScanNextTrig = QDateTime::currentDateTime() .addSecs(activeScanTrigTime); activeScanNextChan++; // 24 hours ago eitHelper->PruneEITCache(activeScanNextTrig.toTime_t() - 86400); } lock.lock(); if (!exitThread) exitThreadCond.wait(&lock, 400); // sleep up to 400 ms. } lock.unlock(); }