From ad233cbb04a699f2cdedfd4ecf60afed370bf363 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Sat, 31 Oct 2015 13:35:13 -0400 Subject: [PATCH] Use single mutex lock instead of atomic arrays for gain --- src/sdr/SoapySDRThread.cpp | 17 ++++++++++++----- src/sdr/SoapySDRThread.h | 6 ++++-- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/sdr/SoapySDRThread.cpp b/src/sdr/SoapySDRThread.cpp index a775042..a8b5084 100644 --- a/src/sdr/SoapySDRThread.cpp +++ b/src/sdr/SoapySDRThread.cpp @@ -204,12 +204,14 @@ void SDRThread::readLoop() { if (gain_value_changed.load() && !agc_mode.load()) { SDRDeviceInfo *devInfo = deviceInfo.load(); - for (std::map::iterator gci = gainChanged.begin(); gci != gainChanged.end(); gci++) { - if (gci->second.load()) { + gain_busy.lock(); + for (std::map::iterator gci = gainChanged.begin(); gci != gainChanged.end(); gci++) { + if (gci->second) { device->setGain(SOAPY_SDR_RX, devInfo->getRxChannel()->getChannel(), gci->first, gainValues[gci->first]); gainChanged[gci->first] = false; } } + gain_busy.unlock(); gain_value_changed.store(false); } @@ -373,11 +375,16 @@ bool SDRThread::getAGCMode() { } void SDRThread::setGain(std::string name, float value) { - gainValues[name].store(value); - gainChanged[name].store(true); + gain_busy.lock(); + gainValues[name] = value; + gainChanged[name] = true; gain_value_changed.store(true); + gain_busy.unlock(); } float SDRThread::getGain(std::string name) { - return gainValues[name].load(); + gain_busy.lock(); + float val = gainValues[name]; + gain_busy.unlock(); + return val; } diff --git a/src/sdr/SoapySDRThread.h b/src/sdr/SoapySDRThread.h index e573d05..1a199de 100644 --- a/src/sdr/SoapySDRThread.h +++ b/src/sdr/SoapySDRThread.h @@ -98,6 +98,8 @@ protected: std::atomic_bool hasPPM, hasHardwareDC, hasDirectSampling, hasIQSwap; std::atomic_bool iq_swap, agc_mode, rate_changed, freq_changed, offset_changed, ppm_changed, direct_sampling_changed, device_changed, iq_swap_changed, agc_mode_changed, gain_value_changed; - std::map > gainValues; - std::map gainChanged; + + std::mutex gain_busy; + std::map gainValues; + std::map gainChanged; };