From a5b742875560956c3b2f2e0af3fe2c1f14ec9661 Mon Sep 17 00:00:00 2001 From: f4exb Date: Fri, 25 Aug 2017 15:29:45 +0200 Subject: [PATCH] UDP sink plugin: implemented a gain input control for real sample input --- plugins/channelrx/udpsrc/udpsrcgui.ui | 3 + plugins/channeltx/udpsink/udpsink.cpp | 24 ++++--- plugins/channeltx/udpsink/udpsink.h | 29 ++++++--- plugins/channeltx/udpsink/udpsinkgui.cpp | 29 ++++++--- plugins/channeltx/udpsink/udpsinkgui.h | 3 +- plugins/channeltx/udpsink/udpsinkgui.ui | 79 +++++++++++++++++++----- 6 files changed, 121 insertions(+), 46 deletions(-) diff --git a/plugins/channelrx/udpsrc/udpsrcgui.ui b/plugins/channelrx/udpsrc/udpsrcgui.ui index c2a512440..d1bee88ca 100644 --- a/plugins/channelrx/udpsrc/udpsrcgui.ui +++ b/plugins/channelrx/udpsrc/udpsrcgui.ui @@ -351,6 +351,9 @@ 0 + + UDP <address>:<data port>/<audio port> + 00.000.000.000:0000/0000 diff --git a/plugins/channeltx/udpsink/udpsink.cpp b/plugins/channeltx/udpsink/udpsink.cpp index 51ef0ca4d..b9d03bac7 100644 --- a/plugins/channeltx/udpsink/udpsink.cpp +++ b/plugins/channeltx/udpsink/udpsink.cpp @@ -134,8 +134,8 @@ void UDPSink::modulateSample() if (m_squelchOpen) { - m_modSample.real(s.m_real * m_running.m_gain); - m_modSample.imag(s.m_imag * m_running.m_gain); + m_modSample.real(s.m_real * m_running.m_gainOut); + m_modSample.imag(s.m_imag * m_running.m_gainOut); calculateLevel(m_modSample); } else @@ -157,8 +157,8 @@ void UDPSink::modulateSample() if (m_squelchOpen) { m_modPhasor += (m_running.m_fmDeviation / m_running.m_inputSampleRate) * (t / 32768.0f) * M_PI * 2.0f; - m_modSample.real(cos(m_modPhasor) * 10362.2f * m_running.m_gain); - m_modSample.imag(sin(m_modPhasor) * 10362.2f * m_running.m_gain); + m_modSample.real(cos(m_modPhasor) * 10362.2f * m_running.m_gainOut); + m_modSample.imag(sin(m_modPhasor) * 10362.2f * m_running.m_gainOut); calculateLevel(m_modSample); } else @@ -178,7 +178,7 @@ void UDPSink::modulateSample() if (m_squelchOpen) { - m_modSample.real(((t / 32768.0f)*m_running.m_amModFactor*m_running.m_gain + 1.0f) * 16384.0f); // modulate and scale zero frequency carrier + m_modSample.real(((t / 32768.0f)*m_running.m_amModFactor*m_running.m_gainOut + 1.0f) * 16384.0f); // modulate and scale zero frequency carrier m_modSample.imag(0.0f); calculateLevel(m_modSample); } @@ -203,7 +203,7 @@ void UDPSink::modulateSample() if (m_squelchOpen) { - ci.real((t / 32768.0f) * m_running.m_gain); + ci.real((t / 32768.0f) * m_running.m_gainOut); ci.imag(0.0f); n_out = m_SSBFilter->runSSB(ci, &filtered, (m_running.m_sampleFormat == FormatUSB)); @@ -319,7 +319,8 @@ bool UDPSink::handleMessage(const Message& cmd) m_config.m_udpAddressStr = cfg.getUDPAddress(); m_config.m_udpPort = cfg.getUDPPort(); m_config.m_channelMute = cfg.getChannelMute(); - m_config.m_gain = cfg.getGain(); + m_config.m_gainIn = cfg.getGainIn(); + m_config.m_gainOut = cfg.getGainOut(); m_config.m_squelch = CalcDb::powerFromdB(cfg.getSquelchDB()); m_config.m_squelchGate = cfg.getSquelchGate(); m_config.m_squelchEnabled = cfg.getSquelchEnabled(); @@ -336,7 +337,8 @@ bool UDPSink::handleMessage(const Message& cmd) << " m_udpAddressStr: " << m_config.m_udpAddressStr << " m_udpPort: " << m_config.m_udpPort << " m_channelMute: " << m_config.m_channelMute - << " m_gain: " << m_config.m_gain + << " m_gainIn: " << m_config.m_gainIn + << " m_gainOut: " << m_config.m_gainOut << " squelchDB: " << cfg.getSquelchDB() << " m_squelchGate: " << m_config.m_squelchGate << " m_squelch: " << m_config.m_squelch @@ -438,7 +440,8 @@ void UDPSink::configure(MessageQueue* messageQueue, const QString& udpAddress, int udpPort, bool channelMute, - Real gain, + Real gainIn, + Real gainOut, Real squelchDB, Real squelchGate, bool squelchEnabled, @@ -454,7 +457,8 @@ void UDPSink::configure(MessageQueue* messageQueue, udpAddress, udpPort, channelMute, - gain, + gainIn, + gainOut, squelchDB, squelchGate, squelchEnabled, diff --git a/plugins/channeltx/udpsink/udpsink.h b/plugins/channeltx/udpsink/udpsink.h index dd63b750a..b8d2f41fe 100644 --- a/plugins/channeltx/udpsink/udpsink.h +++ b/plugins/channeltx/udpsink/udpsink.h @@ -66,7 +66,8 @@ public: const QString& udpAddress, int udpPort, bool channelMute, - Real gain, + Real gainIn, + Real gainOut, Real squelchDB, Real squelchGate, bool squelchEnabled, @@ -98,7 +99,8 @@ private: const QString& getUDPAddress() const { return m_udpAddress; } int getUDPPort() const { return m_udpPort; } bool getChannelMute() const { return m_channelMute; } - Real getGain() const { return m_gain; } + Real getGainIn() const { return m_gainIn; } + Real getGainOut() const { return m_gainOut; } Real getSquelchDB() const { return m_squelchDB; } Real getSquelchGate() const { return m_squelchGate; } bool getSquelchEnabled() const { return m_squelchEnabled; } @@ -115,7 +117,8 @@ private: const QString& udpAddress, int udpPort, bool channelMute, - Real gain, + Real gainIn, + Real gainOut, Real squelchDB, Real squelchGate, bool squelchEnabled, @@ -131,7 +134,8 @@ private: udpAddress, udpPort, channelMute, - gain, + gainIn, + gainOut, squelchDB, squelchGate, squelchEnabled, @@ -149,7 +153,8 @@ private: QString m_udpAddress; int m_udpPort; bool m_channelMute; - Real m_gain; + Real m_gainIn; + Real m_gainOut; Real m_squelchDB; Real m_squelchGate; bool m_squelchEnabled; @@ -165,7 +170,8 @@ private: const QString& udpAddress, int udpPort, bool channelMute, - Real gain, + Real gainIn, + Real gainOut, Real squelchDB, Real squelchGate, bool squelchEnabled, @@ -181,7 +187,8 @@ private: m_udpAddress(udpAddress), m_udpPort(udpPort), m_channelMute(channelMute), - m_gain(gain), + m_gainIn(gainIn), + m_gainOut(gainOut), m_squelchDB(squelchDB), m_squelchGate(squelchGate), m_squelchEnabled(squelchEnabled), @@ -239,7 +246,8 @@ private: int m_fmDeviation; Real m_amModFactor; bool m_channelMute; - Real m_gain; + Real m_gainIn; + Real m_gainOut; Real m_squelch; //!< squared magnitude Real m_squelchGate; //!< seconds bool m_squelchEnabled; @@ -260,7 +268,8 @@ private: m_fmDeviation(1.0), m_amModFactor(0.95), m_channelMute(false), - m_gain(1.0), + m_gainIn(1.0), + m_gainOut(1.0), m_squelch(-50.0), m_squelchGate(0.05), m_squelchEnabled(true), @@ -390,7 +399,7 @@ private: if (m_running.m_stereoInput) { m_udpHandler.readSample(s); - t = (s.m_real + s.m_imag) / 2; + t = ((s.m_real + s.m_imag) * m_running.m_gainIn) / 2; } else { diff --git a/plugins/channeltx/udpsink/udpsinkgui.cpp b/plugins/channeltx/udpsink/udpsinkgui.cpp index c6f1ef56d..20e69a01b 100644 --- a/plugins/channeltx/udpsink/udpsinkgui.cpp +++ b/plugins/channeltx/udpsink/udpsinkgui.cpp @@ -69,7 +69,8 @@ void UDPSinkGUI::resetToDefaults() ui->rfBandwidth->setText("32000"); ui->fmDeviation->setText("2500"); ui->spectrumGUI->resetToDefaults(); - ui->gain->setValue(10); + ui->gainIn->setValue(10); + ui->gainOut->setValue(10); blockApplySettings(false); applySettings(); @@ -87,13 +88,14 @@ QByteArray UDPSinkGUI::serialize() const s.writeBlob(7, ui->spectrumGUI->serialize()); s.writeS32(8, m_channelMarker.getCenterFrequency()); s.writeString(9, m_channelMarker.getUDPAddress()); - s.writeS32(10, ui->gain->value()); + s.writeS32(10, ui->gainOut->value()); s.writeS32(11, m_fmDeviation); s.writeU32(12, m_channelMarker.getColor().rgb()); s.writeString(13, m_channelMarker.getTitle()); s.writeS32(14, ui->squelch->value()); s.writeS32(15, ui->squelchGate->value()); s.writeBool(16, ui->autoRWBalance->isChecked()); + s.writeS32(17, ui->gainIn->value()); return s.final(); } @@ -147,8 +149,8 @@ bool UDPSinkGUI::deserialize(const QByteArray& data) d.readString(9, &strtmp, "127.0.0.1"); m_channelMarker.setUDPAddress(strtmp); d.readS32(10, &s32tmp, 10); - ui->gain->setValue(s32tmp); - ui->gainText->setText(tr("%1").arg(s32tmp/10.0, 0, 'f', 1)); + ui->gainOut->setValue(s32tmp); + ui->gainOutText->setText(tr("%1").arg(s32tmp/10.0, 0, 'f', 1)); d.readS32(11, &s32tmp, 2500); ui->fmDeviation->setText(QString("%1").arg(s32tmp)); @@ -166,6 +168,9 @@ bool UDPSinkGUI::deserialize(const QByteArray& data) ui->squelchGateText->setText(tr("%1").arg(s32tmp*10.0, 0, 'f', 0)); d.readBool(16, &booltmp, true); ui->autoRWBalance->setChecked(booltmp); + d.readS32(17, &s32tmp, 10); + ui->gainIn->setValue(s32tmp); + ui->gainInText->setText(tr("%1").arg(s32tmp/10.0, 0, 'f', 1)); blockApplySettings(false); m_channelMarker.blockSignals(false); @@ -374,7 +379,8 @@ void UDPSinkGUI::applySettings(bool force) m_channelMarker.getUDPAddress(), m_channelMarker.getUDPReceivePort(), ui->channelMute->isChecked(), - ui->gain->value() / 10.0f, + ui->gainIn->value() / 10.0f, + ui->gainOut->value() / 10.0f, ui->squelch->value() * 1.0f, ui->squelchGate->value() * 0.01f, ui->squelch->value() != -100, @@ -389,7 +395,8 @@ void UDPSinkGUI::applySettings(bool force) void UDPSinkGUI::displaySettings() { - ui->gainText->setText(tr("%1").arg(ui->gain->value()/10.0, 0, 'f', 1)); + ui->gainInText->setText(tr("%1").arg(ui->gainIn->value()/10.0, 0, 'f', 1)); + ui->gainOutText->setText(tr("%1").arg(ui->gainOut->value()/10.0, 0, 'f', 1)); ui->squelchText->setText(tr("%1").arg(ui->squelch->value()*1.0, 0, 'f', 0)); ui->squelchGateText->setText(tr("%1").arg(ui->squelchGate->value()*10.0, 0, 'f', 0)); ui->addressText->setText(tr("%1:%2").arg(m_channelMarker.getUDPAddress()).arg(m_channelMarker.getUDPReceivePort())); @@ -461,9 +468,15 @@ void UDPSinkGUI::on_udpPort_textEdited(const QString& arg1 __attribute__((unused ui->applyBtn->setStyleSheet("QPushButton { background-color : green; }"); } -void UDPSinkGUI::on_gain_valueChanged(int value) +void UDPSinkGUI::on_gainIn_valueChanged(int value) { - ui->gainText->setText(tr("%1").arg(value/10.0, 0, 'f', 1)); + ui->gainInText->setText(tr("%1").arg(value/10.0, 0, 'f', 1)); + applySettings(); +} + +void UDPSinkGUI::on_gainOut_valueChanged(int value) +{ + ui->gainOutText->setText(tr("%1").arg(value/10.0, 0, 'f', 1)); applySettings(); } diff --git a/plugins/channeltx/udpsink/udpsinkgui.h b/plugins/channeltx/udpsink/udpsinkgui.h index 4d1910896..88c9d89d2 100644 --- a/plugins/channeltx/udpsink/udpsinkgui.h +++ b/plugins/channeltx/udpsink/udpsinkgui.h @@ -68,7 +68,8 @@ private slots: void on_applyBtn_clicked(); void onWidgetRolled(QWidget* widget, bool rollDown); void onMenuDialogCalled(const QPoint& p); - void on_gain_valueChanged(int value); + void on_gainIn_valueChanged(int value); + void on_gainOut_valueChanged(int value); void on_squelch_valueChanged(int value); void on_squelchGate_valueChanged(int value); void on_channelMute_toggled(bool checked); diff --git a/plugins/channeltx/udpsink/udpsinkgui.ui b/plugins/channeltx/udpsink/udpsinkgui.ui index 5472fcaa7..b0e8a70ae 100644 --- a/plugins/channeltx/udpsink/udpsinkgui.ui +++ b/plugins/channeltx/udpsink/udpsinkgui.ui @@ -6,8 +6,8 @@ 0 0 - 342 - 400 + 388 + 403 @@ -42,13 +42,13 @@ 2 2 - 340 + 380 141 - 340 + 380 0 @@ -218,20 +218,65 @@ - - - - 0 - 22 - - + - Gain + Gi - + + + + 22 + 22 + + + + 100 + + + 1 + + + 1 + + + 10 + + + + + + + + 32 + 0 + + + + 10.0 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + Go + + + + + + + + 22 + 22 + + 100 @@ -241,13 +286,10 @@ 10 - - Qt::Horizontal - - + 32 @@ -827,6 +869,9 @@ 0 + + UDP <address>:<data port> + 000.000.000.000:00000