diff --git a/sdrbase/dsp/samplemofifo.cpp b/sdrbase/dsp/samplemofifo.cpp index 45c65f8a1..3f33f4475 100644 --- a/sdrbase/dsp/samplemofifo.cpp +++ b/sdrbase/dsp/samplemofifo.cpp @@ -128,6 +128,40 @@ void SampleMOFifo::writeSync(const std::vector& vb } } +void SampleMOFifo::writeSync( + unsigned int amount, + unsigned int& ipart1Begin, unsigned int& ipart1End, // first part offsets where to write + unsigned int& ipart2Begin, unsigned int& ipart2End // second part offsets +) +{ + QMutexLocker mutexLocker(&m_mutex); + unsigned int spaceLeft = m_size - m_writeHead; + + if (amount <= spaceLeft) + { + ipart1Begin = m_writeHead; + ipart1End = m_writeHead + amount; + ipart2Begin = m_size; + ipart2End = m_size; + m_writeHead += amount; + } + else + { + unsigned int remaining = amount - spaceLeft; + ipart1Begin = m_writeHead; + ipart1End = m_size; + ipart2Begin = 0; + ipart2End = remaining; + m_writeHead = remaining; + } +} + +void SampleMOFifo::commitWriteSync(unsigned int amount) +{ + QMutexLocker mutexLocker(&m_mutex); + m_readCount = amount < m_readCount ? m_readCount - amount : 0; +} + void SampleMOFifo::readAsync( unsigned int amount, unsigned int& ipart1Begin, unsigned int& ipart1End, @@ -187,3 +221,38 @@ void SampleMOFifo::writeAsync(const SampleVector::const_iterator& begin, unsigne } } } + +void SampleMOFifo::writeAsync( + unsigned int amount, + unsigned int& ipart1Begin, unsigned int& ipart1End, + unsigned int& ipart2Begin, unsigned int& ipart2End, + unsigned int stream +) +{ + QMutexLocker mutexLocker(&m_mutex); + unsigned int spaceLeft = m_size - m_vWriteHead[stream]; + + if (amount <= spaceLeft) + { + ipart1Begin = m_vWriteHead[stream]; + ipart1End = m_vWriteHead[stream] + amount; + ipart2Begin = m_size; + ipart2End = m_size; + m_vWriteHead[stream] += amount; + } + else + { + unsigned int remaining = amount - spaceLeft; + ipart1Begin = m_vWriteHead[stream]; + ipart1End = m_size; + ipart2Begin = 0; + ipart2End = remaining; + m_vWriteHead[stream] = remaining; + } +} + +void SampleMOFifo::commitWriteAsync(unsigned int amount, unsigned int stream) +{ + QMutexLocker mutexLocker(&m_mutex); + m_vReadCount[stream] = amount < m_vReadCount[stream] ? m_vReadCount[stream] - amount : 0; +} \ No newline at end of file diff --git a/sdrbase/dsp/samplemofifo.h b/sdrbase/dsp/samplemofifo.h index 01988485c..0575343ca 100644 --- a/sdrbase/dsp/samplemofifo.h +++ b/sdrbase/dsp/samplemofifo.h @@ -35,10 +35,16 @@ public: void readSync( unsigned int amount, - unsigned int& ipart1Begin, unsigned int& ipart1End, - unsigned int& ipart2Begin, unsigned int& ipart2End + unsigned int& ipart1Begin, unsigned int& ipart1End, // first part offsets where to read + unsigned int& ipart2Begin, unsigned int& ipart2End // second part offsets ); - void writeSync(const std::vector& vbegin, unsigned int amount); + void writeSync(const std::vector& vbegin, unsigned int amount); //!< copy write + void writeSync( //!< in place write + unsigned int amount, + unsigned int& ipart1Begin, unsigned int& ipart1End, // first part offsets where to write + unsigned int& ipart2Begin, unsigned int& ipart2End // second part offsets + ); + void commitWriteSync(unsigned int amount); //!< For in place write tells how much samples were written once done void readAsync( unsigned int amount, @@ -46,7 +52,14 @@ public: unsigned int& ipart2Begin, unsigned int& ipart2End, unsigned int stream ); - void writeAsync(const SampleVector::const_iterator& begin, unsigned int amount, unsigned int stream); + void writeAsync(const SampleVector::const_iterator& begin, unsigned int amount, unsigned int stream); //!< copy write + void writeAsync( //!< in place write + unsigned int amount, + unsigned int& ipart1Begin, unsigned int& ipart1End, + unsigned int& ipart2Begin, unsigned int& ipart2End, + unsigned int stream + ); + void commitWriteAsync(unsigned int amount, unsigned int stream); //!< For in place write tells how much samples were written once done std::vector& getData() { return m_data; } SampleVector& getData(unsigned int stream) { return m_data[stream]; }