From 67866854ca3bc30155374418b0ce77f02b2a4d8d Mon Sep 17 00:00:00 2001 From: f4exb Date: Mon, 24 Aug 2015 02:40:02 +0200 Subject: [PATCH] Deep redesign: SSB audio FIFO on object stack --- plugins/channel/am/amdemodgui.cpp | 1 - plugins/channel/am/amdemodgui.h | 2 -- plugins/channel/chanalyzer/chanalyzer.cpp | 1 - plugins/channel/chanalyzer/chanalyzer.h | 3 -- plugins/channel/nfm/nfmdemodgui.h | 2 -- plugins/channel/ssb/ssbdemod.cpp | 35 ++++++++++++++--------- plugins/channel/ssb/ssbdemod.h | 7 ++--- plugins/channel/ssb/ssbdemodgui.cpp | 6 +--- plugins/channel/ssb/ssbdemodgui.h | 1 - 9 files changed, 26 insertions(+), 32 deletions(-) diff --git a/plugins/channel/am/amdemodgui.cpp b/plugins/channel/am/amdemodgui.cpp index ccf871de3..60c62b81d 100644 --- a/plugins/channel/am/amdemodgui.cpp +++ b/plugins/channel/am/amdemodgui.cpp @@ -220,7 +220,6 @@ AMDemodGUI::AMDemodGUI(PluginAPI* pluginAPI, QWidget* parent) : AMDemodGUI::~AMDemodGUI() { m_pluginAPI->removeChannelInstance(this); - DSPEngine::instance()->removeAudioSink(m_audioFifo); DSPEngine::instance()->removeThreadedSink(m_threadedChannelizer); delete m_threadedChannelizer; delete m_channelizer; diff --git a/plugins/channel/am/amdemodgui.h b/plugins/channel/am/amdemodgui.h index 325139c99..f92b63f01 100644 --- a/plugins/channel/am/amdemodgui.h +++ b/plugins/channel/am/amdemodgui.h @@ -7,7 +7,6 @@ class PluginAPI; class ChannelMarker; -class AudioFifo; class ThreadedSampleSink; class Channelizer; class AMDemod; @@ -51,7 +50,6 @@ private: bool m_basicSettingsShown; bool m_doApplySettings; - AudioFifo* m_audioFifo; ThreadedSampleSink* m_threadedChannelizer; Channelizer* m_channelizer; AMDemod* m_amDemod; diff --git a/plugins/channel/chanalyzer/chanalyzer.cpp b/plugins/channel/chanalyzer/chanalyzer.cpp index a32c3d57d..1a3ec24cc 100644 --- a/plugins/channel/chanalyzer/chanalyzer.cpp +++ b/plugins/channel/chanalyzer/chanalyzer.cpp @@ -166,7 +166,6 @@ bool ChannelAnalyzer::handleMessage(const Message& cmd) m_Bandwidth = band; m_LowCutoff = lowCutoff; - //m_interpolator.create(16, m_sampleRate, band * 2.0f); SSBFilter->create_filter(m_LowCutoff / m_sampleRate, m_Bandwidth / m_sampleRate); DSBFilter->create_dsb_filter(m_Bandwidth / m_sampleRate); diff --git a/plugins/channel/chanalyzer/chanalyzer.h b/plugins/channel/chanalyzer/chanalyzer.h index f10496ce2..8a6da515f 100644 --- a/plugins/channel/chanalyzer/chanalyzer.h +++ b/plugins/channel/chanalyzer/chanalyzer.h @@ -21,15 +21,12 @@ #include #include "dsp/samplesink.h" #include "dsp/nco.h" -#include "dsp/interpolator.h" #include "dsp/fftfilt.h" #include "audio/audiofifo.h" #include "util/message.h" #define ssbFftLen 1024 -//class AudioFifo; - class ChannelAnalyzer : public SampleSink { public: ChannelAnalyzer(SampleSink* m_sampleSink); diff --git a/plugins/channel/nfm/nfmdemodgui.h b/plugins/channel/nfm/nfmdemodgui.h index 3ccb721a5..e06a5f9e4 100644 --- a/plugins/channel/nfm/nfmdemodgui.h +++ b/plugins/channel/nfm/nfmdemodgui.h @@ -8,7 +8,6 @@ class PluginAPI; class ChannelMarker; -class AudioFifo; class ThreadedSampleSink; class Channelizer; class NFMDemod; @@ -54,7 +53,6 @@ private: bool m_basicSettingsShown; bool m_doApplySettings; - AudioFifo* m_audioFifo; ThreadedSampleSink* m_threadedChannelizer; Channelizer* m_channelizer; NFMDemod* m_nfmDemod; diff --git a/plugins/channel/ssb/ssbdemod.cpp b/plugins/channel/ssb/ssbdemod.cpp index 7e436530f..117924bac 100644 --- a/plugins/channel/ssb/ssbdemod.cpp +++ b/plugins/channel/ssb/ssbdemod.cpp @@ -21,13 +21,14 @@ #include #include "ssbdemod.h" #include "audio/audiooutput.h" +#include "dsp/dspengine.h" #include "dsp/channelizer.h" MESSAGE_CLASS_DEFINITION(SSBDemod::MsgConfigureSSBDemod, Message) -SSBDemod::SSBDemod(AudioFifo* audioFifo, SampleSink* sampleSink) : +SSBDemod::SSBDemod(SampleSink* sampleSink) : m_sampleSink(sampleSink), - m_audioFifo(audioFifo) + m_audioFifo(4, 24000) { setObjectName("SSBDemod"); @@ -38,21 +39,29 @@ SSBDemod::SSBDemod(AudioFifo* audioFifo, SampleSink* sampleSink) : m_sampleRate = 96000; m_frequency = 0; m_nco.setFreq(m_frequency, m_sampleRate); - m_interpolator.create(16, m_sampleRate, 5000); - m_sampleDistanceRemain = (Real)m_sampleRate / 48000.0; + m_audioSampleRate = DSPEngine::instance()->getAudioSampleRate(); - m_audioBuffer.resize(512); + m_interpolator.create(16, m_sampleRate, 5000); + m_sampleDistanceRemain = (Real) m_sampleRate / m_audioSampleRate; + + m_audioBuffer.resize(1<<9); m_audioBufferFill = 0; m_undersampleCount = 0; m_usb = true; - SSBFilter = new fftfilt(m_LowCutoff / 48000.0, m_Bandwidth / 48000.0, ssbFftLen); - // if (!USBFilter) segfault; + SSBFilter = new fftfilt(m_LowCutoff / m_audioSampleRate, m_Bandwidth / m_audioSampleRate, ssbFftLen); + + DSPEngine::instance()->addAudioSink(&m_audioFifo); } SSBDemod::~SSBDemod() { - if (SSBFilter) delete SSBFilter; + if (SSBFilter) + { + delete SSBFilter; + } + + DSPEngine::instance()->removeAudioSink(&m_audioFifo); } void SSBDemod::configure(MessageQueue* messageQueue, Real Bandwidth, Real LowCutoff, Real volume, int spanLog2) @@ -78,7 +87,7 @@ void SSBDemod::feed(SampleVector::const_iterator begin, SampleVector::const_iter if(m_interpolator.interpolate(&m_sampleDistanceRemain, c, &ci)) { n_out = SSBFilter->runSSB(ci, &sideband, m_usb); - m_sampleDistanceRemain += (Real)m_sampleRate / 48000.0; + m_sampleDistanceRemain += (Real)m_sampleRate / m_audioSampleRate; } else { @@ -109,7 +118,7 @@ void SSBDemod::feed(SampleVector::const_iterator begin, SampleVector::const_iter if (m_audioBufferFill >= m_audioBuffer.size()) { - uint res = m_audioFifo->write((const quint8*)&m_audioBuffer[0], m_audioBufferFill, 1); + uint res = m_audioFifo.write((const quint8*)&m_audioBuffer[0], m_audioBufferFill, 1); if (res != m_audioBufferFill) { @@ -121,7 +130,7 @@ void SSBDemod::feed(SampleVector::const_iterator begin, SampleVector::const_iter } } - if (m_audioFifo->write((const quint8*)&m_audioBuffer[0], m_audioBufferFill, 0) != m_audioBufferFill) + if (m_audioFifo.write((const quint8*)&m_audioBuffer[0], m_audioBufferFill, 0) != m_audioBufferFill) { qDebug("SSBDemod::feed: lost samples"); } @@ -156,7 +165,7 @@ bool SSBDemod::handleMessage(const Message& cmd) m_sampleRate = notif.getSampleRate(); m_nco.setFreq(-notif.getFrequencyOffset(), m_sampleRate); m_interpolator.create(16, m_sampleRate, m_Bandwidth); - m_sampleDistanceRemain = m_sampleRate / 48000.0; + m_sampleDistanceRemain = m_sampleRate / m_audioSampleRate; qDebug() << "SSBDemod::handleMessage: MsgChannelizerNotification: m_sampleRate: " << m_sampleRate << " frequencyOffset" << notif.getFrequencyOffset(); @@ -187,7 +196,7 @@ bool SSBDemod::handleMessage(const Message& cmd) m_LowCutoff = lowCutoff; m_interpolator.create(16, m_sampleRate, band * 2.0f); - SSBFilter->create_filter(m_LowCutoff / 48000.0f, m_Bandwidth / 48000.0f); + SSBFilter->create_filter(m_LowCutoff / (float) m_audioSampleRate, m_Bandwidth / (float) m_audioSampleRate); m_volume = cfg.getVolume(); m_volume *= m_volume * 0.1; diff --git a/plugins/channel/ssb/ssbdemod.h b/plugins/channel/ssb/ssbdemod.h index b9a54474c..c6aeb3678 100644 --- a/plugins/channel/ssb/ssbdemod.h +++ b/plugins/channel/ssb/ssbdemod.h @@ -28,11 +28,9 @@ #define ssbFftLen 1024 -class AudioFifo; - class SSBDemod : public SampleSink { public: - SSBDemod(AudioFifo* audioFifo, SampleSink* sampleSink); + SSBDemod(SampleSink* sampleSink); virtual ~SSBDemod(); void configure(MessageQueue* messageQueue, Real Bandwidth, Real LowCutoff, Real volume, int spanLog2); @@ -97,7 +95,8 @@ private: AudioVector m_audioBuffer; uint m_audioBufferFill; - AudioFifo* m_audioFifo; + AudioFifo m_audioFifo; + quint32 m_audioSampleRate; }; #endif // INCLUDE_SSBDEMOD_H diff --git a/plugins/channel/ssb/ssbdemodgui.cpp b/plugins/channel/ssb/ssbdemodgui.cpp index 9a52521fb..93ae3f751 100644 --- a/plugins/channel/ssb/ssbdemodgui.cpp +++ b/plugins/channel/ssb/ssbdemodgui.cpp @@ -255,12 +255,10 @@ SSBDemodGUI::SSBDemodGUI(PluginAPI* pluginAPI, QWidget* parent) : connect(this, SIGNAL(widgetRolled(QWidget*,bool)), this, SLOT(onWidgetRolled(QWidget*,bool))); connect(this, SIGNAL(menuDoubleClickEvent()), this, SLOT(onMenuDoubleClicked())); - m_audioFifo = new AudioFifo(4, 48000 / 2); m_spectrumVis = new SpectrumVis(ui->glSpectrum); - m_ssbDemod = new SSBDemod(m_audioFifo, m_spectrumVis); + m_ssbDemod = new SSBDemod(m_spectrumVis); m_channelizer = new Channelizer(m_ssbDemod); m_threadedChannelizer = new ThreadedSampleSink(m_channelizer, this); - DSPEngine::instance()->addAudioSink(m_audioFifo); DSPEngine::instance()->addThreadedSink(m_threadedChannelizer); ui->deltaFrequency->setColorMapper(ColorMapper(ColorMapper::ReverseGold)); @@ -289,13 +287,11 @@ SSBDemodGUI::SSBDemodGUI(PluginAPI* pluginAPI, QWidget* parent) : SSBDemodGUI::~SSBDemodGUI() { m_pluginAPI->removeChannelInstance(this); - DSPEngine::instance()->removeAudioSink(m_audioFifo); DSPEngine::instance()->removeThreadedSink(m_threadedChannelizer); delete m_threadedChannelizer; delete m_channelizer; delete m_ssbDemod; delete m_spectrumVis; - delete m_audioFifo; delete m_channelMarker; delete ui; } diff --git a/plugins/channel/ssb/ssbdemodgui.h b/plugins/channel/ssb/ssbdemodgui.h index 5aa26c251..55321b77b 100644 --- a/plugins/channel/ssb/ssbdemodgui.h +++ b/plugins/channel/ssb/ssbdemodgui.h @@ -54,7 +54,6 @@ private: int m_rate; int m_spanLog2; - AudioFifo* m_audioFifo; ThreadedSampleSink* m_threadedChannelizer; Channelizer* m_channelizer; SSBDemod* m_ssbDemod;