1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2026-08-14 23:43:43 -04:00

BFM Demodulator: added an audio mute button. Fixes #2413

This commit is contained in:
f4exb
2026-01-03 23:49:41 +01:00
parent 7ff0721e70
commit 6d3a001f6b
14 changed files with 95 additions and 7 deletions
+10
View File
@@ -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);
}
@@ -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);
+1
View File
@@ -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();
+23 -5
View File
@@ -267,6 +267,24 @@
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="audioMute">
<property name="toolTip">
<string>Mute/Unmute audio</string>
</property>
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="../../../sdrgui/resources/res.qrc">
<normaloff>:/sound_on.png</normaloff>
<normalon>:/sound_off.png</normalon>:/sound_on.png</iconset>
</property>
<property name="checkable">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</item>
</layout>
@@ -1883,11 +1901,6 @@
</widget>
</widget>
<customwidgets>
<customwidget>
<class>ButtonSwitch</class>
<extends>QToolButton</extends>
<header>gui/buttonswitch.h</header>
</customwidget>
<customwidget>
<class>RollupContents</class>
<extends>QWidget</extends>
@@ -1900,6 +1913,11 @@
<header>gui/valuedialz.h</header>
<container>1</container>
</customwidget>
<customwidget>
<class>ButtonSwitch</class>
<extends>QToolButton</extends>
<header>gui/buttonswitch.h</header>
</customwidget>
<customwidget>
<class>LevelMeterSignalDB</class>
<extends>QWidget</extends>
@@ -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;
}
@@ -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;
@@ -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);
+4
View File
@@ -48,6 +48,10 @@ This is the power of the reconstructed stereo pilot signal.
Use this button to activate or de-activate RDS decoding
<h3>Audio mute</h3>
Use this button to mute or unmute audio
<h3>A.8: Level meter in dB</h3>
- top bar (green): average value
@@ -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:
</div>
<div id="generator">
<div class="content">
Generated 2026-01-03T10:36:00.091+01:00
Generated 2026-01-03T23:29:39.831+01:00
</div>
</div>
</div>
@@ -16,6 +16,8 @@ BFMDemodSettings:
squelch:
type: number
format: float
audioMute:
type: integer
audioStereo:
type: integer
lsbStereo:
@@ -16,6 +16,8 @@ BFMDemodSettings:
squelch:
type: number
format: float
audioMute:
type: integer
audioStereo:
type: integer
lsbStereo:
+4 -1
View File
@@ -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:
</div>
<div id="generator">
<div class="content">
Generated 2026-01-03T10:36:00.091+01:00
Generated 2026-01-03T23:29:39.831+01:00
</div>
</div>
</div>
@@ -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;
}
@@ -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;