From 2ef8ee362982745ddffb10289d36548a148502c9 Mon Sep 17 00:00:00 2001 From: AlexandreRouma Date: Mon, 29 Jan 2024 19:15:45 +0100 Subject: [PATCH] disable rds symbol diagram data stream when not visible --- decoder_modules/radio/src/demodulators/wfm.h | 9 +++++++-- decoder_modules/radio/src/rds_demod.h | 21 +++++++++++++++++--- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/decoder_modules/radio/src/demodulators/wfm.h b/decoder_modules/radio/src/demodulators/wfm.h index 43a5093d..bcccb8fd 100644 --- a/decoder_modules/radio/src/demodulators/wfm.h +++ b/decoder_modules/radio/src/demodulators/wfm.h @@ -47,7 +47,7 @@ namespace demod { // Init DSP demod.init(input, bandwidth / 2.0f, getIFSampleRate(), _stereo, _lowPass, _rds); - rdsDemod.init(&demod.rdsOut); + rdsDemod.init(&demod.rdsOut, _rdsInfo); hs.init(&rdsDemod.out, rdsHandler, this); reshape.init(&rdsDemod.soft, 4096, (1187 / 30) - 4096); diagHandler.init(&reshape.out, _diagHandler, this); @@ -96,6 +96,7 @@ namespace demod { // TODO: This will break when the entire radio module is disabled if (!_rds) { ImGui::BeginDisabled(); } if (ImGui::Checkbox(("Advanced RDS Info##_radio_wfm_rds_info_" + name).c_str(), &_rdsInfo)) { + setAdvancedRds(_rdsInfo); _config->acquire(); _config->conf[name][getName()]["rdsInfo"] = _rdsInfo; _config->release(true); @@ -229,13 +230,17 @@ namespace demod { demod.setStereo(_stereo); } + void setAdvancedRds(bool enabled) { + rdsDemod.setSoftEnabled(enabled); + _rdsInfo = enabled; + } + private: static void rdsHandler(uint8_t* data, int count, void* ctx) { WFM* _this = (WFM*)ctx; _this->rdsDecode.process(data, count); } - // DEBUGGING ONLY static void _diagHandler(float* data, int count, void* ctx) { WFM* _this = (WFM*)ctx; float* buf = _this->diag.acquireBuffer(); diff --git a/decoder_modules/radio/src/rds_demod.h b/decoder_modules/radio/src/rds_demod.h index 1824aec6..1e188003 100644 --- a/decoder_modules/radio/src/rds_demod.h +++ b/decoder_modules/radio/src/rds_demod.h @@ -13,10 +13,13 @@ class RDSDemod : public dsp::Processor { using base_type = dsp::Processor; public: RDSDemod() {} - RDSDemod(dsp::stream* in) { init(in); } + RDSDemod(dsp::stream* in, bool enableSoft) { init(in, enableSoft); } ~RDSDemod() {} - void init(dsp::stream* in) { + void init(dsp::stream* in, bool enableSoft) { + // Save config + this->enableSoft = enableSoft; + // Initialize the DSP agc.init(NULL, 1.0, 1e6, 0.1); costas.init(NULL, 0.005f); @@ -37,6 +40,14 @@ public: base_type::init(in); } + void setSoftEnabled(bool enable) { + assert(base_type::_block_init); + std::lock_guard lck(base_type::ctrlMtx); + base_type::tempStop(); + enableSoft = enable; + base_type::tempStart(); + } + void reset() { assert(base_type::_block_init); std::lock_guard lck(base_type::ctrlMtx); @@ -70,13 +81,17 @@ public: base_type::_in->flush(); if (!base_type::out.swap(count)) { return -1; } - if (!soft.swap(count)) { return -1; } + if (enableSoft) { + if (!soft.swap(count)) { return -1; } + } return count; } dsp::stream soft; private: + bool enableSoft = false; + dsp::loop::FastAGC agc; dsp::loop::Costas<2> costas; dsp::tap taps;