Remote input buffer size rework: dynamically allocated number of decoder slots. Implements #534

This commit is contained in:
f4exb 2020-06-28 08:17:39 +02:00
parent 385d8cc2db
commit 206eaff050
4 changed files with 24 additions and 1 deletions

View File

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

View File

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

View File

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

View File

@ -112,6 +112,7 @@ private:
void connectTimer();
void disconnectTimer();
void processData();
void adjustNbDecoderSlots(const RemoteMetaDataFEC& metaData);
private slots:
void tick();