From 683bf51d0ef878adde9581cf41caea0a3fa1a1b6 Mon Sep 17 00:00:00 2001 From: f4exb Date: Sat, 11 Mar 2023 09:56:18 +0100 Subject: [PATCH] Audio input: Added Fc control --- doc/img/AudioInput_plugin.png | Bin 26061 -> 27992 bytes doc/img/AudioInput_plugin.xcf | Bin 54319 -> 61786 bytes .../samplesource/audioinput/audioinput.cpp | 16 +++ .../samplesource/audioinput/audioinputgui.cpp | 23 ++++ .../samplesource/audioinput/audioinputgui.h | 2 + .../samplesource/audioinput/audioinputgui.ui | 44 +++++++ .../audioinput/audioinputsettings.cpp | 11 ++ .../audioinput/audioinputsettings.h | 7 ++ .../audioinput/audioinputworker.cpp | 109 ++++++++++++++---- .../audioinput/audioinputworker.h | 2 + plugins/samplesource/audioinput/readme.md | 35 +++--- sdrbase/resources/webapi/doc/html2/index.html | 6 +- .../doc/swagger/include/AudioInput.yaml | 7 ++ .../api/swagger/include/AudioInput.yaml | 7 ++ swagger/sdrangel/code/html2/index.html | 6 +- .../code/qt5/client/SWGAudioInputSettings.cpp | 23 ++++ .../code/qt5/client/SWGAudioInputSettings.h | 6 + 17 files changed, 264 insertions(+), 40 deletions(-) diff --git a/doc/img/AudioInput_plugin.png b/doc/img/AudioInput_plugin.png index e8e5432fd02b8f14b77eb0699b226521c8f307b9..ca2db97d79053c4d3f15f0f30d351633bb340b70 100644 GIT binary patch delta 24545 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 settings.m_fcPos); + } + + qDebug() << "AudioInput::applySettings: set fc pos (enum) to " << (int) settings.m_fcPos; + } + if (settingsKeys.contains("iqMapping") || force) { forwardChange = true; @@ -437,6 +446,9 @@ void AudioInput::webapiUpdateDeviceSettings( if (deviceSettingsKeys.contains("iqImbalance")) { settings.m_iqImbalance = response.getAudioInputSettings()->getIqImbalance() != 0; } + if (deviceSettingsKeys.contains("fcPos")) { + settings.m_fcPos = (AudioInputSettings::fcPos_t) response.getAudioInputSettings()->getFcPos(); + } if (deviceSettingsKeys.contains("useReverseAPI")) { settings.m_useReverseAPI = response.getAudioInputSettings()->getUseReverseApi() != 0; } @@ -460,6 +472,7 @@ void AudioInput::webapiFormatDeviceSettings(SWGSDRangel::SWGDeviceSettings& resp response.getAudioInputSettings()->setIqMapping((int)settings.m_iqMapping); response.getAudioInputSettings()->setDcBlock(settings.m_dcBlock ? 1 : 0); response.getAudioInputSettings()->setIqImbalance(settings.m_iqImbalance ? 1 : 0); + response.getAudioInputSettings()->setFcPos((int) settings.m_fcPos); response.getAudioInputSettings()->setUseReverseApi(settings.m_useReverseAPI ? 1 : 0); @@ -505,6 +518,9 @@ void AudioInput::webapiReverseSendSettings(const QList& deviceSettingsK if (deviceSettingsKeys.contains("iqImbalance") || force) { swgAudioInputSettings->setIqImbalance(settings.m_iqImbalance ? 1 : 0); } + if (deviceSettingsKeys.contains("fcPos") || force) { + swgAudioInputSettings->setFcPos(settings.m_fcPos); + } QString deviceSettingsURL = QString("http://%1:%2/sdrangel/deviceset/%3/device/settings") .arg(settings.m_reverseAPIAddress) diff --git a/plugins/samplesource/audioinput/audioinputgui.cpp b/plugins/samplesource/audioinput/audioinputgui.cpp index f2aa2f451..e6cd67f54 100644 --- a/plugins/samplesource/audioinput/audioinputgui.cpp +++ b/plugins/samplesource/audioinput/audioinputgui.cpp @@ -245,6 +245,18 @@ void AudioInputGui::displaySettings() ui->dcOffset->setChecked(m_settings.m_dcBlock); ui->iqImbalance->setChecked(m_settings.m_iqImbalance); refreshSampleRates(ui->device->currentText()); + displayFcTooltip(); +} + +void AudioInputGui::displayFcTooltip() +{ + int32_t fShift = DeviceSampleSource::calculateFrequencyShift( + m_settings.m_log2Decim, + (DeviceSampleSource::fcPos_t) m_settings.m_fcPos, + m_settings.m_sampleRate, + DeviceSampleSource::FrequencyShiftScheme::FSHIFT_STD + ); + ui->fcPos->setToolTip(tr("Relative position of device center frequency: %1 kHz").arg(QString::number(fShift / 1000.0f, 'g', 5))); } void AudioInputGui::on_device_currentIndexChanged(int index) @@ -260,6 +272,7 @@ void AudioInputGui::on_sampleRate_currentIndexChanged(int index) { (void) index; m_settings.m_sampleRate = ui->sampleRate->currentText().toInt(); + displayFcTooltip(); m_settingsKeys.append("sampleRate"); sendSettings(); } @@ -271,6 +284,7 @@ void AudioInputGui::on_decim_currentIndexChanged(int index) } m_settings.m_log2Decim = index; + displayFcTooltip(); m_settingsKeys.append("log2Decim"); sendSettings(); } @@ -305,6 +319,14 @@ void AudioInputGui::on_iqImbalance_toggled(bool checked) sendSettings(); } +void AudioInputGui::on_fcPos_currentIndexChanged(int index) +{ + m_settings.m_fcPos = (AudioInputSettings::fcPos_t) (index < 0 ? 0 : index > 2 ? 2 : index); + displayFcTooltip(); + m_settingsKeys.append("fcPos"); + sendSettings(); +} + void AudioInputGui::on_startStop_toggled(bool checked) { if (m_doApplySettings) @@ -394,5 +416,6 @@ void AudioInputGui::makeUIConnections() QObject::connect(ui->channels, QOverload::of(&QComboBox::currentIndexChanged), this, &AudioInputGui::on_channels_currentIndexChanged); QObject::connect(ui->dcOffset, &ButtonSwitch::toggled, this, &AudioInputGui::on_dcOffset_toggled); QObject::connect(ui->iqImbalance, &ButtonSwitch::toggled, this, &AudioInputGui::on_iqImbalance_toggled); + QObject::connect(ui->fcPos, QOverload::of(&QComboBox::currentIndexChanged), this, &AudioInputGui::on_fcPos_currentIndexChanged); QObject::connect(ui->startStop, &ButtonSwitch::toggled, this, &AudioInputGui::on_startStop_toggled); } diff --git a/plugins/samplesource/audioinput/audioinputgui.h b/plugins/samplesource/audioinput/audioinputgui.h index 17d25ccb5..61767a67c 100644 --- a/plugins/samplesource/audioinput/audioinputgui.h +++ b/plugins/samplesource/audioinput/audioinputgui.h @@ -65,6 +65,7 @@ private: void refreshDeviceList(); void refreshSampleRates(QString deviceName); void displaySettings(); + void displayFcTooltip(); void sendSettings(); void updateSampleRateAndFrequency(); bool handleMessage(const Message& message); @@ -79,6 +80,7 @@ private slots: void on_channels_currentIndexChanged(int index); void on_dcOffset_toggled(bool checked); void on_iqImbalance_toggled(bool checked); + void on_fcPos_currentIndexChanged(int index); void on_startStop_toggled(bool checked); void updateHardware(); void openDeviceSettingsDialog(const QPoint& p); diff --git a/plugins/samplesource/audioinput/audioinputgui.ui b/plugins/samplesource/audioinput/audioinputgui.ui index f54f5ceb5..b79790416 100644 --- a/plugins/samplesource/audioinput/audioinputgui.ui +++ b/plugins/samplesource/audioinput/audioinputgui.ui @@ -304,6 +304,50 @@ + + + + Fp + + + + + + + + 55 + 0 + + + + + 50 + 16777215 + + + + Relative position of device center frequency + + + 2 + + + + Inf + + + + + Sup + + + + + Cen + + + + diff --git a/plugins/samplesource/audioinput/audioinputsettings.cpp b/plugins/samplesource/audioinput/audioinputsettings.cpp index dc51693f4..befc8429c 100644 --- a/plugins/samplesource/audioinput/audioinputsettings.cpp +++ b/plugins/samplesource/audioinput/audioinputsettings.cpp @@ -35,6 +35,7 @@ void AudioInputSettings::resetToDefaults() m_dcBlock = false; m_iqImbalance = false; m_useReverseAPI = false; + m_fcPos = FC_POS_CENTER; m_reverseAPIAddress = "127.0.0.1"; m_reverseAPIPort = 8888; m_reverseAPIDeviceIndex = 0; @@ -51,6 +52,7 @@ QByteArray AudioInputSettings::serialize() const s.writeS32(5, (int)m_iqMapping); s.writeBool(6, m_dcBlock); s.writeBool(7, m_iqImbalance); + s.writeS32(8, (int) m_fcPos); s.writeBool(24, m_useReverseAPI); s.writeString(25, m_reverseAPIAddress); @@ -73,6 +75,7 @@ bool AudioInputSettings::deserialize(const QByteArray& data) if (d.getVersion() == 1) { uint32_t uintval; + int intval; d.readString(1, &m_deviceName, ""); d.readS32(2, &m_sampleRate, 48000); @@ -81,6 +84,8 @@ bool AudioInputSettings::deserialize(const QByteArray& data) d.readS32(5, (int *)&m_iqMapping, IQMapping::L); d.readBool(6, &m_dcBlock, false); d.readBool(7, &m_iqImbalance, false); + d.readS32(8, &intval, 2); + m_fcPos = (fcPos_t) intval; d.readBool(24, &m_useReverseAPI, false); d.readString(25, &m_reverseAPIAddress, "127.0.0.1"); @@ -127,6 +132,9 @@ void AudioInputSettings::applySettings(const QStringList& settingsKeys, const Au if (settingsKeys.contains("iqImbalance")) { m_iqImbalance = settings.m_iqImbalance; } + if (settingsKeys.contains("fcPos")) { + m_fcPos = settings.m_fcPos; + } if (settingsKeys.contains("useReverseAPI")) { m_useReverseAPI = settings.m_useReverseAPI; } @@ -166,6 +174,9 @@ QString AudioInputSettings::getDebugString(const QStringList& settingsKeys, bool if (settingsKeys.contains("iqImbalance") || force) { ostr << " m_iqImbalance: " << m_iqImbalance; } + if (settingsKeys.contains("fcPos") || force) { + ostr << " m_fcPos: " << m_fcPos; + } if (settingsKeys.contains("useReverseAPI") || force) { ostr << " m_useReverseAPI: " << m_useReverseAPI; } diff --git a/plugins/samplesource/audioinput/audioinputsettings.h b/plugins/samplesource/audioinput/audioinputsettings.h index 1f4ccf0e8..18656402e 100644 --- a/plugins/samplesource/audioinput/audioinputsettings.h +++ b/plugins/samplesource/audioinput/audioinputsettings.h @@ -24,6 +24,12 @@ struct AudioInputSettings { + typedef enum { + FC_POS_INFRA = 0, + FC_POS_SUPRA, + FC_POS_CENTER + } fcPos_t; + QString m_deviceName; // Including realm, as from getFullDeviceName below int m_sampleRate; float m_volume; @@ -36,6 +42,7 @@ struct AudioInputSettings { } m_iqMapping; bool m_dcBlock; bool m_iqImbalance; + fcPos_t m_fcPos; bool m_useReverseAPI; QString m_reverseAPIAddress; diff --git a/plugins/samplesource/audioinput/audioinputworker.cpp b/plugins/samplesource/audioinput/audioinputworker.cpp index 7de170adf..a70967cd1 100644 --- a/plugins/samplesource/audioinput/audioinputworker.cpp +++ b/plugins/samplesource/audioinput/audioinputworker.cpp @@ -107,31 +107,90 @@ void AudioInputWorker::decimate(qint16 *buf, unsigned int nbRead) { SampleVector::iterator it = m_convertBuffer.begin(); - switch (m_log2Decim) - { - case 0: - m_decimatorsIQ.decimate1(&it, buf, 2*nbRead); - break; - case 1: - m_decimatorsIQ.decimate2_cen(&it, buf, 2*nbRead); - break; - case 2: - m_decimatorsIQ.decimate4_cen(&it, buf, 2*nbRead); - break; - case 3: - m_decimatorsIQ.decimate8_cen(&it, buf, 2*nbRead); - break; - case 4: - m_decimatorsIQ.decimate16_cen(&it, buf, 2*nbRead); - break; - case 5: - m_decimatorsIQ.decimate32_cen(&it, buf, 2*nbRead); - break; - case 6: - m_decimatorsIQ.decimate64_cen(&it, buf, 2*nbRead); - break; - default: - break; + if (m_log2Decim == 0) + { + m_decimatorsIQ.decimate1(&it, buf, 2*nbRead); + } + else + { + if (m_fcPos == 0) // Infradyne + { + switch (m_log2Decim) + { + case 1: + m_decimatorsIQ.decimate2_inf(&it, buf, 2*nbRead); + break; + case 2: + m_decimatorsIQ.decimate4_inf(&it, buf, 2*nbRead); + break; + case 3: + m_decimatorsIQ.decimate8_inf(&it, buf, 2*nbRead); + break; + case 4: + m_decimatorsIQ.decimate16_inf(&it, buf, 2*nbRead); + break; + case 5: + m_decimatorsIQ.decimate32_inf(&it, buf, 2*nbRead); + break; + case 6: + m_decimatorsIQ.decimate64_inf(&it, buf, 2*nbRead); + break; + default: + break; + } + } + else if (m_fcPos == 1) // Supradyne + { + switch (m_log2Decim) + { + case 1: + m_decimatorsIQ.decimate2_sup(&it, buf, 2*nbRead); + break; + case 2: + m_decimatorsIQ.decimate4_sup(&it, buf, 2*nbRead); + break; + case 3: + m_decimatorsIQ.decimate8_sup(&it, buf, 2*nbRead); + break; + case 4: + m_decimatorsIQ.decimate16_sup(&it, buf, 2*nbRead); + break; + case 5: + m_decimatorsIQ.decimate32_sup(&it, buf, 2*nbRead); + break; + case 6: + m_decimatorsIQ.decimate64_sup(&it, buf, 2*nbRead); + break; + default: + break; + } + } + else // centered + { + switch (m_log2Decim) + { + case 1: + m_decimatorsIQ.decimate2_cen(&it, buf, 2*nbRead); + break; + case 2: + m_decimatorsIQ.decimate4_cen(&it, buf, 2*nbRead); + break; + case 3: + m_decimatorsIQ.decimate8_cen(&it, buf, 2*nbRead); + break; + case 4: + m_decimatorsIQ.decimate16_cen(&it, buf, 2*nbRead); + break; + case 5: + m_decimatorsIQ.decimate32_cen(&it, buf, 2*nbRead); + break; + case 6: + m_decimatorsIQ.decimate64_cen(&it, buf, 2*nbRead); + break; + default: + break; + } + } } m_sampleFifo->write(m_convertBuffer.begin(), it); diff --git a/plugins/samplesource/audioinput/audioinputworker.h b/plugins/samplesource/audioinput/audioinputworker.h index f0c4e62ef..ad7bfeb64 100644 --- a/plugins/samplesource/audioinput/audioinputworker.h +++ b/plugins/samplesource/audioinput/audioinputworker.h @@ -37,6 +37,7 @@ public: void startWork(); void stopWork(); void setLog2Decimation(unsigned int log2_decim) {m_log2Decim = log2_decim;} + void setFcPos(int fcPos) { m_fcPos = fcPos; } void setIQMapping(AudioInputSettings::IQMapping iqMapping) {m_iqMapping = iqMapping;} static const int m_convBufSamples = 4096; @@ -45,6 +46,7 @@ private: bool m_running; unsigned int m_log2Decim; + int m_fcPos; AudioInputSettings::IQMapping m_iqMapping; qint16 m_buf[m_convBufSamples*2]; // stereo (I, Q) diff --git a/plugins/samplesource/audioinput/readme.md b/plugins/samplesource/audioinput/readme.md index 3e1e5d6c3..9636db683 100644 --- a/plugins/samplesource/audioinput/readme.md +++ b/plugins/samplesource/audioinput/readme.md @@ -18,27 +18,43 @@ Device start / stop button. - Green square icon: device is running and can be stopped - Magenta (or pink) square icon: an error occurred. In the case the device was accidentally disconnected you may click on the icon, plug back in and start again. -

2: Device

+

2: Auto remove DC component

+ +Software DSP auto remove DC correction. This will work in I/Q mode (stereo I/Q) only. + +

3: Auto make I/Q balance

+ +Software DSP auto I/Q imbalance correction. The DC correction (8) must be enabled for this to be effective. This will work in I/Q mode (stereo I/Q) only. + +

4: Device

The audio device to use. -

3: Refresh devices

+

5: Refresh devices

Refresh the list of audio devices. -

4: Audio sample rate

+

6: Audio sample rate

Audio sample rate in Hz (Sa/s). -

5: Decimation

+

7: Decimation

A decimation factor to apply to the audio data. The baseband sample rate will be the audio sample, divided by this decimation factor. -

6: Volume

+

8: Decimated bandpass center frequency position relative the device center frequency

+ +This will work in I/Q mode (stereo I/Q) only. + + - **Cen**: the decimation operation takes place around the device center frequency Fs + - **Inf**: the decimation operation takes place around Fs - Fc. + - **Sup**: the decimation operation takes place around Fs + Fc. + +

9: Volume

A control to set the input volume. This is not supported by all input audio devices. -

7: Channel Map

+

10: Channel Map

This controls how the left and right audio channels map on to the IQ channels. @@ -47,10 +63,3 @@ This controls how the left and right audio channels map on to the IQ channels. * I=L, Q=R - The left audio channel is driven to the I channel. The right audio channel is driven to the Q channel for a complex (analytic signal)input. * I=R, Q=L - The right audio channel is driven to the I channel. The left audio channel is driven to the Q channel for a complex (analytic signal)input. -

8: Auto remove DC component

- -Software DSP auto remove DC correction. - -

9: Auto make I/Q balance

- -Software DSP auto I/Q imbalance correction. The DC correction (8) must be enabled for this to be effective. diff --git a/sdrbase/resources/webapi/doc/html2/index.html b/sdrbase/resources/webapi/doc/html2/index.html index 2d4ce2c29..c773bcbb9 100644 --- a/sdrbase/resources/webapi/doc/html2/index.html +++ b/sdrbase/resources/webapi/doc/html2/index.html @@ -2457,6 +2457,10 @@ margin-bottom: 20px; "type" : "integer", "description" : "Auto IQ balance (you need auto DC blocking active)\n * 0 - Off\n * 1 - On\n" }, + "fcPos" : { + "type" : "integer", + "description" : "Decimated bandpass center frequency position\n * 0 - Infradyne\n * 1 - Supradyne\n * 2 - Centered\n" + }, "useReverseAPI" : { "type" : "integer", "description" : "Synchronize with reverse API (1 for yes, 0 for no)" @@ -57256,7 +57260,7 @@ except ApiException as e:
- Generated 2023-03-11T04:40:02.823+01:00 + Generated 2023-03-11T09:38:49.252+01:00
diff --git a/sdrbase/resources/webapi/doc/swagger/include/AudioInput.yaml b/sdrbase/resources/webapi/doc/swagger/include/AudioInput.yaml index 4c78a925e..56a7cd227 100644 --- a/sdrbase/resources/webapi/doc/swagger/include/AudioInput.yaml +++ b/sdrbase/resources/webapi/doc/swagger/include/AudioInput.yaml @@ -33,6 +33,13 @@ AudioInputSettings: Auto IQ balance (you need auto DC blocking active) * 0 - Off * 1 - On + fcPos: + type: integer + description: > + Decimated bandpass center frequency position + * 0 - Infradyne + * 1 - Supradyne + * 2 - Centered useReverseAPI: description: Synchronize with reverse API (1 for yes, 0 for no) type: integer diff --git a/swagger/sdrangel/api/swagger/include/AudioInput.yaml b/swagger/sdrangel/api/swagger/include/AudioInput.yaml index 4c78a925e..56a7cd227 100644 --- a/swagger/sdrangel/api/swagger/include/AudioInput.yaml +++ b/swagger/sdrangel/api/swagger/include/AudioInput.yaml @@ -33,6 +33,13 @@ AudioInputSettings: Auto IQ balance (you need auto DC blocking active) * 0 - Off * 1 - On + fcPos: + type: integer + description: > + Decimated bandpass center frequency position + * 0 - Infradyne + * 1 - Supradyne + * 2 - Centered useReverseAPI: description: Synchronize with reverse API (1 for yes, 0 for no) type: integer diff --git a/swagger/sdrangel/code/html2/index.html b/swagger/sdrangel/code/html2/index.html index 2d4ce2c29..c773bcbb9 100644 --- a/swagger/sdrangel/code/html2/index.html +++ b/swagger/sdrangel/code/html2/index.html @@ -2457,6 +2457,10 @@ margin-bottom: 20px; "type" : "integer", "description" : "Auto IQ balance (you need auto DC blocking active)\n * 0 - Off\n * 1 - On\n" }, + "fcPos" : { + "type" : "integer", + "description" : "Decimated bandpass center frequency position\n * 0 - Infradyne\n * 1 - Supradyne\n * 2 - Centered\n" + }, "useReverseAPI" : { "type" : "integer", "description" : "Synchronize with reverse API (1 for yes, 0 for no)" @@ -57256,7 +57260,7 @@ except ApiException as e:
- Generated 2023-03-11T04:40:02.823+01:00 + Generated 2023-03-11T09:38:49.252+01:00
diff --git a/swagger/sdrangel/code/qt5/client/SWGAudioInputSettings.cpp b/swagger/sdrangel/code/qt5/client/SWGAudioInputSettings.cpp index 6d5e34ad4..d71aa5a82 100644 --- a/swagger/sdrangel/code/qt5/client/SWGAudioInputSettings.cpp +++ b/swagger/sdrangel/code/qt5/client/SWGAudioInputSettings.cpp @@ -42,6 +42,8 @@ SWGAudioInputSettings::SWGAudioInputSettings() { m_dc_block_isSet = false; iq_imbalance = 0; m_iq_imbalance_isSet = false; + fc_pos = 0; + m_fc_pos_isSet = false; use_reverse_api = 0; m_use_reverse_api_isSet = false; reverse_api_address = nullptr; @@ -72,6 +74,8 @@ SWGAudioInputSettings::init() { m_dc_block_isSet = false; iq_imbalance = 0; m_iq_imbalance_isSet = false; + fc_pos = 0; + m_fc_pos_isSet = false; use_reverse_api = 0; m_use_reverse_api_isSet = false; reverse_api_address = new QString(""); @@ -94,6 +98,7 @@ SWGAudioInputSettings::cleanup() { + if(reverse_api_address != nullptr) { delete reverse_api_address; } @@ -126,6 +131,8 @@ SWGAudioInputSettings::fromJsonObject(QJsonObject &pJson) { ::SWGSDRangel::setValue(&iq_imbalance, pJson["iqImbalance"], "qint32", ""); + ::SWGSDRangel::setValue(&fc_pos, pJson["fcPos"], "qint32", ""); + ::SWGSDRangel::setValue(&use_reverse_api, pJson["useReverseAPI"], "qint32", ""); ::SWGSDRangel::setValue(&reverse_api_address, pJson["reverseAPIAddress"], "QString", "QString"); @@ -171,6 +178,9 @@ SWGAudioInputSettings::asJsonObject() { if(m_iq_imbalance_isSet){ obj->insert("iqImbalance", QJsonValue(iq_imbalance)); } + if(m_fc_pos_isSet){ + obj->insert("fcPos", QJsonValue(fc_pos)); + } if(m_use_reverse_api_isSet){ obj->insert("useReverseAPI", QJsonValue(use_reverse_api)); } @@ -257,6 +267,16 @@ SWGAudioInputSettings::setIqImbalance(qint32 iq_imbalance) { this->m_iq_imbalance_isSet = true; } +qint32 +SWGAudioInputSettings::getFcPos() { + return fc_pos; +} +void +SWGAudioInputSettings::setFcPos(qint32 fc_pos) { + this->fc_pos = fc_pos; + this->m_fc_pos_isSet = true; +} + qint32 SWGAudioInputSettings::getUseReverseApi() { return use_reverse_api; @@ -323,6 +343,9 @@ SWGAudioInputSettings::isSet(){ if(m_iq_imbalance_isSet){ isObjectUpdated = true; break; } + if(m_fc_pos_isSet){ + isObjectUpdated = true; break; + } if(m_use_reverse_api_isSet){ isObjectUpdated = true; break; } diff --git a/swagger/sdrangel/code/qt5/client/SWGAudioInputSettings.h b/swagger/sdrangel/code/qt5/client/SWGAudioInputSettings.h index ca8bb7fbf..ea021a993 100644 --- a/swagger/sdrangel/code/qt5/client/SWGAudioInputSettings.h +++ b/swagger/sdrangel/code/qt5/client/SWGAudioInputSettings.h @@ -63,6 +63,9 @@ public: qint32 getIqImbalance(); void setIqImbalance(qint32 iq_imbalance); + qint32 getFcPos(); + void setFcPos(qint32 fc_pos); + qint32 getUseReverseApi(); void setUseReverseApi(qint32 use_reverse_api); @@ -100,6 +103,9 @@ private: qint32 iq_imbalance; bool m_iq_imbalance_isSet; + qint32 fc_pos; + bool m_fc_pos_isSet; + qint32 use_reverse_api; bool m_use_reverse_api_isSet;