From 69986fd1866232c52735ff27b47f11d5cd71728e Mon Sep 17 00:00:00 2001 From: f4exb Date: Mon, 24 Aug 2015 22:09:46 +0200 Subject: [PATCH] Deep redesign: NFM and WFM: Mutex to prevent concurrent critical updates with feed method --- CMakeLists.txt | 4 ++-- plugins/channel/nfm/nfmdemod.cpp | 14 +++++++++----- plugins/channel/nfm/nfmdemod.h | 2 ++ plugins/channel/wfm/wfmdemod.cpp | 14 +++++++++++--- plugins/channel/wfm/wfmdemod.h | 2 ++ 5 files changed, 26 insertions(+), 10 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 444c6845b..0cc3f1339 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,9 +8,9 @@ list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/Modules) project(sdrangelove) -#set(CMAKE_BUILD_TYPE "Release") +set(CMAKE_BUILD_TYPE "Release") #set(CMAKE_BUILD_TYPE "ReleaseWithDebugInfo") -set(CMAKE_BUILD_TYPE "Debug") +#set(CMAKE_BUILD_TYPE "Debug") set(QT_USE_QTOPENGL TRUE) set(CMAKE_AUTOMOC ON) diff --git a/plugins/channel/nfm/nfmdemod.cpp b/plugins/channel/nfm/nfmdemod.cpp index beac5b4a9..bb25d0ef5 100644 --- a/plugins/channel/nfm/nfmdemod.cpp +++ b/plugins/channel/nfm/nfmdemod.cpp @@ -35,7 +35,8 @@ NFMDemod::NFMDemod() : m_sampleCount(0), m_afSquelch(2, afSqTones), m_squelchOpen(false), - m_audioFifo(4, 48000) + m_audioFifo(4, 48000), + m_settingsMutex(QMutex::Recursive) { setObjectName("NFMDemod"); @@ -109,10 +110,7 @@ void NFMDemod::feed(SampleVector::const_iterator begin, SampleVector::const_iter { Complex ci; - if (m_audioFifo.size() == 0) - { - return; - } + m_settingsMutex.lock(); for (SampleVector::const_iterator it = begin; it != end; ++it) { @@ -257,6 +255,8 @@ void NFMDemod::feed(SampleVector::const_iterator begin, SampleVector::const_iter } m_sampleBuffer.clear(); + + m_settingsMutex.unlock(); } void NFMDemod::start() @@ -322,16 +322,20 @@ void NFMDemod::apply() if((m_config.m_inputSampleRate != m_running.m_inputSampleRate) || (m_config.m_rfBandwidth != m_running.m_rfBandwidth)) { + m_settingsMutex.lock(); m_interpolator.create(16, m_config.m_inputSampleRate, m_config.m_rfBandwidth / 2.2); m_interpolatorDistanceRemain = 0; m_interpolatorDistance = (Real) m_config.m_inputSampleRate / (Real) m_config.m_audioSampleRate; + m_settingsMutex.unlock(); } if((m_config.m_afBandwidth != m_running.m_afBandwidth) || (m_config.m_audioSampleRate != m_running.m_audioSampleRate)) { + m_settingsMutex.lock(); m_lowpass.create(301, m_config.m_audioSampleRate, 250.0); m_bandpass.create(301, m_config.m_audioSampleRate, 300.0, m_config.m_afBandwidth); + m_settingsMutex.unlock(); } if(m_config.m_squelch != m_running.m_squelch) diff --git a/plugins/channel/nfm/nfmdemod.h b/plugins/channel/nfm/nfmdemod.h index 124bda8e9..27c1c7bb7 100644 --- a/plugins/channel/nfm/nfmdemod.h +++ b/plugins/channel/nfm/nfmdemod.h @@ -18,6 +18,7 @@ #ifndef INCLUDE_NFMDEMOD_H #define INCLUDE_NFMDEMOD_H +#include #include #include "dsp/samplesink.h" #include "dsp/nco.h" @@ -156,6 +157,7 @@ private: SampleVector m_sampleBuffer; NFMDemodGUI *m_nfmDemodGUI; + QMutex m_settingsMutex; void apply(); }; diff --git a/plugins/channel/wfm/wfmdemod.cpp b/plugins/channel/wfm/wfmdemod.cpp index ee9801f1f..7e9946dec 100644 --- a/plugins/channel/wfm/wfmdemod.cpp +++ b/plugins/channel/wfm/wfmdemod.cpp @@ -29,7 +29,8 @@ MESSAGE_CLASS_DEFINITION(WFMDemod::MsgConfigureWFMDemod, Message) WFMDemod::WFMDemod(SampleSink* sampleSink) : m_sampleSink(sampleSink), - m_audioFifo(4, 250000) + m_audioFifo(4, 250000), + m_settingsMutex(QMutex::Recursive) { setObjectName("WFMDemod"); @@ -75,8 +76,7 @@ void WFMDemod::feed(SampleVector::const_iterator begin, SampleVector::const_iter int rf_out; Real msq, demod; - if (m_audioFifo.size() <= 0) - return; + m_settingsMutex.lock(); for (SampleVector::const_iterator it = begin; it != end; ++it) { @@ -160,6 +160,8 @@ void WFMDemod::feed(SampleVector::const_iterator begin, SampleVector::const_iter } m_sampleBuffer.clear(); + + m_settingsMutex.unlock(); } void WFMDemod::start() @@ -235,27 +237,33 @@ void WFMDemod::apply() if((m_config.m_inputSampleRate != m_running.m_inputSampleRate) || (m_config.m_afBandwidth != m_running.m_afBandwidth)) { + m_settingsMutex.lock(); qDebug() << "WFMDemod::handleMessage: m_interpolator.create"; m_interpolator.create(16, m_config.m_inputSampleRate, m_config.m_afBandwidth); m_interpolatorDistanceRemain = (Real) m_config.m_inputSampleRate / m_config.m_audioSampleRate; m_interpolatorDistance = (Real) m_config.m_inputSampleRate / (Real) m_config.m_audioSampleRate; + m_settingsMutex.unlock(); } if((m_config.m_inputSampleRate != m_running.m_inputSampleRate) || (m_config.m_rfBandwidth != m_running.m_rfBandwidth) || (m_config.m_inputFrequencyOffset != m_running.m_inputFrequencyOffset)) { + m_settingsMutex.lock(); qDebug() << "WFMDemod::handleMessage: m_rfFilter->create_filter"; Real lowCut = (m_config.m_inputFrequencyOffset - (m_config.m_rfBandwidth / 2.0)) / m_config.m_inputSampleRate; Real hiCut = (m_config.m_inputFrequencyOffset + (m_config.m_rfBandwidth / 2.0)) / m_config.m_inputSampleRate; m_rfFilter->create_filter(lowCut, hiCut); + m_settingsMutex.unlock(); } if((m_config.m_afBandwidth != m_running.m_afBandwidth) || (m_config.m_audioSampleRate != m_running.m_audioSampleRate)) { + m_settingsMutex.lock(); qDebug() << "WFMDemod::handleMessage: m_lowpass.create"; m_lowpass.create(21, m_config.m_audioSampleRate, m_config.m_afBandwidth); + m_settingsMutex.unlock(); } if(m_config.m_squelch != m_running.m_squelch) { diff --git a/plugins/channel/wfm/wfmdemod.h b/plugins/channel/wfm/wfmdemod.h index f639965a3..ee598475f 100644 --- a/plugins/channel/wfm/wfmdemod.h +++ b/plugins/channel/wfm/wfmdemod.h @@ -18,6 +18,7 @@ #ifndef INCLUDE_WFMDEMOD_H #define INCLUDE_WFMDEMOD_H +#include #include #include "dsp/samplesink.h" #include "dsp/nco.h" @@ -127,6 +128,7 @@ private: SampleSink* m_sampleSink; AudioFifo m_audioFifo; SampleVector m_sampleBuffer; + QMutex m_settingsMutex; void apply(); };