Use single mutex lock instead of atomic arrays for gain

This commit is contained in:
Charles J. Cliffe 2015-10-31 13:35:13 -04:00
parent 058709b8a8
commit ad233cbb04
2 changed files with 16 additions and 7 deletions

View File

@ -204,12 +204,14 @@ void SDRThread::readLoop() {
if (gain_value_changed.load() && !agc_mode.load()) { if (gain_value_changed.load() && !agc_mode.load()) {
SDRDeviceInfo *devInfo = deviceInfo.load(); SDRDeviceInfo *devInfo = deviceInfo.load();
for (std::map<std::string,std::atomic_bool>::iterator gci = gainChanged.begin(); gci != gainChanged.end(); gci++) { gain_busy.lock();
if (gci->second.load()) { for (std::map<std::string,bool>::iterator gci = gainChanged.begin(); gci != gainChanged.end(); gci++) {
if (gci->second) {
device->setGain(SOAPY_SDR_RX, devInfo->getRxChannel()->getChannel(), gci->first, gainValues[gci->first]); device->setGain(SOAPY_SDR_RX, devInfo->getRxChannel()->getChannel(), gci->first, gainValues[gci->first]);
gainChanged[gci->first] = false; gainChanged[gci->first] = false;
} }
} }
gain_busy.unlock();
gain_value_changed.store(false); gain_value_changed.store(false);
} }
@ -373,11 +375,16 @@ bool SDRThread::getAGCMode() {
} }
void SDRThread::setGain(std::string name, float value) { void SDRThread::setGain(std::string name, float value) {
gainValues[name].store(value); gain_busy.lock();
gainChanged[name].store(true); gainValues[name] = value;
gainChanged[name] = true;
gain_value_changed.store(true); gain_value_changed.store(true);
gain_busy.unlock();
} }
float SDRThread::getGain(std::string name) { float SDRThread::getGain(std::string name) {
return gainValues[name].load(); gain_busy.lock();
float val = gainValues[name];
gain_busy.unlock();
return val;
} }

View File

@ -98,6 +98,8 @@ protected:
std::atomic_bool hasPPM, hasHardwareDC, hasDirectSampling, hasIQSwap; std::atomic_bool hasPPM, hasHardwareDC, hasDirectSampling, hasIQSwap;
std::atomic_bool iq_swap, agc_mode, rate_changed, freq_changed, offset_changed, 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; ppm_changed, direct_sampling_changed, device_changed, iq_swap_changed, agc_mode_changed, gain_value_changed;
std::map<std::string,std::atomic<float> > gainValues;
std::map<std::string,std::atomic_bool> gainChanged; std::mutex gain_busy;
std::map<std::string, float> gainValues;
std::map<std::string, bool> gainChanged;
}; };