From e4852230ea5616ebcc6c9cd3223051e5fd070c0d Mon Sep 17 00:00:00 2001 From: f4exb Date: Mon, 9 Jan 2017 22:33:58 +0100 Subject: [PATCH] BladeRF Output: limit size of sample FIFO to limit delay --- .../bladerfoutput/bladerfoutput.cpp | 155 +++++++++--------- .../bladerfoutput/bladerfoutputthread.h | 1 + 2 files changed, 80 insertions(+), 76 deletions(-) diff --git a/plugins/samplesink/bladerfoutput/bladerfoutput.cpp b/plugins/samplesink/bladerfoutput/bladerfoutput.cpp index 5fa871501..8389e8d89 100644 --- a/plugins/samplesink/bladerfoutput/bladerfoutput.cpp +++ b/plugins/samplesink/bladerfoutput/bladerfoutput.cpp @@ -67,7 +67,7 @@ bool BladerfOutput::start(int device) int res; - m_sampleSourceFifo.resize(m_settings.m_devSampleRate); // 1s long + m_sampleSourceFifo.resize(m_settings.m_devSampleRate/(1<<(m_settings.m_log2Interp <= 4 ? m_settings.m_log2Interp : 4))); if (m_deviceAPI->getSourceBuddies().size() > 0) { @@ -135,11 +135,11 @@ bool BladerfOutput::start(int device) goto failed; } - m_bladerfThread->startWork(); - // mutexLocker.unlock(); applySettings(m_settings, true); + m_bladerfThread->startWork(); + qDebug("BladerfOutput::start: started"); return true; @@ -247,44 +247,89 @@ bool BladerfOutput::applySettings(const BladeRFOutputSettings& settings, bool fo qDebug() << "BladerfOutput::applySettings: m_dev: " << m_dev; + if ((m_settings.m_devSampleRate != settings.m_devSampleRate) || (m_settings.m_log2Interp != settings.m_log2Interp) || force) + { + bool wasRunning = false; + + if ((m_bladerfThread != 0) && (m_bladerfThread->isRunning())) + { + m_bladerfThread->stopWork(); + wasRunning = true; + } + + // FIFO size: + // 1 s length up to interpolation by 16 + // 2 s for interpolation by 32 + m_sampleSourceFifo.resize(settings.m_devSampleRate/(1<<(settings.m_log2Interp <= 4 ? settings.m_log2Interp : 4))); + + if (wasRunning) + { + m_bladerfThread->startWork(); + } + } + + if ((m_settings.m_devSampleRate != settings.m_devSampleRate) || force) + { + forwardChange = true; + + if (m_dev != 0) + { + unsigned int actualSamplerate; + + if (bladerf_set_sample_rate(m_dev, BLADERF_MODULE_TX, settings.m_devSampleRate, &actualSamplerate) < 0) + { + qCritical("BladerfOutput::applySettings: could not set sample rate: %d", settings.m_devSampleRate); + } + else + { + qDebug() << "BladerfOutput::applySettings: bladerf_set_sample_rate(BLADERF_MODULE_TX) actual sample rate is " << actualSamplerate; + } + } + } + + if ((m_settings.m_log2Interp != settings.m_log2Interp) || force) + { + forwardChange = true; + + if (m_bladerfThread != 0) + { + m_bladerfThread->setLog2Interpolation(settings.m_log2Interp); + qDebug() << "BladerfOutput::applySettings: set interpolation to " << (1<setLog2Interpolation(m_settings.m_log2Interp); - qDebug() << "BladerfOutput::applySettings: set interpolation to " << (1<