diff --git a/plugins/samplesource/sdrdaemon/sdrdaemonbuffer.cpp b/plugins/samplesource/sdrdaemon/sdrdaemonbuffer.cpp index d64eed843..ac4156949 100644 --- a/plugins/samplesource/sdrdaemon/sdrdaemonbuffer.cpp +++ b/plugins/samplesource/sdrdaemon/sdrdaemonbuffer.cpp @@ -60,7 +60,8 @@ SDRdaemonBuffer::SDRdaemonBuffer(uint32_t throttlems) : m_skewTest(false), m_skewCorrection(false), m_readCount(0), - m_writeCount(0) + m_writeCount(0), + m_nbCycles(0) { m_currentMeta.init(); } @@ -180,8 +181,8 @@ bool SDRdaemonBuffer::readMeta(char *array, uint32_t length) { if (m_skewCorrection) { - uint64_t newRate = (m_sampleRate * m_writeCount) / (m_readCount * m_iqSampleSize); - m_sampleRate = newRate * m_iqSampleSize; // ensure it is a multiple of the I/Q sample size + int64_t deltaRate = (m_writeCount - m_readCount) / (m_nbCycles * m_rawBufferLengthSeconds * m_iqSampleSize); + m_sampleRate = ((m_sampleRate + deltaRate) / m_iqSampleSize) * m_iqSampleSize; // ensure it is a multiple of the I/Q sample size resetIndexes(); } } @@ -243,6 +244,7 @@ uint8_t *SDRdaemonBuffer::readData(int32_t length) { int dIndex = (m_readIndex - m_writeIndex > 0 ? m_readIndex - m_writeIndex : m_writeIndex - m_readIndex); // absolute delta m_skewCorrection = (dIndex < m_rawSize / 10); // close by 10% + m_nbCycles++; m_skewTest = false; } @@ -367,6 +369,7 @@ void SDRdaemonBuffer::resetIndexes() m_readIndex = m_rawSize / 2; m_readCount = 0; m_writeCount = 0; + m_nbCycles = 0; m_skewTest = false; m_skewCorrection = false; } diff --git a/plugins/samplesource/sdrdaemon/sdrdaemonbuffer.h b/plugins/samplesource/sdrdaemon/sdrdaemonbuffer.h index f71e4ae45..af7c3fd11 100644 --- a/plugins/samplesource/sdrdaemon/sdrdaemonbuffer.h +++ b/plugins/samplesource/sdrdaemon/sdrdaemonbuffer.h @@ -132,8 +132,9 @@ private: bool m_autoFollowRate; //!< Auto follow stream sample rate else stick with meta data sample rate bool m_skewTest; bool m_skewCorrection; //!< Do a skew rate correction at next meta data reception - uint64_t m_readCount; - uint64_t m_writeCount; + int64_t m_readCount; + int64_t m_writeCount; + uint32_t m_nbCycles; //!< Number of buffer cycles since start of byte counting };