diff --git a/plugins/channelrx/demodbfm/bfmdemod.cpp b/plugins/channelrx/demodbfm/bfmdemod.cpp index e72b84cf7..85ce4710d 100644 --- a/plugins/channelrx/demodbfm/bfmdemod.cpp +++ b/plugins/channelrx/demodbfm/bfmdemod.cpp @@ -236,6 +236,9 @@ void BFMDemod::applySettings(const BFMDemodSettings& settings, bool force) if ((settings.m_volume != m_settings.m_volume) || force) { reverseAPIKeys.append("volume"); } + if ((settings.m_audioMute != m_settings.m_audioMute) || force) { + reverseAPIKeys.append("audioMute"); + } if ((settings.m_audioStereo != m_settings.m_audioStereo) || force) { reverseAPIKeys.append("audioStereo"); } @@ -389,6 +392,9 @@ void BFMDemod::webapiUpdateChannelSettings( if (channelSettingsKeys.contains("squelch")) { settings.m_squelch = response.getBfmDemodSettings()->getSquelch(); } + if (channelSettingsKeys.contains("audioMute")) { + settings.m_audioMute = response.getBfmDemodSettings()->getAudioMute() != 0; + } if (channelSettingsKeys.contains("audioStereo")) { settings.m_audioStereo = response.getBfmDemodSettings()->getAudioStereo() != 0; } @@ -457,6 +463,7 @@ void BFMDemod::webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings& resp response.getBfmDemodSettings()->setAfBandwidth(settings.m_afBandwidth); response.getBfmDemodSettings()->setVolume(settings.m_volume); response.getBfmDemodSettings()->setSquelch(settings.m_squelch); + response.getBfmDemodSettings()->setAudioMute(settings.m_audioMute ? 1 : 0); response.getBfmDemodSettings()->setAudioStereo(settings.m_audioStereo ? 1 : 0); response.getBfmDemodSettings()->setLsbStereo(settings.m_lsbStereo ? 1 : 0); response.getBfmDemodSettings()->setShowPilot(settings.m_showPilot ? 1 : 0); @@ -671,6 +678,9 @@ void BFMDemod::webapiFormatChannelSettings( if (channelSettingsKeys.contains("squelch") || force) { swgBFMDemodSettings->setSquelch(settings.m_squelch); } + if (channelSettingsKeys.contains("audioMute") || force) { + swgBFMDemodSettings->setAudioMute(settings.m_audioMute ? 1 : 0); + } if (channelSettingsKeys.contains("audioStereo") || force) { swgBFMDemodSettings->setAudioStereo(settings.m_audioStereo ? 1 : 0); } diff --git a/plugins/channelrx/demodbfm/bfmdemodgui.cpp b/plugins/channelrx/demodbfm/bfmdemodgui.cpp index 947df87a9..449aca387 100644 --- a/plugins/channelrx/demodbfm/bfmdemodgui.cpp +++ b/plugins/channelrx/demodbfm/bfmdemodgui.cpp @@ -193,6 +193,12 @@ void BFMDemodGUI::on_squelch_valueChanged(int value) applySettings(); } +void BFMDemodGUI::on_audioMute_toggled(bool mute) +{ + m_settings.m_audioMute = mute; + applySettings(); +} + void BFMDemodGUI::on_audioStereo_toggled(bool stereo) { if (!stereo) @@ -512,6 +518,7 @@ void BFMDemodGUI::displaySettings() ui->squelch->setValue(m_settings.m_squelch); ui->squelchText->setText(QString("%1 dB").arg(m_settings.m_squelch)); + ui->audioMute->setChecked(m_settings.m_audioMute); ui->audioStereo->setChecked(m_settings.m_audioStereo); ui->lsbStereo->setChecked(m_settings.m_lsbStereo); ui->showPilot->setChecked(m_settings.m_showPilot); @@ -881,6 +888,7 @@ void BFMDemodGUI::makeUIConnections() QObject::connect(ui->afBW, &QSlider::valueChanged, this, &BFMDemodGUI::on_afBW_valueChanged); QObject::connect(ui->volume, &QSlider::valueChanged, this, &BFMDemodGUI::on_volume_valueChanged); QObject::connect(ui->squelch, &QSlider::valueChanged, this, &BFMDemodGUI::on_squelch_valueChanged); + QObject::connect(ui->audioMute, &QToolButton::toggled, this, &BFMDemodGUI::on_audioMute_toggled); QObject::connect(ui->audioStereo, &QToolButton::toggled, this, &BFMDemodGUI::on_audioStereo_toggled); QObject::connect(ui->lsbStereo, &ButtonSwitch::toggled, this, &BFMDemodGUI::on_lsbStereo_toggled); QObject::connect(ui->showPilot, &ButtonSwitch::clicked, this, &BFMDemodGUI::on_showPilot_clicked); diff --git a/plugins/channelrx/demodbfm/bfmdemodgui.h b/plugins/channelrx/demodbfm/bfmdemodgui.h index 1976b8680..c533002d0 100644 --- a/plugins/channelrx/demodbfm/bfmdemodgui.h +++ b/plugins/channelrx/demodbfm/bfmdemodgui.h @@ -110,6 +110,7 @@ private slots: void on_afBW_valueChanged(int value); void on_volume_valueChanged(int value); void on_squelch_valueChanged(int value); + void on_audioMute_toggled(bool mute); void on_audioStereo_toggled(bool stereo); void on_lsbStereo_toggled(bool lsb); void on_showPilot_clicked(); diff --git a/plugins/channelrx/demodbfm/bfmdemodgui.ui b/plugins/channelrx/demodbfm/bfmdemodgui.ui index ac0269e02..f24134e9b 100644 --- a/plugins/channelrx/demodbfm/bfmdemodgui.ui +++ b/plugins/channelrx/demodbfm/bfmdemodgui.ui @@ -267,6 +267,24 @@ + + + + Mute/Unmute audio + + + ... + + + + :/sound_on.png + :/sound_off.png:/sound_on.png + + + true + + + @@ -1883,11 +1901,6 @@ - - ButtonSwitch - QToolButton -
gui/buttonswitch.h
-
RollupContents QWidget @@ -1900,6 +1913,11 @@
gui/valuedialz.h
1
+ + ButtonSwitch + QToolButton +
gui/buttonswitch.h
+
LevelMeterSignalDB QWidget diff --git a/plugins/channelrx/demodbfm/bfmdemodsettings.cpp b/plugins/channelrx/demodbfm/bfmdemodsettings.cpp index f7bd742cd..97faab736 100644 --- a/plugins/channelrx/demodbfm/bfmdemodsettings.cpp +++ b/plugins/channelrx/demodbfm/bfmdemodsettings.cpp @@ -46,6 +46,7 @@ void BFMDemodSettings::resetToDefaults() m_afBandwidth = 15000; m_volume = 2.0; m_squelch = -60.0; + m_audioMute = false; m_audioStereo = false; m_lsbStereo = false; m_showPilot = false; @@ -101,6 +102,7 @@ QByteArray BFMDemodSettings::serialize() const s.writeS32(22, m_workspaceIndex); s.writeBlob(23, m_geometryBytes); s.writeBool(24, m_hidden); + s.writeBool(25, m_audioMute); return s.final(); } @@ -178,6 +180,7 @@ bool BFMDemodSettings::deserialize(const QByteArray& data) d.readS32(22, &m_workspaceIndex, 0); d.readBlob(23, &m_geometryBytes); d.readBool(24, &m_hidden, false); + d.readBool(25, &m_audioMute, false); return true; } diff --git a/plugins/channelrx/demodbfm/bfmdemodsettings.h b/plugins/channelrx/demodbfm/bfmdemodsettings.h index 18e5c878e..15395dde8 100644 --- a/plugins/channelrx/demodbfm/bfmdemodsettings.h +++ b/plugins/channelrx/demodbfm/bfmdemodsettings.h @@ -32,6 +32,7 @@ struct BFMDemodSettings Real m_afBandwidth; Real m_volume; Real m_squelch; + bool m_audioMute; bool m_audioStereo; bool m_lsbStereo; bool m_showPilot; diff --git a/plugins/channelrx/demodbfm/bfmdemodsink.cpp b/plugins/channelrx/demodbfm/bfmdemodsink.cpp index 2b1e29167..7d04d0ceb 100644 --- a/plugins/channelrx/demodbfm/bfmdemodsink.cpp +++ b/plugins/channelrx/demodbfm/bfmdemodsink.cpp @@ -96,6 +96,10 @@ void BFMDemodSink::feed(const SampleVector::const_iterator& begin, const SampleV m_sampleBuffer.clear(); + if (m_settings.m_audioMute) { + return; + } + for (SampleVector::const_iterator it = begin; it != end; ++it) { Complex c(it->real() / SDR_RX_SCALEF, it->imag() / SDR_RX_SCALEF); diff --git a/plugins/channelrx/demodbfm/readme.md b/plugins/channelrx/demodbfm/readme.md index f2cd3a1e9..0c006ac7a 100644 --- a/plugins/channelrx/demodbfm/readme.md +++ b/plugins/channelrx/demodbfm/readme.md @@ -48,6 +48,10 @@ This is the power of the reconstructed stereo pilot signal. Use this button to activate or de-activate RDS decoding +

Audio mute

+ +Use this button to mute or unmute audio +

A.8: Level meter in dB

- top bar (green): average value diff --git a/sdrbase/resources/webapi/doc/html2/index.html b/sdrbase/resources/webapi/doc/html2/index.html index 1562c26c6..f191e3b5a 100644 --- a/sdrbase/resources/webapi/doc/html2/index.html +++ b/sdrbase/resources/webapi/doc/html2/index.html @@ -2956,6 +2956,9 @@ margin-bottom: 20px; "type" : "number", "format" : "float" }, + "audioMute" : { + "type" : "integer" + }, "audioStereo" : { "type" : "integer" }, @@ -59647,7 +59650,7 @@ except ApiException as e:
- Generated 2026-01-03T10:36:00.091+01:00 + Generated 2026-01-03T23:29:39.831+01:00
diff --git a/sdrbase/resources/webapi/doc/swagger/include/BFMDemod.yaml b/sdrbase/resources/webapi/doc/swagger/include/BFMDemod.yaml index f9b1a8484..66b8af818 100644 --- a/sdrbase/resources/webapi/doc/swagger/include/BFMDemod.yaml +++ b/sdrbase/resources/webapi/doc/swagger/include/BFMDemod.yaml @@ -16,6 +16,8 @@ BFMDemodSettings: squelch: type: number format: float + audioMute: + type: integer audioStereo: type: integer lsbStereo: diff --git a/swagger/sdrangel/api/swagger/include/BFMDemod.yaml b/swagger/sdrangel/api/swagger/include/BFMDemod.yaml index 1535c776b..5a163f411 100644 --- a/swagger/sdrangel/api/swagger/include/BFMDemod.yaml +++ b/swagger/sdrangel/api/swagger/include/BFMDemod.yaml @@ -16,6 +16,8 @@ BFMDemodSettings: squelch: type: number format: float + audioMute: + type: integer audioStereo: type: integer lsbStereo: diff --git a/swagger/sdrangel/code/html2/index.html b/swagger/sdrangel/code/html2/index.html index 1562c26c6..f191e3b5a 100644 --- a/swagger/sdrangel/code/html2/index.html +++ b/swagger/sdrangel/code/html2/index.html @@ -2956,6 +2956,9 @@ margin-bottom: 20px; "type" : "number", "format" : "float" }, + "audioMute" : { + "type" : "integer" + }, "audioStereo" : { "type" : "integer" }, @@ -59647,7 +59650,7 @@ except ApiException as e:
- Generated 2026-01-03T10:36:00.091+01:00 + Generated 2026-01-03T23:29:39.831+01:00
diff --git a/swagger/sdrangel/code/qt5/client/SWGBFMDemodSettings.cpp b/swagger/sdrangel/code/qt5/client/SWGBFMDemodSettings.cpp index 048fb7ac6..c15ba7104 100644 --- a/swagger/sdrangel/code/qt5/client/SWGBFMDemodSettings.cpp +++ b/swagger/sdrangel/code/qt5/client/SWGBFMDemodSettings.cpp @@ -38,6 +38,8 @@ SWGBFMDemodSettings::SWGBFMDemodSettings() { m_volume_isSet = false; squelch = 0.0f; m_squelch_isSet = false; + audio_mute = 0; + m_audio_mute_isSet = false; audio_stereo = 0; m_audio_stereo_isSet = false; lsb_stereo = 0; @@ -88,6 +90,8 @@ SWGBFMDemodSettings::init() { m_volume_isSet = false; squelch = 0.0f; m_squelch_isSet = false; + audio_mute = 0; + m_audio_mute_isSet = false; audio_stereo = 0; m_audio_stereo_isSet = false; lsb_stereo = 0; @@ -134,6 +138,7 @@ SWGBFMDemodSettings::cleanup() { + if(title != nullptr) { delete title; } @@ -180,6 +185,8 @@ SWGBFMDemodSettings::fromJsonObject(QJsonObject &pJson) { ::SWGSDRangel::setValue(&squelch, pJson["squelch"], "float", ""); + ::SWGSDRangel::setValue(&audio_mute, pJson["audioMute"], "qint32", ""); + ::SWGSDRangel::setValue(&audio_stereo, pJson["audioStereo"], "qint32", ""); ::SWGSDRangel::setValue(&lsb_stereo, pJson["lsbStereo"], "qint32", ""); @@ -243,6 +250,9 @@ SWGBFMDemodSettings::asJsonObject() { if(m_squelch_isSet){ obj->insert("squelch", QJsonValue(squelch)); } + if(m_audio_mute_isSet){ + obj->insert("audioMute", QJsonValue(audio_mute)); + } if(m_audio_stereo_isSet){ obj->insert("audioStereo", QJsonValue(audio_stereo)); } @@ -345,6 +355,16 @@ SWGBFMDemodSettings::setSquelch(float squelch) { this->m_squelch_isSet = true; } +qint32 +SWGBFMDemodSettings::getAudioMute() { + return audio_mute; +} +void +SWGBFMDemodSettings::setAudioMute(qint32 audio_mute) { + this->audio_mute = audio_mute; + this->m_audio_mute_isSet = true; +} + qint32 SWGBFMDemodSettings::getAudioStereo() { return audio_stereo; @@ -525,6 +545,9 @@ SWGBFMDemodSettings::isSet(){ if(m_squelch_isSet){ isObjectUpdated = true; break; } + if(m_audio_mute_isSet){ + isObjectUpdated = true; break; + } if(m_audio_stereo_isSet){ isObjectUpdated = true; break; } diff --git a/swagger/sdrangel/code/qt5/client/SWGBFMDemodSettings.h b/swagger/sdrangel/code/qt5/client/SWGBFMDemodSettings.h index 2b6472aff..36e5bc36c 100644 --- a/swagger/sdrangel/code/qt5/client/SWGBFMDemodSettings.h +++ b/swagger/sdrangel/code/qt5/client/SWGBFMDemodSettings.h @@ -60,6 +60,9 @@ public: float getSquelch(); void setSquelch(float squelch); + qint32 getAudioMute(); + void setAudioMute(qint32 audio_mute); + qint32 getAudioStereo(); void setAudioStereo(qint32 audio_stereo); @@ -127,6 +130,9 @@ private: float squelch; bool m_squelch_isSet; + qint32 audio_mute; + bool m_audio_mute_isSet; + qint32 audio_stereo; bool m_audio_stereo_isSet;