From c11f93d5b0e8bcf727c00d64a310c5f064a2c719 Mon Sep 17 00:00:00 2001 From: falkTX Date: Sun, 27 Aug 2023 09:21:28 +0200 Subject: [PATCH] Fix RingBuffer::getReadableDataSize, add a few methods Signed-off-by: falkTX --- distrho/extra/RingBuffer.hpp | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/distrho/extra/RingBuffer.hpp b/distrho/extra/RingBuffer.hpp index fc3f0136..f192f097 100644 --- a/distrho/extra/RingBuffer.hpp +++ b/distrho/extra/RingBuffer.hpp @@ -200,6 +200,14 @@ public: return (buffer->buf == nullptr || buffer->head == buffer->tail); } + /* + * Get the full ringbuffer size. + */ + uint32_t getSize() const noexcept + { + return buffer != nullptr ? buffer->size : 0; + } + /* * Get the size of the data available to read. */ @@ -207,7 +215,7 @@ public: { DISTRHO_SAFE_ASSERT_RETURN(buffer != nullptr, 0); - const uint32_t wrap = buffer->head > buffer->tail ? 0 : buffer->size; + const uint32_t wrap = buffer->head >= buffer->tail ? 0 : buffer->size; return wrap + buffer->head - buffer->tail; } @@ -219,7 +227,7 @@ public: { DISTRHO_SAFE_ASSERT_RETURN(buffer != nullptr, 0); - const uint32_t wrap = (buffer->tail > buffer->wrtn) ? 0 : buffer->size; + const uint32_t wrap = buffer->tail > buffer->wrtn ? 0 : buffer->size; return wrap + buffer->tail - buffer->wrtn; } @@ -243,6 +251,20 @@ public: std::memset(buffer->buf, 0, buffer->size); } + /* + * Reset the ring buffer read and write positions, marking the buffer as empty. + * Requires a buffer struct tied to this class. + */ + void flush() noexcept + { + DISTRHO_SAFE_ASSERT_RETURN(buffer != nullptr,); + + buffer->head = buffer->tail = buffer->wrtn = 0; + buffer->invalidateCommit = false; + + errorWriting = false; + } + // ------------------------------------------------------------------- // read operations