void SDRPostThread::run() { #ifdef __APPLE__ pthread_t tID = pthread_self(); // ID of this thread int priority = sched_get_priority_max( SCHED_FIFO); sched_param prio = {priority}; // scheduling priority of thread pthread_setschedparam(tID, SCHED_FIFO, &prio); #endif std::cout << "SDR post-processing thread started.." << std::endl; iqDataInQueue = (SDRThreadIQDataQueue*)getInputQueue("IQDataInput"); iqDataOutQueue = (DemodulatorThreadInputQueue*)getOutputQueue("IQDataOutput"); iqVisualQueue = (DemodulatorThreadInputQueue*)getOutputQueue("IQVisualDataOutput"); iqActiveDemodVisualQueue = (DemodulatorThreadInputQueue*)getOutputQueue("IQActiveDemodVisualDataOutput"); iqDataInQueue->set_max_num_items(0); while (!terminated) { SDRThreadIQData *data_in; iqDataInQueue->pop(data_in); // std::lock_guard < std::mutex > lock(data_in->m_mutex); busy_demod.lock(); if (data_in && data_in->data.size()) { if(data_in->numChannels > 1) { runPFBCH(data_in); } else { runSingleCH(data_in); } } data_in->decRefCount(); bool doUpdate = false; for (size_t j = 0; j < nRunDemods; j++) { DemodulatorInstance *demod = runDemods[j]; if (abs(frequency - demod->getFrequency()) > (sampleRate / 2)) { doUpdate = true; } } if (doUpdate) { updateActiveDemodulators(); } busy_demod.unlock(); } if (iqVisualQueue && !iqVisualQueue->empty()) { DemodulatorThreadIQData *visualDataDummy; iqVisualQueue->pop(visualDataDummy); } // buffers.purge(); // visualDataBuffers.purge(); std::cout << "SDR post-processing thread done." << std::endl; }
void SDRPostThread::run() { #ifdef __APPLE__ pthread_t tID = pthread_self(); // ID of this thread int priority = sched_get_priority_max( SCHED_FIFO); sched_param prio = {priority}; // scheduling priority of thread pthread_setschedparam(tID, SCHED_FIFO, &prio); #endif // std::cout << "SDR post-processing thread started.." << std::endl; iqDataInQueue = static_cast<SDRThreadIQDataQueue*>(getInputQueue("IQDataInput")); iqDataOutQueue = static_cast<DemodulatorThreadInputQueue*>(getOutputQueue("IQDataOutput")); iqVisualQueue = static_cast<DemodulatorThreadInputQueue*>(getOutputQueue("IQVisualDataOutput")); iqActiveDemodVisualQueue = static_cast<DemodulatorThreadInputQueue*>(getOutputQueue("IQActiveDemodVisualDataOutput")); while (!stopping) { SDRThreadIQData *data_in; iqDataInQueue->pop(data_in); // std::lock_guard < std::mutex > lock(data_in->m_mutex); std::lock_guard < std::mutex > lock(busy_demod); if (data_in && data_in->data.size()) { if(data_in->numChannels > 1) { runPFBCH(data_in); } else { runSingleCH(data_in); } } if (data_in) { data_in->decRefCount(); } bool doUpdate = false; for (size_t j = 0; j < nRunDemods; j++) { DemodulatorInstance *demod = runDemods[j]; if (abs(frequency - demod->getFrequency()) > (sampleRate / 2)) { doUpdate = true; } } //Only update the list of demodulators here if (doUpdate) { updateActiveDemodulators(); } } //end while //Be safe, remove as many elements as possible DemodulatorThreadIQData *visualDataDummy; while (iqVisualQueue && iqVisualQueue->try_pop(visualDataDummy)) { visualDataDummy->decRefCount(); } // buffers.purge(); // visualDataBuffers.purge(); // std::cout << "SDR post-processing thread done." << std::endl; }