From 1c0ef544d3fb1ad49c5e8e00bea4a76245112cc0 Mon Sep 17 00:00:00 2001 From: f4exb Date: Sat, 19 Mar 2016 03:49:38 +0100 Subject: [PATCH] SDRdaemon plugin: fix auto read/write balance correction --- .../sdrdaemon/sdrdaemonbuffer.cpp | 29 +++++++++---------- .../samplesource/sdrdaemon/sdrdaemonbuffer.h | 4 +-- 2 files changed, 15 insertions(+), 18 deletions(-) diff --git a/plugins/samplesource/sdrdaemon/sdrdaemonbuffer.cpp b/plugins/samplesource/sdrdaemon/sdrdaemonbuffer.cpp index b542b8fc5..d3b3d4187 100644 --- a/plugins/samplesource/sdrdaemon/sdrdaemonbuffer.cpp +++ b/plugins/samplesource/sdrdaemon/sdrdaemonbuffer.cpp @@ -64,9 +64,7 @@ SDRdaemonBuffer::SDRdaemonBuffer(uint32_t throttlems) : m_readCount(0), m_writeCount(0), m_nbCycles(0), - m_readCountBal(0), - m_writeCountBal(0), - m_nbReadsBal(0) + m_nbReads(0) { m_currentMeta.init(); } @@ -260,13 +258,18 @@ uint8_t *SDRdaemonBuffer::readData(int32_t length) m_skewCorrection = (dIndex < m_rawSize / 10); // close by 10% m_nbCycles++; // auto R/W balance calculation - if (m_nbReadsBal && m_autoCorrBuffer) + if (m_nbReads && m_autoCorrBuffer) { - int32_t dBytes = (m_writeCountBal - m_readCountBal) / m_nbReadsBal; - m_balCorrection += dBytes / (int32_t) m_iqSampleSize; - m_readCountBal = 0; - m_writeCountBal = 0; - m_nbReadsBal = 0; + int32_t dBytes; + + if (m_readIndex > m_writeIndex) { // write leads + dBytes = m_writeIndex; // positive from start of buffer + } else { // read leads + dBytes = m_writeIndex - (int32_t) m_rawSize; // negative from end of buffer + } + + m_balCorrection += dBytes / (int32_t) (m_nbReads * m_iqSampleSize); // correction is in number of samples + m_nbReads = 0; } else { @@ -277,8 +280,7 @@ uint8_t *SDRdaemonBuffer::readData(int32_t length) } m_readCount += length; - m_readCountBal += length; - m_nbReadsBal++; + m_nbReads++; if (m_readIndex + length < m_rawSize) { @@ -389,7 +391,6 @@ void SDRdaemonBuffer::writeToRawBufferUncompressed(const char *array, uint32_t l } m_writeCount += length; - m_writeCountBal += length; } void SDRdaemonBuffer::resetIndexes() @@ -401,9 +402,7 @@ void SDRdaemonBuffer::resetIndexes() m_nbCycles = 0; m_skewTest = false; m_skewCorrection = false; - m_readCountBal = 0; - m_writeCountBal = 0; - m_nbReadsBal = 0; + m_nbReads = 0; m_balCorrection = 0; } diff --git a/plugins/samplesource/sdrdaemon/sdrdaemonbuffer.h b/plugins/samplesource/sdrdaemon/sdrdaemonbuffer.h index c594f1915..2cd25efd3 100644 --- a/plugins/samplesource/sdrdaemon/sdrdaemonbuffer.h +++ b/plugins/samplesource/sdrdaemon/sdrdaemonbuffer.h @@ -166,9 +166,7 @@ private: int64_t m_writeCount; //!< Number of bytes written for auto skew compensation uint32_t m_nbCycles; //!< Number of buffer cycles since start of auto skew compensation byte counting - int64_t m_readCountBal; //!< Number of bytes read for auto R/W balance - int64_t m_writeCountBal; //!< Number of bytes written for auto R/W balance - uint32_t m_nbReadsBal; //!< Number of buffer reads since start of auto R/W balance byte counting + uint32_t m_nbReads; //!< Number of buffer reads since start of auto R/W balance correction period int32_t m_balCorrection; //!< R/W balance correction in number of samples };