From a57fdb8bd740746bb5a68282a388c63da3bccb16 Mon Sep 17 00:00:00 2001 From: f4exb Date: Tue, 21 Nov 2017 21:33:46 +0100 Subject: [PATCH] SSB demod: implemented copy audio to UDP --- plugins/channelrx/demodssb/ssbdemod.cpp | 25 +++++++++----- plugins/channelrx/demodssb/ssbdemod.h | 2 ++ plugins/channelrx/demodssb/ssbdemodgui.cpp | 34 +++++++++++++++++-- plugins/channelrx/demodssb/ssbdemodgui.h | 2 ++ plugins/channelrx/demodssb/ssbdemodgui.ui | 26 ++++++++++++-- .../channelrx/demodssb/ssbdemodsettings.cpp | 3 ++ plugins/channelrx/demodssb/ssbdemodsettings.h | 1 + 7 files changed, 80 insertions(+), 13 deletions(-) diff --git a/plugins/channelrx/demodssb/ssbdemod.cpp b/plugins/channelrx/demodssb/ssbdemod.cpp index f50dbf4ab..f00345bbe 100644 --- a/plugins/channelrx/demodssb/ssbdemod.cpp +++ b/plugins/channelrx/demodssb/ssbdemod.cpp @@ -35,6 +35,7 @@ MESSAGE_CLASS_DEFINITION(SSBDemod::MsgConfigureSSBDemodPrivate, Message) MESSAGE_CLASS_DEFINITION(SSBDemod::MsgConfigureChannelizer, Message) const QString SSBDemod::m_channelID = "de.maintech.sdrangelove.channel.ssb"; +const int SSBDemod::m_udpBlockSize = 512; SSBDemod::SSBDemod(DeviceSourceAPI *deviceAPI) : m_deviceAPI(deviceAPI), @@ -85,6 +86,7 @@ SSBDemod::SSBDemod(DeviceSourceAPI *deviceAPI) : DSBFilter = new fftfilt((2.0f * m_Bandwidth) / m_audioSampleRate, 2 * ssbFftLen); 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); @@ -98,13 +100,14 @@ SSBDemod::~SSBDemod() { if (SSBFilter) delete SSBFilter; if (DSBFilter) delete DSBFilter; - DSPEngine::instance()->removeAudioSink(&m_audioFifo); m_deviceAPI->removeChannelAPI(this); m_deviceAPI->removeThreadedSink(m_threadedChannelizer); delete m_threadedChannelizer; delete m_channelizer; + + delete m_udpBufferAudio; } void SSBDemod::configure(MessageQueue* messageQueue, @@ -216,6 +219,8 @@ void SSBDemod::feed(const SampleVector::const_iterator& begin, const SampleVecto { m_audioBuffer[m_audioBufferFill].r = 0; m_audioBuffer[m_audioBufferFill].l = 0; + + if (m_settings.m_copyAudioToUDP) { m_udpBufferAudio->write(0); } } else { @@ -231,6 +236,8 @@ void SSBDemod::feed(const SampleVector::const_iterator& begin, const SampleVecto m_audioBuffer[m_audioBufferFill].r = (qint16)(sideband[i].real() * m_volume * agcVal); m_audioBuffer[m_audioBufferFill].l = (qint16)(sideband[i].imag() * m_volume * agcVal); } + + if (m_settings.m_copyAudioToUDP) { m_udpBufferAudio->write(m_audioBuffer[m_audioBufferFill].r + m_audioBuffer[m_audioBufferFill].l); } } else { @@ -238,6 +245,8 @@ void SSBDemod::feed(const SampleVector::const_iterator& begin, const SampleVecto qint16 sample = (qint16)(demod * m_volume * agcVal); m_audioBuffer[m_audioBufferFill].l = sample; m_audioBuffer[m_audioBufferFill].r = sample; + + if (m_settings.m_copyAudioToUDP) { m_udpBufferAudio->write(sample); } } } @@ -336,6 +345,7 @@ bool SSBDemod::handleMessage(const Message& cmd) << " m_audioFlipChannels: " << settings.m_audioFlipChannels << " m_dsb: " << settings.m_dsb << " m_audioMute: " << settings.m_audioMute + << " m_copyAudioToUDP: " << settings.m_copyAudioToUDP << " m_agcActive: " << settings.m_agc << " m_agcClamping: " << settings.m_agcClamping << " m_agcTimeLog2: " << settings.m_agcTimeLog2 @@ -451,13 +461,12 @@ void SSBDemod::applySettings(const SSBDemodSettings& settings, bool force) << " agcClamping: " << agcClamping; } -// TODO: -// 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); -// } + 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_spanLog2 = settings.m_spanLog2; m_audioBinaual = settings.m_audioBinaural; diff --git a/plugins/channelrx/demodssb/ssbdemod.h b/plugins/channelrx/demodssb/ssbdemod.h index 0c7215a2e..8c8671d6b 100644 --- a/plugins/channelrx/demodssb/ssbdemod.h +++ b/plugins/channelrx/demodssb/ssbdemod.h @@ -268,6 +268,8 @@ private: uint m_audioBufferFill; AudioFifo m_audioFifo; quint32 m_audioSampleRate; + UDPSink *m_udpBufferAudio; + static const int m_udpBlockSize; QMutex m_settingsMutex; diff --git a/plugins/channelrx/demodssb/ssbdemodgui.cpp b/plugins/channelrx/demodssb/ssbdemodgui.cpp index 2b98415f6..f8b222e32 100644 --- a/plugins/channelrx/demodssb/ssbdemodgui.cpp +++ b/plugins/channelrx/demodssb/ssbdemodgui.cpp @@ -8,11 +8,12 @@ #include "ui_ssbdemodgui.h" #include "dsp/spectrumvis.h" +#include "dsp/dspengine.h" #include "gui/glspectrum.h" +#include "gui/basicchannelsettingsdialog.h" #include "plugin/pluginapi.h" #include "util/simpleserializer.h" #include "util/db.h" -#include "dsp/dspengine.h" #include "mainwindow.h" #include "ssbdemod.h" @@ -196,6 +197,31 @@ void SSBDemodGUI::on_flipSidebands_clicked(bool checked __attribute__((unused))) ui->lowCut->setValue(-lcValue); } +void SSBDemodGUI::on_copyAudioToUDP_toggled(bool checked) +{ + m_settings.m_copyAudioToUDP = checked; + applySettings(); +} + +void SSBDemodGUI::onMenuDialogCalled(const QPoint &p) +{ + BasicChannelSettingsDialog dialog(&m_channelMarker, this); + dialog.move(p); + dialog.exec(); + + m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); + m_settings.m_udpAddress = m_channelMarker.getUDPAddress(), + m_settings.m_udpPort = m_channelMarker.getUDPSendPort(), + m_settings.m_rgbColor = m_channelMarker.getColor().rgb(); + m_settings.m_title = m_channelMarker.getTitle(); + + setWindowTitle(m_settings.m_title); + setTitleColor(m_settings.m_rgbColor); + displayUDPAddress(); + + applySettings(); +} + void SSBDemodGUI::onWidgetRolled(QWidget* widget __attribute__((unused)), bool rollDown __attribute__((unused))) { } @@ -216,6 +242,7 @@ SSBDemodGUI::SSBDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, Baseban ui->setupUi(this); setAttribute(Qt::WA_DeleteOnClose, true); connect(this, SIGNAL(widgetRolled(QWidget*,bool)), this, SLOT(onWidgetRolled(QWidget*,bool))); + connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(onMenuDialogCalled(const QPoint &))); m_spectrumVis = new SpectrumVis(ui->glSpectrum); m_ssbDemod = (SSBDemod*) rxChannel; //new SSBDemod(m_deviceUISet->m_deviceSourceAPI); @@ -396,8 +423,8 @@ void SSBDemodGUI::displaySettings() { m_channelMarker.blockSignals(true); m_channelMarker.setCenterFrequency(m_settings.m_inputFrequencyOffset); - m_channelMarker.setTitle(m_settings.m_title); m_channelMarker.setBandwidth(m_settings.m_rfBandwidth * 2); + m_channelMarker.setTitle(m_settings.m_title); m_channelMarker.setLowCutoff(m_settings.m_lowCutoff); ui->flipSidebands->setEnabled(!m_settings.m_dsb); @@ -474,13 +501,14 @@ void SSBDemodGUI::displaySettings() ui->agcThresholdGate->setValue(m_settings.m_agcThresholdGate); s = QString::number(ui->agcThresholdGate->value(), 'f', 0); ui->agcThresholdGateText->setText(s); + ui->copyAudioToUDP->setChecked(m_settings.m_copyAudioToUDP); blockApplySettings(false); } void SSBDemodGUI::displayUDPAddress() { - //TODO: ui->copyAudioToUDP->setToolTip(QString("Copy audio output to UDP %1:%2").arg(m_settings.m_udpAddress).arg(m_settings.m_udpPort)); + ui->copyAudioToUDP->setToolTip(QString("Copy audio output to UDP %1:%2").arg(m_settings.m_udpAddress).arg(m_settings.m_udpPort)); } void SSBDemodGUI::displayAGCPowerThreshold(int value) diff --git a/plugins/channelrx/demodssb/ssbdemodgui.h b/plugins/channelrx/demodssb/ssbdemodgui.h index 8e17379c4..79c15f4fa 100644 --- a/plugins/channelrx/demodssb/ssbdemodgui.h +++ b/plugins/channelrx/demodssb/ssbdemodgui.h @@ -95,7 +95,9 @@ private slots: void on_audioMute_toggled(bool checked); void on_spanLog2_valueChanged(int value); void on_flipSidebands_clicked(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/demodssb/ssbdemodgui.ui b/plugins/channelrx/demodssb/ssbdemodgui.ui index 4f703445d..063a910e7 100644 --- a/plugins/channelrx/demodssb/ssbdemodgui.ui +++ b/plugins/channelrx/demodssb/ssbdemodgui.ui @@ -7,7 +7,7 @@ 0 0 385 - 160 + 190 @@ -37,7 +37,7 @@ 0 0 385 - 151 + 171 @@ -359,6 +359,12 @@ + + + 16777215 + 16 + + Lowpass filter cutoff frequency @@ -542,6 +548,12 @@ + + + 16777215 + 16 + + Highpass filter cutoff frequency (SSB) @@ -821,6 +833,16 @@ + + + + Copy audio to UDP + + + U + + + diff --git a/plugins/channelrx/demodssb/ssbdemodsettings.cpp b/plugins/channelrx/demodssb/ssbdemodsettings.cpp index 4effb1656..f5476a70b 100644 --- a/plugins/channelrx/demodssb/ssbdemodsettings.cpp +++ b/plugins/channelrx/demodssb/ssbdemodsettings.cpp @@ -36,6 +36,7 @@ void SSBDemodSettings::resetToDefaults() m_audioMute = false; m_agc = false; m_agcClamping = false; + m_copyAudioToUDP = false; m_agcPowerThreshold = -40; m_agcThresholdGate = 4; m_agcTimeLog2 = 7; @@ -46,6 +47,8 @@ void SSBDemodSettings::resetToDefaults() m_inputSampleRate = 96000; m_inputFrequencyOffset = 0; m_audioSampleRate = DSPEngine::instance()->getAudioSampleRate(); + m_udpAddress = "127.0.0.1"; + m_udpPort = 9999; m_rgbColor = QColor(0, 255, 0).rgb(); m_title = "SSB Demodulator"; } diff --git a/plugins/channelrx/demodssb/ssbdemodsettings.h b/plugins/channelrx/demodssb/ssbdemodsettings.h index 10b4d5e7f..dd5249f8c 100644 --- a/plugins/channelrx/demodssb/ssbdemodsettings.h +++ b/plugins/channelrx/demodssb/ssbdemodsettings.h @@ -36,6 +36,7 @@ struct SSBDemodSettings bool m_audioMute; bool m_agc; bool m_agcClamping; + bool m_copyAudioToUDP; int m_agcTimeLog2; int m_agcPowerThreshold; int m_agcThresholdGate;