From 206eaff0502d3cf3186b664ebc96b938b9471101 Mon Sep 17 00:00:00 2001 From: f4exb Date: Sun, 28 Jun 2020 08:17:39 +0200 Subject: [PATCH] Remote input buffer size rework: dynamically allocated number of decoder slots. Implements #534 --- .../remoteinput/remoteinputbuffer.cpp | 7 ++++++- .../samplesource/remoteinput/remoteinputbuffer.h | 2 ++ .../remoteinput/remoteinputudphandler.cpp | 15 +++++++++++++++ .../remoteinput/remoteinputudphandler.h | 1 + 4 files changed, 24 insertions(+), 1 deletion(-) diff --git a/plugins/samplesource/remoteinput/remoteinputbuffer.cpp b/plugins/samplesource/remoteinput/remoteinputbuffer.cpp index 74143a76a..948733fec 100644 --- a/plugins/samplesource/remoteinput/remoteinputbuffer.cpp +++ b/plugins/samplesource/remoteinput/remoteinputbuffer.cpp @@ -98,6 +98,11 @@ void RemoteInputBuffer::setNbDecoderSlots(int nbDecoderSlots) m_frameHead = -1; } +void RemoteInputBuffer::setBufferLenSec(const RemoteMetaDataFEC& metaData) +{ + m_bufferLenSec = (float) m_framesNbBytes / (float) (metaData.m_sampleRate * metaData.m_sampleBytes * 2); +} + void RemoteInputBuffer::initDecodeAllSlots() { for (int i = 0; i < m_nbDecoderSlots; i++) @@ -343,7 +348,7 @@ void RemoteInputBuffer::writeData(char *array) if (sampleRate != 0) { - m_bufferLenSec = (float) m_framesNbBytes / (float) (sampleRate * metaData->m_sampleBytes * 2); + setBufferLenSec(*metaData); m_balCorrLimit = sampleRate / 400; // +/- 5% correction max per read m_readNbBytes = (sampleRate * metaData->m_sampleBytes * 2) / 20; } diff --git a/plugins/samplesource/remoteinput/remoteinputbuffer.h b/plugins/samplesource/remoteinput/remoteinputbuffer.h index 74c6dd414..26ab72db8 100644 --- a/plugins/samplesource/remoteinput/remoteinputbuffer.h +++ b/plugins/samplesource/remoteinput/remoteinputbuffer.h @@ -37,6 +37,8 @@ public: // Sizing void setNbDecoderSlots(int nbDecoderSlots); + static int getBufferFrameSize() { return sizeof(BufferFrame); } + void setBufferLenSec(const RemoteMetaDataFEC& metaData); // R/W operations void writeData(char *array); //!< Write data into buffer. diff --git a/plugins/samplesource/remoteinput/remoteinputudphandler.cpp b/plugins/samplesource/remoteinput/remoteinputudphandler.cpp index f62fe2c29..d5aba1186 100644 --- a/plugins/samplesource/remoteinput/remoteinputudphandler.cpp +++ b/plugins/samplesource/remoteinput/remoteinputudphandler.cpp @@ -191,6 +191,9 @@ void RemoteInputUDPHandler::processData() if (m_samplerate != metaData.m_sampleRate) { + disconnectTimer(); + adjustNbDecoderSlots(metaData); + if (m_messageQueueToInput) { MsgReportSampleRateChange *msg = MsgReportSampleRateChange::create(metaData.m_sampleRate); @@ -222,6 +225,18 @@ void RemoteInputUDPHandler::processData() } } +void RemoteInputUDPHandler::adjustNbDecoderSlots(const RemoteMetaDataFEC& metaData) +{ + int sampleRate = metaData.m_sampleRate; + int sampleBytes = metaData.m_sampleBytes; + int bufferFrameSize = RemoteInputBuffer::getBufferFrameSize(); + float fNbDecoderSlots = (float) (4 * sampleBytes * sampleRate) / (float) bufferFrameSize; + int rawNbDecoderSlots = ((((int) ceil(fNbDecoderSlots)) / 2) * 2) + 2; // next multiple of 2 + qDebug("RemoteInputUDPHandler::adjustNbDecoderSlots: rawNbDecoderSlots: %d", rawNbDecoderSlots); + m_remoteInputBuffer.setNbDecoderSlots(rawNbDecoderSlots < 4 ? 4 : rawNbDecoderSlots); + m_remoteInputBuffer.setBufferLenSec(metaData); +} + void RemoteInputUDPHandler::connectTimer() { if (!m_masterTimerConnected) diff --git a/plugins/samplesource/remoteinput/remoteinputudphandler.h b/plugins/samplesource/remoteinput/remoteinputudphandler.h index dafbcbc6c..53425fc68 100644 --- a/plugins/samplesource/remoteinput/remoteinputudphandler.h +++ b/plugins/samplesource/remoteinput/remoteinputudphandler.h @@ -112,6 +112,7 @@ private: void connectTimer(); void disconnectTimer(); void processData(); + void adjustNbDecoderSlots(const RemoteMetaDataFEC& metaData); private slots: void tick();