From cc8b2e6462457fd36735dd12dc5b95427dbf4ae3 Mon Sep 17 00:00:00 2001 From: f4exb Date: Tue, 17 May 2022 19:55:40 +0200 Subject: [PATCH] Fixed audio FIFO write overflows in modulators using audio input. Also fixes #1236 in SSB modulator --- plugins/channeltx/modam/ammodbaseband.cpp | 16 ++++++++++++---- plugins/channeltx/modam/ammodsource.cpp | 2 ++ .../channeltx/modfreedv/freedvmodbaseband.cpp | 18 +++++++++++++----- .../channeltx/modfreedv/freedvmodsource.cpp | 1 + plugins/channeltx/modnfm/nfmmodbaseband.cpp | 16 ++++++++++++---- plugins/channeltx/modnfm/nfmmodsource.cpp | 2 ++ plugins/channeltx/modssb/ssbmodbaseband.cpp | 16 ++++++++++++---- plugins/channeltx/modssb/ssbmodbaseband.h | 2 +- plugins/channeltx/modssb/ssbmodsource.cpp | 5 ++++- plugins/channeltx/modssb/ssbmodsource.h | 6 +++--- plugins/channeltx/modwfm/wfmmodbaseband.cpp | 16 ++++++++++++---- plugins/channeltx/modwfm/wfmmodsource.cpp | 2 ++ 12 files changed, 76 insertions(+), 26 deletions(-) diff --git a/plugins/channeltx/modam/ammodbaseband.cpp b/plugins/channeltx/modam/ammodbaseband.cpp index 14d0ba1fe..989b59c05 100644 --- a/plugins/channeltx/modam/ammodbaseband.cpp +++ b/plugins/channeltx/modam/ammodbaseband.cpp @@ -40,9 +40,6 @@ AMModBaseband::AMModBaseband() : Qt::QueuedConnection ); - DSPEngine::instance()->getAudioDeviceManager()->addAudioSource(m_source.getAudioFifo(), getInputMessageQueue()); - m_source.applyAudioSampleRate(DSPEngine::instance()->getAudioDeviceManager()->getInputSampleRate()); - DSPEngine::instance()->getAudioDeviceManager()->addAudioSink(m_source.getFeedbackAudioFifo(), getInputMessageQueue()); m_source.applyFeedbackAudioSampleRate(DSPEngine::instance()->getAudioDeviceManager()->getOutputSampleRate()); @@ -199,7 +196,6 @@ void AMModBaseband::applySettings(const AMModSettings& settings, bool force) AudioDeviceManager *audioDeviceManager = DSPEngine::instance()->getAudioDeviceManager(); int audioDeviceIndex = audioDeviceManager->getInputDeviceIndex(settings.m_audioDeviceName); audioDeviceManager->removeAudioSource(getAudioFifo()); - audioDeviceManager->addAudioSource(getAudioFifo(), getInputMessageQueue(), audioDeviceIndex); int audioSampleRate = audioDeviceManager->getInputSampleRate(audioDeviceIndex); if (getAudioSampleRate() != audioSampleRate) @@ -210,6 +206,18 @@ void AMModBaseband::applySettings(const AMModSettings& settings, bool force) } } + if ((settings.m_modAFInput != m_settings.m_modAFInput) || force) + { + AudioDeviceManager *audioDeviceManager = DSPEngine::instance()->getAudioDeviceManager(); + int audioDeviceIndex = audioDeviceManager->getInputDeviceIndex(settings.m_audioDeviceName); + + if (settings.m_modAFInput == AMModSettings::AMModInputAudio) { + audioDeviceManager->addAudioSource(getAudioFifo(), getInputMessageQueue(), audioDeviceIndex); + } else { + audioDeviceManager->removeAudioSource(getAudioFifo()); + } + } + if ((settings.m_feedbackAudioDeviceName != m_settings.m_feedbackAudioDeviceName) || force) { AudioDeviceManager *audioDeviceManager = DSPEngine::instance()->getAudioDeviceManager(); diff --git a/plugins/channeltx/modam/ammodsource.cpp b/plugins/channeltx/modam/ammodsource.cpp index 8acc72b3e..7ce953f43 100644 --- a/plugins/channeltx/modam/ammodsource.cpp +++ b/plugins/channeltx/modam/ammodsource.cpp @@ -37,6 +37,8 @@ AMModSource::AMModSource() : m_ifstream(nullptr), m_mutex(QMutex::Recursive) { + m_audioFifo.setLabel("AMModSource.m_audioFifo"); + m_feedbackAudioFifo.setLabel("AMModSource.m_feedbackAudioFifo"); m_audioBuffer.resize(24000); m_audioBufferFill = 0; m_audioReadBuffer.resize(24000); diff --git a/plugins/channeltx/modfreedv/freedvmodbaseband.cpp b/plugins/channeltx/modfreedv/freedvmodbaseband.cpp index 0eb676b57..4d382d367 100644 --- a/plugins/channeltx/modfreedv/freedvmodbaseband.cpp +++ b/plugins/channeltx/modfreedv/freedvmodbaseband.cpp @@ -40,9 +40,6 @@ FreeDVModBaseband::FreeDVModBaseband() : Qt::QueuedConnection ); - DSPEngine::instance()->getAudioDeviceManager()->addAudioSource(m_source.getAudioFifo(), getInputMessageQueue()); - m_source.applyAudioSampleRate(DSPEngine::instance()->getAudioDeviceManager()->getInputSampleRate()); - connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages())); } @@ -195,7 +192,6 @@ void FreeDVModBaseband::applySettings(const FreeDVModSettings& settings, bool fo AudioDeviceManager *audioDeviceManager = DSPEngine::instance()->getAudioDeviceManager(); int audioDeviceIndex = audioDeviceManager->getInputDeviceIndex(settings.m_audioDeviceName); audioDeviceManager->removeAudioSource(getAudioFifo()); - audioDeviceManager->addAudioSource(getAudioFifo(), getInputMessageQueue(), audioDeviceIndex); int audioSampleRate = audioDeviceManager->getInputSampleRate(audioDeviceIndex); if (getAudioSampleRate() != audioSampleRate) { @@ -203,6 +199,18 @@ void FreeDVModBaseband::applySettings(const FreeDVModSettings& settings, bool fo } } + if ((settings.m_modAFInput != m_settings.m_modAFInput) || force) + { + AudioDeviceManager *audioDeviceManager = DSPEngine::instance()->getAudioDeviceManager(); + int audioDeviceIndex = audioDeviceManager->getInputDeviceIndex(settings.m_audioDeviceName); + + if (settings.m_modAFInput == FreeDVModSettings::FreeDVModInputAudio) { + audioDeviceManager->addAudioSource(getAudioFifo(), getInputMessageQueue(), audioDeviceIndex); + } else { + audioDeviceManager->removeAudioSource(getAudioFifo()); + } + } + m_source.applySettings(settings, force); m_settings = settings; @@ -211,4 +219,4 @@ void FreeDVModBaseband::applySettings(const FreeDVModSettings& settings, bool fo int FreeDVModBaseband::getChannelSampleRate() const { return m_channelizer->getChannelSampleRate(); -} \ No newline at end of file +} diff --git a/plugins/channeltx/modfreedv/freedvmodsource.cpp b/plugins/channeltx/modfreedv/freedvmodsource.cpp index 0a65c5dd7..4df1ca2e8 100644 --- a/plugins/channeltx/modfreedv/freedvmodsource.cpp +++ b/plugins/channeltx/modfreedv/freedvmodsource.cpp @@ -49,6 +49,7 @@ FreeDVModSource::FreeDVModSource() : m_scaleFactor(SDR_TX_SCALEF), m_mutex(QMutex::Recursive) { + m_audioFifo.setLabel("FreeDVModSource.m_audioFifo"); m_SSBFilter = new fftfilt(m_lowCutoff / m_audioSampleRate, m_hiCutoff / m_audioSampleRate, m_ssbFftLen); m_SSBFilterBuffer = new Complex[m_ssbFftLen>>1]; // filter returns data exactly half of its size std::fill(m_SSBFilterBuffer, m_SSBFilterBuffer+(m_ssbFftLen>>1), Complex{0,0}); diff --git a/plugins/channeltx/modnfm/nfmmodbaseband.cpp b/plugins/channeltx/modnfm/nfmmodbaseband.cpp index fc821e8da..083524e45 100644 --- a/plugins/channeltx/modnfm/nfmmodbaseband.cpp +++ b/plugins/channeltx/modnfm/nfmmodbaseband.cpp @@ -40,9 +40,6 @@ NFMModBaseband::NFMModBaseband() : Qt::QueuedConnection ); - DSPEngine::instance()->getAudioDeviceManager()->addAudioSource(m_source.getAudioFifo(), getInputMessageQueue()); - m_source.applyAudioSampleRate(DSPEngine::instance()->getAudioDeviceManager()->getInputSampleRate()); - DSPEngine::instance()->getAudioDeviceManager()->addAudioSink(m_source.getFeedbackAudioFifo(), getInputMessageQueue()); m_source.applyFeedbackAudioSampleRate(DSPEngine::instance()->getAudioDeviceManager()->getOutputSampleRate()); @@ -199,7 +196,6 @@ void NFMModBaseband::applySettings(const NFMModSettings& settings, bool force) AudioDeviceManager *audioDeviceManager = DSPEngine::instance()->getAudioDeviceManager(); int audioDeviceIndex = audioDeviceManager->getInputDeviceIndex(settings.m_audioDeviceName); audioDeviceManager->removeAudioSource(getAudioFifo()); - audioDeviceManager->addAudioSource(getAudioFifo(), getInputMessageQueue(), audioDeviceIndex); int audioSampleRate = audioDeviceManager->getInputSampleRate(audioDeviceIndex); if (getAudioSampleRate() != audioSampleRate) @@ -210,6 +206,18 @@ void NFMModBaseband::applySettings(const NFMModSettings& settings, bool force) } } + if ((settings.m_modAFInput != m_settings.m_modAFInput) || force) + { + AudioDeviceManager *audioDeviceManager = DSPEngine::instance()->getAudioDeviceManager(); + int audioDeviceIndex = audioDeviceManager->getInputDeviceIndex(settings.m_audioDeviceName); + + if (settings.m_modAFInput == NFMModSettings::NFMModInputAudio) { + audioDeviceManager->addAudioSource(getAudioFifo(), getInputMessageQueue(), audioDeviceIndex); + } else { + audioDeviceManager->removeAudioSource(getAudioFifo()); + } + } + if ((settings.m_feedbackAudioDeviceName != m_settings.m_feedbackAudioDeviceName) || force) { AudioDeviceManager *audioDeviceManager = DSPEngine::instance()->getAudioDeviceManager(); diff --git a/plugins/channeltx/modnfm/nfmmodsource.cpp b/plugins/channeltx/modnfm/nfmmodsource.cpp index a8b6e53ca..032dc1b27 100644 --- a/plugins/channeltx/modnfm/nfmmodsource.cpp +++ b/plugins/channeltx/modnfm/nfmmodsource.cpp @@ -40,6 +40,8 @@ NFMModSource::NFMModSource() : m_ifstream(nullptr), m_mutex(QMutex::Recursive) { + m_audioFifo.setLabel("NFMModSource.m_audioFifo"); + m_feedbackAudioFifo.setLabel("NFMModSource.m_feedbackAudioFifo"); m_audioBuffer.resize(24000); m_audioBufferFill = 0; m_audioReadBuffer.resize(24000); diff --git a/plugins/channeltx/modssb/ssbmodbaseband.cpp b/plugins/channeltx/modssb/ssbmodbaseband.cpp index 9c10252b8..1102b2d51 100644 --- a/plugins/channeltx/modssb/ssbmodbaseband.cpp +++ b/plugins/channeltx/modssb/ssbmodbaseband.cpp @@ -41,9 +41,6 @@ SSBModBaseband::SSBModBaseband() : Qt::QueuedConnection ); - DSPEngine::instance()->getAudioDeviceManager()->addAudioSource(m_source.getAudioFifo(), getInputMessageQueue()); - m_source.applyAudioSampleRate(DSPEngine::instance()->getAudioDeviceManager()->getInputSampleRate()); - DSPEngine::instance()->getAudioDeviceManager()->addAudioSink(m_source.getFeedbackAudioFifo(), getInputMessageQueue()); m_source.applyFeedbackAudioSampleRate(DSPEngine::instance()->getAudioDeviceManager()->getOutputSampleRate()); @@ -205,7 +202,6 @@ void SSBModBaseband::applySettings(const SSBModSettings& settings, bool force) AudioDeviceManager *audioDeviceManager = DSPEngine::instance()->getAudioDeviceManager(); int audioDeviceIndex = audioDeviceManager->getInputDeviceIndex(settings.m_audioDeviceName); audioDeviceManager->removeAudioSource(getAudioFifo()); - audioDeviceManager->addAudioSource(getAudioFifo(), getInputMessageQueue(), audioDeviceIndex); int audioSampleRate = audioDeviceManager->getInputSampleRate(audioDeviceIndex); if (getAudioSampleRate() != audioSampleRate) @@ -218,6 +214,18 @@ void SSBModBaseband::applySettings(const SSBModSettings& settings, bool force) } } + if ((settings.m_modAFInput != m_settings.m_modAFInput) || force) + { + AudioDeviceManager *audioDeviceManager = DSPEngine::instance()->getAudioDeviceManager(); + int audioDeviceIndex = audioDeviceManager->getInputDeviceIndex(settings.m_audioDeviceName); + + if (settings.m_modAFInput == SSBModSettings::SSBModInputAudio) { + audioDeviceManager->addAudioSource(getAudioFifo(), getInputMessageQueue(), audioDeviceIndex); + } else { + audioDeviceManager->removeAudioSource(getAudioFifo()); + } + } + if ((settings.m_feedbackAudioDeviceName != m_settings.m_feedbackAudioDeviceName) || force) { AudioDeviceManager *audioDeviceManager = DSPEngine::instance()->getAudioDeviceManager(); diff --git a/plugins/channeltx/modssb/ssbmodbaseband.h b/plugins/channeltx/modssb/ssbmodbaseband.h index b60268a30..5776698f8 100644 --- a/plugins/channeltx/modssb/ssbmodbaseband.h +++ b/plugins/channeltx/modssb/ssbmodbaseband.h @@ -72,7 +72,7 @@ public: void setInputFileStream(std::ifstream *ifstream) { m_source.setInputFileStream(ifstream); } AudioFifo *getAudioFifo() { return m_source.getAudioFifo(); } AudioFifo *getFeedbackAudioFifo() { return m_source.getFeedbackAudioFifo(); } - void setSpectrumSink(SpectrumVis *sampleSink) { m_spectrumVis = sampleSink; m_source.setSpectrumSink((BasebandSampleSink *) sampleSink); } + void setSpectrumSink(SpectrumVis *sampleSink) { m_spectrumVis = sampleSink; m_source.setSpectrumSink(sampleSink); } void setChannel(ChannelAPI *channel); signals: diff --git a/plugins/channeltx/modssb/ssbmodsource.cpp b/plugins/channeltx/modssb/ssbmodsource.cpp index 0dfd298a7..f22457de0 100644 --- a/plugins/channeltx/modssb/ssbmodsource.cpp +++ b/plugins/channeltx/modssb/ssbmodsource.cpp @@ -17,7 +17,7 @@ #include -#include "dsp/basebandsamplesink.h" +#include "dsp/spectrumvis.h" #include "dsp/misc.h" #include "dsp/datafifo.h" #include "util/messagequeue.h" @@ -31,6 +31,7 @@ const int SSBModSource::m_levelNbSamples = 480; // every 10ms SSBModSource::SSBModSource() : m_channelSampleRate(48000), m_channelFrequencyOffset(0), + m_spectrumSink(nullptr), m_audioSampleRate(48000), m_audioFifo(12000), m_feedbackAudioFifo(48000), @@ -40,6 +41,8 @@ SSBModSource::SSBModSource() : m_ifstream(nullptr), m_mutex(QMutex::Recursive) { + m_audioFifo.setLabel("SSBModSource.m_audioFifo"); + m_feedbackAudioFifo.setLabel("SSBModSource.m_feedbackAudioFifo"); m_SSBFilter = new fftfilt(m_settings.m_lowCutoff / m_audioSampleRate, m_settings.m_bandwidth / m_audioSampleRate, m_ssbFftLen); m_DSBFilter = new fftfilt((2.0f * m_settings.m_bandwidth) / m_audioSampleRate, 2 * m_ssbFftLen); m_SSBFilterBuffer = new Complex[m_ssbFftLen>>1]; // filter returns data exactly half of its size diff --git a/plugins/channeltx/modssb/ssbmodsource.h b/plugins/channeltx/modssb/ssbmodsource.h index 76275cb12..8618dbca0 100644 --- a/plugins/channeltx/modssb/ssbmodsource.h +++ b/plugins/channeltx/modssb/ssbmodsource.h @@ -36,8 +36,8 @@ #include "ssbmodsettings.h" -class BasebandSampleSink; class ChannelAPI; +class SpectrumVis; class SSBModSource : public QObject, public ChannelSampleSource { @@ -68,7 +68,7 @@ public: } void applySettings(const SSBModSettings& settings, bool force = false); void applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force = 0); - void setSpectrumSink(BasebandSampleSink *sampleSink) { m_spectrumSink = sampleSink; } + void setSpectrumSink(SpectrumVis *sampleSink) { m_spectrumSink = sampleSink; } private: int m_channelSampleRate; @@ -101,7 +101,7 @@ private: int m_DSBFilterBufferIndex; static const int m_ssbFftLen; - BasebandSampleSink* m_spectrumSink; + SpectrumVis* m_spectrumSink; SampleVector m_sampleBuffer; fftfilt::cmplx m_sum; diff --git a/plugins/channeltx/modwfm/wfmmodbaseband.cpp b/plugins/channeltx/modwfm/wfmmodbaseband.cpp index ee02b0446..a335e5e30 100644 --- a/plugins/channeltx/modwfm/wfmmodbaseband.cpp +++ b/plugins/channeltx/modwfm/wfmmodbaseband.cpp @@ -40,9 +40,6 @@ WFMModBaseband::WFMModBaseband() : Qt::QueuedConnection ); - DSPEngine::instance()->getAudioDeviceManager()->addAudioSource(m_source.getAudioFifo(), getInputMessageQueue()); - m_source.applyAudioSampleRate(DSPEngine::instance()->getAudioDeviceManager()->getInputSampleRate()); - DSPEngine::instance()->getAudioDeviceManager()->addAudioSink(m_source.getFeedbackAudioFifo(), getInputMessageQueue()); m_source.applyFeedbackAudioSampleRate(DSPEngine::instance()->getAudioDeviceManager()->getOutputSampleRate()); @@ -198,7 +195,6 @@ void WFMModBaseband::applySettings(const WFMModSettings& settings, bool force) AudioDeviceManager *audioDeviceManager = DSPEngine::instance()->getAudioDeviceManager(); int audioDeviceIndex = audioDeviceManager->getInputDeviceIndex(settings.m_audioDeviceName); audioDeviceManager->removeAudioSource(getAudioFifo()); - audioDeviceManager->addAudioSource(getAudioFifo(), getInputMessageQueue(), audioDeviceIndex); int audioSampleRate = audioDeviceManager->getInputSampleRate(audioDeviceIndex); if (getAudioSampleRate() != audioSampleRate) { @@ -206,6 +202,18 @@ void WFMModBaseband::applySettings(const WFMModSettings& settings, bool force) } } + if ((settings.m_modAFInput != m_settings.m_modAFInput) || force) + { + AudioDeviceManager *audioDeviceManager = DSPEngine::instance()->getAudioDeviceManager(); + int audioDeviceIndex = audioDeviceManager->getInputDeviceIndex(settings.m_audioDeviceName); + + if (settings.m_modAFInput == WFMModSettings::WFMModInputAudio) { + audioDeviceManager->addAudioSource(getAudioFifo(), getInputMessageQueue(), audioDeviceIndex); + } else { + audioDeviceManager->removeAudioSource(getAudioFifo()); + } + } + m_source.applySettings(settings, force); m_settings = settings; diff --git a/plugins/channeltx/modwfm/wfmmodsource.cpp b/plugins/channeltx/modwfm/wfmmodsource.cpp index b195fd485..9b4868cef 100644 --- a/plugins/channeltx/modwfm/wfmmodsource.cpp +++ b/plugins/channeltx/modwfm/wfmmodsource.cpp @@ -39,6 +39,8 @@ WFMModSource::WFMModSource() : m_ifstream(nullptr), m_mutex(QMutex::Recursive) { + m_audioFifo.setLabel("WFMModSource.m_audioFifo"); + m_feedbackAudioFifo.setLabel("WFMModSource.m_feedbackAudioFifo"); m_rfFilter = new fftfilt(-62500.0 / 384000.0, 62500.0 / 384000.0, m_rfFilterFFTLength); m_rfFilterBuffer = new Complex[m_rfFilterFFTLength]; std::fill(m_rfFilterBuffer, m_rfFilterBuffer+m_rfFilterFFTLength, Complex{0,0});