From cf2f099c3784765dcc043c73340e112d16d01ea6 Mon Sep 17 00:00:00 2001 From: f4exb Date: Tue, 21 Nov 2017 23:30:09 +0100 Subject: [PATCH] WFM demod: implemented copy audio to UDP --- plugins/channelrx/demodssb/ssbdemodsettings.h | 2 +- plugins/channelrx/demodwfm/wfmdemod.cpp | 18 ++++++++++++++++-- plugins/channelrx/demodwfm/wfmdemod.h | 5 ++++- plugins/channelrx/demodwfm/wfmdemodgui.cpp | 8 +++++++- plugins/channelrx/demodwfm/wfmdemodgui.h | 1 + plugins/channelrx/demodwfm/wfmdemodgui.ui | 15 +++++++++++++++ plugins/channelrx/demodwfm/wfmplugin.cpp | 2 +- 7 files changed, 45 insertions(+), 6 deletions(-) diff --git a/plugins/channelrx/demodssb/ssbdemodsettings.h b/plugins/channelrx/demodssb/ssbdemodsettings.h index dd5249f8c..23ef18b43 100644 --- a/plugins/channelrx/demodssb/ssbdemodsettings.h +++ b/plugins/channelrx/demodssb/ssbdemodsettings.h @@ -34,9 +34,9 @@ struct SSBDemodSettings bool m_audioFlipChannels; bool m_dsb; bool m_audioMute; + bool m_copyAudioToUDP; bool m_agc; bool m_agcClamping; - bool m_copyAudioToUDP; int m_agcTimeLog2; int m_agcPowerThreshold; int m_agcThresholdGate; diff --git a/plugins/channelrx/demodwfm/wfmdemod.cpp b/plugins/channelrx/demodwfm/wfmdemod.cpp index acb3a4ce2..3c2ffbbac 100644 --- a/plugins/channelrx/demodwfm/wfmdemod.cpp +++ b/plugins/channelrx/demodwfm/wfmdemod.cpp @@ -34,6 +34,7 @@ MESSAGE_CLASS_DEFINITION(WFMDemod::MsgConfigureWFMDemod, Message) MESSAGE_CLASS_DEFINITION(WFMDemod::MsgConfigureChannelizer, Message) const QString WFMDemod::m_channelID = "de.maintech.sdrangelove.channel.wfm"; +const int WFMDemod::m_udpBlockSize = 512; WFMDemod::WFMDemod(DeviceSourceAPI* deviceAPI) : m_deviceAPI(deviceAPI), @@ -60,6 +61,7 @@ WFMDemod::WFMDemod(DeviceSourceAPI* deviceAPI) : m_movingAverage.resize(16, 0); DSPEngine::instance()->addAudioSink(&m_audioFifo); + m_udpBufferAudio = new UDPSink(this, m_udpBlockSize, m_settings.m_udpPort); m_channelizer = new DownChannelizer(this); m_threadedChannelizer = new ThreadedBasebandSampleSink(m_channelizer, this); @@ -82,6 +84,8 @@ WFMDemod::~WFMDemod() m_deviceAPI->removeThreadedSink(m_threadedChannelizer); delete m_threadedChannelizer; delete m_channelizer; + + delete m_udpBufferAudio; } void WFMDemod::feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, bool firstOfBurst __attribute__((unused))) @@ -141,10 +145,13 @@ void WFMDemod::feed(const SampleVector::const_iterator& begin, const SampleVecto if(m_interpolator.decimate(&m_interpolatorDistanceRemain, e, &ci)) { - quint16 sample = (qint16)(ci.real() * 3276.8f * m_settings.m_volume); + qint16 sample = (qint16)(ci.real() * 3276.8f * m_settings.m_volume); m_sampleBuffer.push_back(Sample(sample, sample)); m_audioBuffer[m_audioBufferFill].l = sample; m_audioBuffer[m_audioBufferFill].r = sample; + + if (m_settings.m_copyAudioToUDP) { m_udpBufferAudio->write(sample); } + ++m_audioBufferFill; if(m_audioBufferFill >= m_audioBuffer.size()) @@ -176,7 +183,7 @@ void WFMDemod::feed(const SampleVector::const_iterator& begin, const SampleVecto m_audioBufferFill = 0; } - if(m_sampleSink != NULL) + if(m_sampleSink != 0) { m_sampleSink->feed(m_sampleBuffer.begin(), m_sampleBuffer.end(), false); } @@ -303,5 +310,12 @@ void WFMDemod::applySettings(const WFMDemodSettings& settings, bool force) m_squelchLevel *= m_squelchLevel; } + if ((m_settings.m_udpAddress != settings.m_udpAddress) + || (m_settings.m_udpPort != settings.m_udpPort) || force) + { + m_udpBufferAudio->setAddress(const_cast(settings.m_udpAddress)); + m_udpBufferAudio->setPort(settings.m_udpPort); + } + m_settings = settings; } diff --git a/plugins/channelrx/demodwfm/wfmdemod.h b/plugins/channelrx/demodwfm/wfmdemod.h index 0e5086484..3c6249c4d 100644 --- a/plugins/channelrx/demodwfm/wfmdemod.h +++ b/plugins/channelrx/demodwfm/wfmdemod.h @@ -150,6 +150,7 @@ private: AudioVector m_audioBuffer; uint m_audioBufferFill; + UDPSink *m_udpBufferAudio; BasebandSampleSink* m_sampleSink; AudioFifo m_audioFifo; @@ -158,7 +159,9 @@ private: PhaseDiscriminators m_phaseDiscri; - void applySettings(const WFMDemodSettings& settings, bool force = false); + static const int m_udpBlockSize; + + void applySettings(const WFMDemodSettings& settings, bool force = false); }; #endif // INCLUDE_WFMDEMOD_H diff --git a/plugins/channelrx/demodwfm/wfmdemodgui.cpp b/plugins/channelrx/demodwfm/wfmdemodgui.cpp index 49ba8156d..2423ac54b 100644 --- a/plugins/channelrx/demodwfm/wfmdemodgui.cpp +++ b/plugins/channelrx/demodwfm/wfmdemodgui.cpp @@ -131,6 +131,12 @@ void WFMDemodGUI::on_audioMute_toggled(bool checked) applySettings(); } +void WFMDemodGUI::on_copyAudioToUDP_toggled(bool checked) +{ + m_settings.m_copyAudioToUDP = checked; + applySettings(); +} + void WFMDemodGUI::onWidgetRolled(QWidget* widget __attribute__((unused)), bool rollDown __attribute__((unused))) { } @@ -269,7 +275,7 @@ void WFMDemodGUI::displaySettings() void WFMDemodGUI::displayUDPAddress() { - //ui->copyAudioToUDP->setToolTip(QString("Copy audio output to UDP %1:%2").arg(m_channelMarker.getUDPAddress()).arg(m_channelMarker.getUDPSendPort())); + ui->copyAudioToUDP->setToolTip(QString("Copy audio output to UDP %1:%2").arg(m_settings.m_udpAddress).arg(m_settings.m_udpPort)); } void WFMDemodGUI::leaveEvent(QEvent*) diff --git a/plugins/channelrx/demodwfm/wfmdemodgui.h b/plugins/channelrx/demodwfm/wfmdemodgui.h index 78d8bb9be..7cc526232 100644 --- a/plugins/channelrx/demodwfm/wfmdemodgui.h +++ b/plugins/channelrx/demodwfm/wfmdemodgui.h @@ -82,6 +82,7 @@ private slots: void on_volume_valueChanged(int value); void on_squelch_valueChanged(int value); void on_audioMute_toggled(bool checked); + void on_copyAudioToUDP_toggled(bool copy); void onWidgetRolled(QWidget* widget, bool rollDown); void onMenuDialogCalled(const QPoint& p); void tick(); diff --git a/plugins/channelrx/demodwfm/wfmdemodgui.ui b/plugins/channelrx/demodwfm/wfmdemodgui.ui index 6fabad5e6..ab6ee3888 100644 --- a/plugins/channelrx/demodwfm/wfmdemodgui.ui +++ b/plugins/channelrx/demodwfm/wfmdemodgui.ui @@ -374,6 +374,16 @@ + + + + Copy audio to UDP + + + U + + + @@ -413,6 +423,11 @@
gui/valuedialz.h
1 + + ButtonSwitch + QToolButton +
gui/buttonswitch.h
+
diff --git a/plugins/channelrx/demodwfm/wfmplugin.cpp b/plugins/channelrx/demodwfm/wfmplugin.cpp index b07236ef8..d335ce428 100644 --- a/plugins/channelrx/demodwfm/wfmplugin.cpp +++ b/plugins/channelrx/demodwfm/wfmplugin.cpp @@ -8,7 +8,7 @@ const PluginDescriptor WFMPlugin::m_pluginDescriptor = { QString("WFM Demodulator"), - QString("3.8.2"), + QString("3.8.5"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true,