From 554db8fe8211956d886fcc59034db3929348a135 Mon Sep 17 00:00:00 2001 From: f4exb Date: Thu, 28 Feb 2019 17:55:03 +0100 Subject: [PATCH] FreeDV demod: implemented modem input volume control. FreeDV mod: set volume polling to 10ms --- plugins/channelrx/demodfreedv/freedvdemod.cpp | 20 ++- .../channelrx/demodfreedv/freedvdemodgui.ui | 133 ++++++++++-------- .../demodfreedv/freedvdemodsettings.cpp | 4 +- plugins/channeltx/modfreedv/freedvmod.cpp | 2 +- sdrbase/resources/webapi/doc/html2/index.html | 10 +- .../doc/swagger/include/FreeDVDemod.yaml | 5 + .../api/swagger/include/FreeDVDemod.yaml | 5 + swagger/sdrangel/code/html2/index.html | 10 +- .../qt5/client/SWGFreeDVDemodSettings.cpp | 21 +++ .../code/qt5/client/SWGFreeDVDemodSettings.h | 6 + 10 files changed, 149 insertions(+), 67 deletions(-) diff --git a/plugins/channelrx/demodfreedv/freedvdemod.cpp b/plugins/channelrx/demodfreedv/freedvdemod.cpp index 4acb92c85..1cac39ec4 100644 --- a/plugins/channelrx/demodfreedv/freedvdemod.cpp +++ b/plugins/channelrx/demodfreedv/freedvdemod.cpp @@ -306,11 +306,16 @@ void FreeDVDemod::feed(const SampleVector::const_iterator& begin, const SampleVe if (m_agcActive) { m_simpleAGC.feed(demod); - demod *= 3276.8f / m_simpleAGC.getValue(); // provision for peak to average ratio (here 10) + demod *= (m_settings.m_volumeIn * 3276.8f) / m_simpleAGC.getValue(); // provision for peak to average ratio (here 10) compensated by m_volumeIn // if (i == 0) { // qDebug("FreeDVDemod::feed: m_simpleAGC: %f", m_simpleAGC.getValue()); // } } + else + { + demod *= m_settings.m_volumeIn; + } + pushSampleToDV((qint16) demod); } @@ -650,6 +655,7 @@ void FreeDVDemod::applySettings(const FreeDVDemodSettings& settings, bool force) qDebug() << "FreeDVDemod::applySettings:" << " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset << " m_volume: " << settings.m_volume + << " m_volumeIn: " << settings.m_volumeIn << " m_spanLog2: " << settings.m_spanLog2 << " m_audioMute: " << settings.m_audioMute << " m_agcActive: " << settings.m_agc @@ -669,6 +675,11 @@ void FreeDVDemod::applySettings(const FreeDVDemodSettings& settings, bool force) m_volume /= 4.0; // for 3276.8 } + if ((m_settings.m_volumeIn != settings.m_volumeIn) || force) + { + reverseAPIKeys.append("volumeIn"); + } + if ((settings.m_audioDeviceName != m_settings.m_audioDeviceName) || force) { reverseAPIKeys.append("audioDeviceName"); @@ -781,6 +792,9 @@ int FreeDVDemod::webapiSettingsPutPatch( if (channelSettingsKeys.contains("volume")) { settings.m_volume = response.getFreeDvDemodSettings()->getVolume(); } + if (channelSettingsKeys.contains("volumeIn")) { + settings.m_volumeIn = response.getFreeDvDemodSettings()->getVolumeIn(); + } if (channelSettingsKeys.contains("spanLog2")) { settings.m_spanLog2 = response.getFreeDvDemodSettings()->getSpanLog2(); } @@ -838,6 +852,7 @@ void FreeDVDemod::webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings& r response.getFreeDvDemodSettings()->setAudioMute(settings.m_audioMute ? 1 : 0); response.getFreeDvDemodSettings()->setInputFrequencyOffset(settings.m_inputFrequencyOffset); response.getFreeDvDemodSettings()->setVolume(settings.m_volume); + response.getFreeDvDemodSettings()->setVolumeIn(settings.m_volumeIn); response.getFreeDvDemodSettings()->setSpanLog2(settings.m_spanLog2); response.getFreeDvDemodSettings()->setAudioMute(settings.m_audioMute ? 1 : 0); response.getFreeDvDemodSettings()->setAgc(settings.m_agc ? 1 : 0); @@ -884,6 +899,9 @@ void FreeDVDemod::webapiReverseSendSettings(QList& channelSettingsKeys, if (channelSettingsKeys.contains("volume") || force) { swgFreeDVDemodSettings->setVolume(settings.m_volume); } + if (channelSettingsKeys.contains("volumeIn") || force) { + swgFreeDVDemodSettings->setVolumeIn(settings.m_volumeIn); + } if (channelSettingsKeys.contains("spanLog2") || force) { swgFreeDVDemodSettings->setSpanLog2(settings.m_spanLog2); } diff --git a/plugins/channelrx/demodfreedv/freedvdemodgui.ui b/plugins/channelrx/demodfreedv/freedvdemodgui.ui index 63e2ea0ca..cfa9699ca 100644 --- a/plugins/channelrx/demodfreedv/freedvdemodgui.ui +++ b/plugins/channelrx/demodfreedv/freedvdemodgui.ui @@ -288,7 +288,7 @@ - Input + In @@ -300,6 +300,15 @@ 24 + + Modem input volume adjustment + + + 99 + + + 1 + @@ -310,6 +319,9 @@ 16777215 + + Modem input volume + 2.0 @@ -361,6 +373,9 @@ 24 + + 99 + 1 @@ -404,64 +419,6 @@ - - - - SNR - - - - - - - - 0 - 0 - - - - - 180 - 24 - - - - - Liberation Mono - 8 - - - - SNR estimation - - - - - - - - 52 - 0 - - - - SNR estimation - - - -10.0 dB - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - Qt::Vertical - - - @@ -513,6 +470,64 @@ + + + + Qt::Vertical + + + + + + + SNR + + + + + + + + 0 + 0 + + + + + 180 + 24 + + + + + Liberation Mono + 8 + + + + SNR estimation + + + + + + + + 52 + 0 + + + + SNR estimation + + + -10.0 dB + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + diff --git a/plugins/channelrx/demodfreedv/freedvdemodsettings.cpp b/plugins/channelrx/demodfreedv/freedvdemodsettings.cpp index 27d76e774..6bf473769 100644 --- a/plugins/channelrx/demodfreedv/freedvdemodsettings.cpp +++ b/plugins/channelrx/demodfreedv/freedvdemodsettings.cpp @@ -41,7 +41,7 @@ void FreeDVDemodSettings::resetToDefaults() m_audioMute = false; m_agc = true; m_volume = 3.0; - m_volumeIn = 3.0; + m_volumeIn = 1.0; m_spanLog2 = 3; m_inputFrequencyOffset = 0; m_rgbColor = QColor(0, 255, 204).rgb(); @@ -109,7 +109,7 @@ bool FreeDVDemodSettings::deserialize(const QByteArray& data) } d.readU32(5, &m_rgbColor); - d.readS32(6, &tmp, 30); + d.readS32(6, &tmp, 10); m_volumeIn = tmp / 10.0; d.readS32(7, &m_spanLog2, 3); d.readBool(11, &m_agc, false); diff --git a/plugins/channeltx/modfreedv/freedvmod.cpp b/plugins/channeltx/modfreedv/freedvmod.cpp index f37e1174c..ef209b971 100644 --- a/plugins/channeltx/modfreedv/freedvmod.cpp +++ b/plugins/channeltx/modfreedv/freedvmod.cpp @@ -50,7 +50,7 @@ MESSAGE_CLASS_DEFINITION(FreeDVMod::MsgReportFileSourceStreamTiming, Message) const QString FreeDVMod::m_channelIdURI = "sdrangel.channeltx.freedvmod"; const QString FreeDVMod::m_channelId = "FreeDVMod"; -const int FreeDVMod::m_levelNbSamples = 480; // every 10ms +const int FreeDVMod::m_levelNbSamples = 80; // every 10ms const int FreeDVMod::m_ssbFftLen = 1024; FreeDVMod::FreeDVMod(DeviceSinkAPI *deviceAPI) : diff --git a/sdrbase/resources/webapi/doc/html2/index.html b/sdrbase/resources/webapi/doc/html2/index.html index 39712f9b7..87024274d 100644 --- a/sdrbase/resources/webapi/doc/html2/index.html +++ b/sdrbase/resources/webapi/doc/html2/index.html @@ -2580,7 +2580,13 @@ margin-bottom: 20px; }, "volume" : { "type" : "number", - "format" : "float" + "format" : "float", + "description" : "Audio volume" + }, + "volumeIn" : { + "type" : "number", + "format" : "float", + "description" : "Modem input volume" }, "spanLog2" : { "type" : "integer" @@ -24528,7 +24534,7 @@ except ApiException as e:
- Generated 2019-02-28T13:56:13.268+01:00 + Generated 2019-02-28T17:16:26.748+01:00
diff --git a/sdrbase/resources/webapi/doc/swagger/include/FreeDVDemod.yaml b/sdrbase/resources/webapi/doc/swagger/include/FreeDVDemod.yaml index 4608b674d..f990f4110 100644 --- a/sdrbase/resources/webapi/doc/swagger/include/FreeDVDemod.yaml +++ b/sdrbase/resources/webapi/doc/swagger/include/FreeDVDemod.yaml @@ -5,6 +5,11 @@ FreeDVDemodSettings: type: integer format: int64 volume: + description: Audio volume + type: number + format: float + volumeIn: + description: Modem input volume type: number format: float spanLog2: diff --git a/swagger/sdrangel/api/swagger/include/FreeDVDemod.yaml b/swagger/sdrangel/api/swagger/include/FreeDVDemod.yaml index 4608b674d..f990f4110 100644 --- a/swagger/sdrangel/api/swagger/include/FreeDVDemod.yaml +++ b/swagger/sdrangel/api/swagger/include/FreeDVDemod.yaml @@ -5,6 +5,11 @@ FreeDVDemodSettings: type: integer format: int64 volume: + description: Audio volume + type: number + format: float + volumeIn: + description: Modem input volume type: number format: float spanLog2: diff --git a/swagger/sdrangel/code/html2/index.html b/swagger/sdrangel/code/html2/index.html index 39712f9b7..87024274d 100644 --- a/swagger/sdrangel/code/html2/index.html +++ b/swagger/sdrangel/code/html2/index.html @@ -2580,7 +2580,13 @@ margin-bottom: 20px; }, "volume" : { "type" : "number", - "format" : "float" + "format" : "float", + "description" : "Audio volume" + }, + "volumeIn" : { + "type" : "number", + "format" : "float", + "description" : "Modem input volume" }, "spanLog2" : { "type" : "integer" @@ -24528,7 +24534,7 @@ except ApiException as e:
- Generated 2019-02-28T13:56:13.268+01:00 + Generated 2019-02-28T17:16:26.748+01:00
diff --git a/swagger/sdrangel/code/qt5/client/SWGFreeDVDemodSettings.cpp b/swagger/sdrangel/code/qt5/client/SWGFreeDVDemodSettings.cpp index 9a552f906..52a7b194c 100644 --- a/swagger/sdrangel/code/qt5/client/SWGFreeDVDemodSettings.cpp +++ b/swagger/sdrangel/code/qt5/client/SWGFreeDVDemodSettings.cpp @@ -32,6 +32,8 @@ SWGFreeDVDemodSettings::SWGFreeDVDemodSettings() { m_input_frequency_offset_isSet = false; volume = 0.0f; m_volume_isSet = false; + volume_in = 0.0f; + m_volume_in_isSet = false; span_log2 = 0; m_span_log2_isSet = false; audio_mute = 0; @@ -58,6 +60,8 @@ SWGFreeDVDemodSettings::init() { m_input_frequency_offset_isSet = false; volume = 0.0f; m_volume_isSet = false; + volume_in = 0.0f; + m_volume_in_isSet = false; span_log2 = 0; m_span_log2_isSet = false; audio_mute = 0; @@ -82,6 +86,7 @@ SWGFreeDVDemodSettings::cleanup() { + if(title != nullptr) { delete title; } @@ -106,6 +111,8 @@ SWGFreeDVDemodSettings::fromJsonObject(QJsonObject &pJson) { ::SWGSDRangel::setValue(&volume, pJson["volume"], "float", ""); + ::SWGSDRangel::setValue(&volume_in, pJson["volumeIn"], "float", ""); + ::SWGSDRangel::setValue(&span_log2, pJson["spanLog2"], "qint32", ""); ::SWGSDRangel::setValue(&audio_mute, pJson["audioMute"], "qint32", ""); @@ -142,6 +149,9 @@ SWGFreeDVDemodSettings::asJsonObject() { if(m_volume_isSet){ obj->insert("volume", QJsonValue(volume)); } + if(m_volume_in_isSet){ + obj->insert("volumeIn", QJsonValue(volume_in)); + } if(m_span_log2_isSet){ obj->insert("spanLog2", QJsonValue(span_log2)); } @@ -187,6 +197,16 @@ SWGFreeDVDemodSettings::setVolume(float volume) { this->m_volume_isSet = true; } +float +SWGFreeDVDemodSettings::getVolumeIn() { + return volume_in; +} +void +SWGFreeDVDemodSettings::setVolumeIn(float volume_in) { + this->volume_in = volume_in; + this->m_volume_in_isSet = true; +} + qint32 SWGFreeDVDemodSettings::getSpanLog2() { return span_log2; @@ -264,6 +284,7 @@ SWGFreeDVDemodSettings::isSet(){ do{ if(m_input_frequency_offset_isSet){ isObjectUpdated = true; break;} if(m_volume_isSet){ isObjectUpdated = true; break;} + if(m_volume_in_isSet){ isObjectUpdated = true; break;} if(m_span_log2_isSet){ isObjectUpdated = true; break;} if(m_audio_mute_isSet){ isObjectUpdated = true; break;} if(m_agc_isSet){ isObjectUpdated = true; break;} diff --git a/swagger/sdrangel/code/qt5/client/SWGFreeDVDemodSettings.h b/swagger/sdrangel/code/qt5/client/SWGFreeDVDemodSettings.h index 489902333..a978269d6 100644 --- a/swagger/sdrangel/code/qt5/client/SWGFreeDVDemodSettings.h +++ b/swagger/sdrangel/code/qt5/client/SWGFreeDVDemodSettings.h @@ -48,6 +48,9 @@ public: float getVolume(); void setVolume(float volume); + float getVolumeIn(); + void setVolumeIn(float volume_in); + qint32 getSpanLog2(); void setSpanLog2(qint32 span_log2); @@ -79,6 +82,9 @@ private: float volume; bool m_volume_isSet; + float volume_in; + bool m_volume_in_isSet; + qint32 span_log2; bool m_span_log2_isSet;