1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2025-02-03 09:44:01 -05:00

Fixed audio FIFO write overflows in modulators using audio input. Also fixes #1236 in SSB modulator

This commit is contained in:
f4exb 2022-05-17 19:55:40 +02:00
parent 7a8cab7879
commit cc8b2e6462
12 changed files with 76 additions and 26 deletions

View File

@ -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();

View File

@ -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);

View File

@ -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();
}
}

View File

@ -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});

View File

@ -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();

View File

@ -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);

View File

@ -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();

View File

@ -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:

View File

@ -17,7 +17,7 @@
#include <QDebug>
#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

View File

@ -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;

View File

@ -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;

View File

@ -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});