From 3b5fe0170f474c40ce718b230a857836ddd0a389 Mon Sep 17 00:00:00 2001 From: f4exb Date: Thu, 24 Aug 2017 08:46:14 +0200 Subject: [PATCH] DSD decoder: put UDP sink for audio in place --- plugins/channelrx/demoddsd/dsddemod.cpp | 56 ++++++++++++++++------ plugins/channelrx/demoddsd/dsddemod.h | 53 ++++++++++++++++---- plugins/channelrx/demoddsd/dsddemodgui.cpp | 12 +++-- plugins/channelrx/demoddsd/dsddemodgui.h | 2 +- plugins/channelrx/demoddsd/dsddemodgui.ui | 10 ++++ 5 files changed, 105 insertions(+), 28 deletions(-) diff --git a/plugins/channelrx/demoddsd/dsddemod.cpp b/plugins/channelrx/demoddsd/dsddemod.cpp index adc308ea5..afad2569f 100644 --- a/plugins/channelrx/demoddsd/dsddemod.cpp +++ b/plugins/channelrx/demoddsd/dsddemod.cpp @@ -25,11 +25,13 @@ #include "audio/audiooutput.h" #include "dsp/pidcontroller.h" #include "dsp/dspengine.h" -#include "../../channelrx/demoddsd/dsddemodgui.h" +#include "dsddemodgui.h" MESSAGE_CLASS_DEFINITION(DSDDemod::MsgConfigureDSDDemod, Message) MESSAGE_CLASS_DEFINITION(DSDDemod::MsgConfigureMyPosition, Message) +const int DSDDemod::m_udpBlockSize = 512; + DSDDemod::DSDDemod(BasebandSampleSink* sampleSink) : m_sampleCount(0), m_squelchCount(0), @@ -74,10 +76,13 @@ DSDDemod::DSDDemod(BasebandSampleSink* sampleSink) : DSPEngine::instance()->addAudioSink(&m_audioFifo1); DSPEngine::instance()->addAudioSink(&m_audioFifo2); + + m_udpBufferMono = new UDPSink(this, m_udpBlockSize, m_config.m_udpPort); } DSDDemod::~DSDDemod() { + delete m_udpBufferMono; delete[] m_sampleBuffer; DSPEngine::instance()->removeAudioSink(&m_audioFifo1); DSPEngine::instance()->removeAudioSink(&m_audioFifo2); @@ -97,7 +102,11 @@ void DSDDemod::configure(MessageQueue* messageQueue, bool slot1On, bool slot2On, bool tdmaStereo, - bool pllLock) + bool pllLock, + bool udpCopyAudio, + const QString& udpAddress, + quint16 udpPort, + bool force) { Message* cmd = MsgConfigureDSDDemod::create(rfBandwidth, demodGain, @@ -112,7 +121,11 @@ void DSDDemod::configure(MessageQueue* messageQueue, slot1On, slot2On, tdmaStereo, - pllLock); + pllLock, + udpCopyAudio, + udpAddress, + udpPort, + force); messageQueue->push(cmd); } @@ -367,6 +380,9 @@ bool DSDDemod::handleMessage(const Message& cmd) m_config.m_slot2On = cfg.getSlot2On(); m_config.m_tdmaStereo = cfg.getTDMAStereo(); m_config.m_pllLock = cfg.getPLLLock(); + m_config.m_udpCopyAudio = cfg.getUDPCopyAudio(); + m_config.m_udpAddress = cfg.getUDPAddress(); + m_config.m_udpPort = cfg.getUDPPort(); apply(); @@ -383,7 +399,10 @@ bool DSDDemod::handleMessage(const Message& cmd) << " m_slot1On: " << m_config.m_slot1On << " m_slot2On: " << m_config.m_slot2On << " m_tdmaStereo: " << m_config.m_tdmaStereo - << " m_pllLock: " << m_config.m_pllLock; + << " m_pllLock: " << m_config.m_pllLock + << " m_udpCopyAudio: " << m_config.m_udpCopyAudio + << " m_udpAddress: " << m_config.m_udpAddress + << " m_udpPort: " << m_config.m_udpPort; return true; } @@ -399,16 +418,16 @@ bool DSDDemod::handleMessage(const Message& cmd) } } -void DSDDemod::apply() +void DSDDemod::apply(bool force) { if ((m_config.m_inputFrequencyOffset != m_running.m_inputFrequencyOffset) || - (m_config.m_inputSampleRate != m_running.m_inputSampleRate)) + (m_config.m_inputSampleRate != m_running.m_inputSampleRate) || force) { m_nco.setFreq(-m_config.m_inputFrequencyOffset, m_config.m_inputSampleRate); } if ((m_config.m_inputSampleRate != m_running.m_inputSampleRate) || - (m_config.m_rfBandwidth != m_running.m_rfBandwidth)) + (m_config.m_rfBandwidth != m_running.m_rfBandwidth) || force) { m_settingsMutex.lock(); m_interpolator.create(16, m_config.m_inputSampleRate, (m_config.m_rfBandwidth * 100) / 2.2); @@ -418,49 +437,56 @@ void DSDDemod::apply() m_settingsMutex.unlock(); } - if (m_config.m_fmDeviation != m_running.m_fmDeviation) + if ((m_config.m_fmDeviation != m_running.m_fmDeviation) || force) { m_phaseDiscri.setFMScaling((float) m_config.m_rfBandwidth / (float) m_config.m_fmDeviation); } - if (m_config.m_squelchGate != m_running.m_squelchGate) + if ((m_config.m_squelchGate != m_running.m_squelchGate) || force) { m_squelchGate = 480 * m_config.m_squelchGate; // gate is given in 10s of ms at 48000 Hz audio sample rate m_squelchCount = 0; // reset squelch open counter } - if (m_config.m_squelch != m_running.m_squelch) + if ((m_config.m_squelch != m_running.m_squelch) || force) { // input is a value in tenths of dB m_squelchLevel = std::pow(10.0, m_config.m_squelch / 100.0); //m_squelchLevel *= m_squelchLevel; } - if (m_config.m_volume != m_running.m_volume) + if ((m_config.m_volume != m_running.m_volume) || force) { m_dsdDecoder.setAudioGain(m_config.m_volume / 10.0f); } - if (m_config.m_baudRate != m_running.m_baudRate) + if ((m_config.m_baudRate != m_running.m_baudRate) || force) { m_dsdDecoder.setBaudRate(m_config.m_baudRate); } - if (m_config.m_enableCosineFiltering != m_running.m_enableCosineFiltering) + if ((m_config.m_enableCosineFiltering != m_running.m_enableCosineFiltering) || force) { m_dsdDecoder.enableCosineFiltering(m_config.m_enableCosineFiltering); } - if (m_config.m_tdmaStereo != m_running.m_tdmaStereo) + if ((m_config.m_tdmaStereo != m_running.m_tdmaStereo) || force) { m_dsdDecoder.setTDMAStereo(m_config.m_tdmaStereo); } - if (m_config.m_pllLock != m_running.m_pllLock) + if ((m_config.m_pllLock != m_running.m_pllLock) || force) { m_dsdDecoder.setSymbolPLLLock(m_config.m_pllLock); } + if ((m_config.m_udpAddress != m_running.m_udpAddress) + || (m_config.m_udpPort != m_running.m_udpPort) || force) + { + m_udpBufferMono->setAddress(m_config.m_udpAddress); + m_udpBufferMono->setPort(m_config.m_udpPort); + } + m_running.m_inputSampleRate = m_config.m_inputSampleRate; m_running.m_inputFrequencyOffset = m_config.m_inputFrequencyOffset; m_running.m_rfBandwidth = m_config.m_rfBandwidth; diff --git a/plugins/channelrx/demoddsd/dsddemod.h b/plugins/channelrx/demoddsd/dsddemod.h index 011d4f797..0d1e960ea 100644 --- a/plugins/channelrx/demoddsd/dsddemod.h +++ b/plugins/channelrx/demoddsd/dsddemod.h @@ -31,8 +31,9 @@ #include "dsp/afsquelch.h" #include "audio/audiofifo.h" #include "util/message.h" +#include "util/udpsink.h" -#include "../../channelrx/demoddsd/dsddecoder.h" +#include "dsddecoder.h" class DSDDemodGUI; @@ -55,7 +56,11 @@ public: bool slot1On, bool slot2On, bool tdmaStereo, - bool pllLock); + bool pllLock, + bool udpCopyAudio, + const QString& udpAddress, + quint16 udpPort, + bool force); void configureMyPosition(MessageQueue* messageQueue, float myLatitude, float myLongitude); @@ -126,6 +131,9 @@ private: bool getSlot2On() const { return m_slot2On; } bool getTDMAStereo() const { return m_tdmaStereo; } bool getPLLLock() const { return m_pllLock; } + bool getUDPCopyAudio() const { return m_udpCopyAudio; } + const QString& getUDPAddress() const { return m_udpAddress; } + quint16 getUDPPort() const { return m_udpPort; } static MsgConfigureDSDDemod* create(int rfBandwidth, int demodGain, @@ -140,7 +148,11 @@ private: bool slot1On, bool slot2On, bool tdmaStereo, - bool pllLock) + bool pllLock, + bool udpCopyAudio, + const QString& udpAddress, + quint16 udpPort, + bool force) { return new MsgConfigureDSDDemod(rfBandwidth, demodGain, @@ -155,7 +167,11 @@ private: slot1On, slot2On, tdmaStereo, - pllLock); + pllLock, + udpCopyAudio, + udpAddress, + udpPort, + force); } private: @@ -173,6 +189,10 @@ private: bool m_slot2On; bool m_tdmaStereo; bool m_pllLock; + bool m_udpCopyAudio; + QString m_udpAddress; + quint16 m_udpPort; + bool m_force; MsgConfigureDSDDemod(int rfBandwidth, int demodGain, @@ -187,7 +207,11 @@ private: bool slot1On, bool slot2On, bool tdmaStereo, - bool pllLock) : + bool pllLock, + bool udpCopyAudio, + const QString& udpAddress, + quint16 udpPort, + bool force) : Message(), m_rfBandwidth(rfBandwidth), m_demodGain(demodGain), @@ -202,7 +226,11 @@ private: m_slot1On(slot1On), m_slot2On(slot2On), m_tdmaStereo(tdmaStereo), - m_pllLock(pllLock) + m_pllLock(pllLock), + m_udpCopyAudio(udpCopyAudio), + m_udpAddress(udpAddress), + m_udpPort(udpPort), + m_force(force) { } }; @@ -235,6 +263,9 @@ private: bool m_slot2On; bool m_tdmaStereo; bool m_pllLock; + bool m_udpCopyAudio; + QString m_udpAddress; + quint16 m_udpPort; Config() : m_inputSampleRate(-1), @@ -253,7 +284,10 @@ private: m_slot1On(false), m_slot2On(false), m_tdmaStereo(false), - m_pllLock(true) + m_pllLock(true), + m_udpCopyAudio(false), + m_udpAddress("127.0.0.1"), + m_udpPort(9999) { } }; @@ -296,8 +330,11 @@ private: QMutex m_settingsMutex; PhaseDiscriminators m_phaseDiscri; + UDPSink *m_udpBufferMono; - void apply(); + static const int m_udpBlockSize; + + void apply(bool force = false); }; #endif // INCLUDE_DSDDEMOD_H diff --git a/plugins/channelrx/demoddsd/dsddemodgui.cpp b/plugins/channelrx/demoddsd/dsddemodgui.cpp index ae8bba27a..7ce0e7d02 100644 --- a/plugins/channelrx/demoddsd/dsddemodgui.cpp +++ b/plugins/channelrx/demoddsd/dsddemodgui.cpp @@ -180,7 +180,7 @@ bool DSDDemodGUI::deserialize(const QByteArray& data) m_channelMarker.blockSignals(false); updateMyPosition(); // we do it also here to be able to refresh with latest settings - applySettings(); + applySettings(true); return true; } else @@ -360,7 +360,7 @@ DSDDemodGUI::DSDDemodGUI(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI, QWidg ui->scopeGUI->setBuddies(m_scopeVis->getInputMessageQueue(), m_scopeVis, ui->glScope); updateMyPosition(); - applySettings(); + applySettings(true); } DSDDemodGUI::~DSDDemodGUI() @@ -387,7 +387,7 @@ void DSDDemodGUI::updateMyPosition() } } -void DSDDemodGUI::applySettings() +void DSDDemodGUI::applySettings(bool force) { if (m_doApplySettings) { @@ -425,7 +425,11 @@ void DSDDemodGUI::applySettings() m_slot1On, m_slot2On, m_tdmaStereo, - ui->symbolPLLLock->isChecked()); + ui->symbolPLLLock->isChecked(), + ui->udpOutput->isChecked(), + m_channelMarker.getUDPAddress(), + m_channelMarker.getUDPSendPort(), + force); } } diff --git a/plugins/channelrx/demoddsd/dsddemodgui.h b/plugins/channelrx/demoddsd/dsddemodgui.h index 2edcd40fd..aa2a7ba38 100644 --- a/plugins/channelrx/demoddsd/dsddemodgui.h +++ b/plugins/channelrx/demoddsd/dsddemodgui.h @@ -119,7 +119,7 @@ private: virtual ~DSDDemodGUI(); void blockApplySettings(bool block); - void applySettings(); + void applySettings(bool force = false); void updateMyPosition(); void leaveEvent(QEvent*); diff --git a/plugins/channelrx/demoddsd/dsddemodgui.ui b/plugins/channelrx/demoddsd/dsddemodgui.ui index f55eeae44..32e9dc008 100644 --- a/plugins/channelrx/demoddsd/dsddemodgui.ui +++ b/plugins/channelrx/demoddsd/dsddemodgui.ui @@ -843,6 +843,16 @@ + + + + Copy audio output to UDP + + + U + + +