From 2a9eadbf9af5ad244644858a1a753734de5c2682 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Wed, 27 May 2015 23:22:19 -0400 Subject: [PATCH] Issue #81 patches from @dovandung --- src/audio/AudioThread.h | 1 + src/demod/DemodDefs.h | 1 + src/demod/DemodulatorThread.cpp | 4 ++++ src/sdr/SDRPostThread.cpp | 6 ++++++ src/visual/ScopeCanvas.cpp | 13 +++++++++---- src/visual/WaterfallCanvas.cpp | 4 ++++ 6 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/audio/AudioThread.h b/src/audio/AudioThread.h index 0d10f97..7adfa6f 100644 --- a/src/audio/AudioThread.h +++ b/src/audio/AudioThread.h @@ -18,6 +18,7 @@ public: int channels; float peak; std::vector data; + std::mutex busy_update; AudioThreadInput() : frequency(0), sampleRate(0), channels(0), peak(0) { diff --git a/src/demod/DemodDefs.h b/src/demod/DemodDefs.h index 6282ac0..5f3e3fb 100644 --- a/src/demod/DemodDefs.h +++ b/src/demod/DemodDefs.h @@ -61,6 +61,7 @@ public: long long frequency; long long sampleRate; std::vector data; + std::mutex busy_rw; DemodulatorThreadIQData() : frequency(0), sampleRate(0) { diff --git a/src/demod/DemodulatorThread.cpp b/src/demod/DemodulatorThread.cpp index a14f8e2..57031e5 100644 --- a/src/demod/DemodulatorThread.cpp +++ b/src/demod/DemodulatorThread.cpp @@ -310,6 +310,8 @@ void DemodulatorThread::threadMain() { if (ati && audioVisOutputQueue != NULL && audioVisOutputQueue->empty()) { + ati_vis->busy_update.lock(); + int num_vis = DEMOD_VIS_SIZE; if (stereo) { ati_vis->channels = 2; @@ -342,6 +344,8 @@ void DemodulatorThread::threadMain() { // std::cout << "Signal: " << agc_crcf_get_signal_level(agc) << " -- " << agc_crcf_get_rssi(agc) << "dB " << std::endl; } + ati_vis->busy_update.unlock(); + audioVisOutputQueue->push(ati_vis); } if (!threadQueueControl->empty()) { diff --git a/src/sdr/SDRPostThread.cpp b/src/sdr/SDRPostThread.cpp index 43839cb..9b5ab71 100644 --- a/src/sdr/SDRPostThread.cpp +++ b/src/sdr/SDRPostThread.cpp @@ -111,6 +111,9 @@ void SDRPostThread::threadMain() { } if (iqVisualQueue.load() != NULL && iqVisualQueue.load()->empty()) { + + visualDataOut->busy_rw.lock(); + if (visualDataOut->data.size() < num_vis_samples) { if (visualDataOut->data.capacity() < num_vis_samples) { visualDataOut->data.reserve(num_vis_samples); @@ -121,6 +124,9 @@ void SDRPostThread::threadMain() { visualDataOut->frequency = data_in->frequency; visualDataOut->sampleRate = data_in->sampleRate; visualDataOut->data.assign(dataOut.begin(), dataOut.begin() + num_vis_samples); + + visualDataOut->busy_rw.unlock(); + iqVisualQueue.load()->push(visualDataOut); } diff --git a/src/visual/ScopeCanvas.cpp b/src/visual/ScopeCanvas.cpp index 2b01de8..4a5196a 100644 --- a/src/visual/ScopeCanvas.cpp +++ b/src/visual/ScopeCanvas.cpp @@ -61,16 +61,21 @@ void ScopeCanvas::OnPaint(wxPaintEvent& WXUNUSED(event)) { if (!wxGetApp().getAudioVisualQueue()->empty()) { AudioThreadInput *demodAudioData; wxGetApp().getAudioVisualQueue()->pop(demodAudioData); - if (demodAudioData && demodAudioData->data.size()) { - if (waveform_points.size() != demodAudioData->data.size() * 2) { - waveform_points.resize(demodAudioData->data.size() * 2); + int iMax = demodAudioData->data.size(); + if (demodAudioData && iMax) { + if (waveform_points.size() != iMax * 2) { + waveform_points.resize(iMax * 2); } - for (int i = 0, iMax = demodAudioData->data.size(); i < iMax; i++) { + demodAudioData->busy_update.lock(); + + for (int i = 0; i < iMax; i++) { waveform_points[i * 2 + 1] = demodAudioData->data[i] * 0.5f; waveform_points[i * 2] = ((double) i / (double) iMax); } + demodAudioData->busy_update.unlock(); + setStereo(demodAudioData->channels == 2); } else { std::cout << "Incoming Demodulator data empty?" << std::endl; diff --git a/src/visual/WaterfallCanvas.cpp b/src/visual/WaterfallCanvas.cpp index c504dcf..45e5b66 100644 --- a/src/visual/WaterfallCanvas.cpp +++ b/src/visual/WaterfallCanvas.cpp @@ -110,6 +110,8 @@ void WaterfallCanvas::OnPaint(wxPaintEvent& WXUNUSED(event)) { DemodulatorThreadIQData *iqData; wxGetApp().getIQVisualQueue()->pop(iqData); + iqData->busy_rw.lock(); + if (iqData && iqData->data.size()) { setData(iqData); if (otherWaterfallCanvas) { @@ -118,6 +120,8 @@ void WaterfallCanvas::OnPaint(wxPaintEvent& WXUNUSED(event)) { } else { std::cout << "Incoming IQ data empty?" << std::endl; } + + iqData->busy_rw.unlock(); } glContext->SetCurrent(*this);