From 20d28e80a5c861a9d5f449ea911ab75b4f37ad0d Mon Sep 17 00:00:00 2001 From: Jef Date: Tue, 24 Sep 2024 14:54:57 +0200 Subject: Initial community commit --- Src/nu/GaplessRingBuffer.cpp | 64 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 Src/nu/GaplessRingBuffer.cpp (limited to 'Src/nu/GaplessRingBuffer.cpp') diff --git a/Src/nu/GaplessRingBuffer.cpp b/Src/nu/GaplessRingBuffer.cpp new file mode 100644 index 00000000..6628cddc --- /dev/null +++ b/Src/nu/GaplessRingBuffer.cpp @@ -0,0 +1,64 @@ +#include "GaplessRingBuffer.h" +#include +#include +#include + +GaplessRingBuffer::GaplessRingBuffer() +{ + pregapBytes = 0; + frameBytes = 0; + postgapBytes = 0; + currentPregapBytes = 0; +} + +GaplessRingBuffer::~GaplessRingBuffer() +{ +} + +int GaplessRingBuffer::Initialize(size_t samples, size_t bps, size_t channels, size_t pregap, size_t postgap) +{ + this->frameBytes = channels * bps / 8; + this->currentPregapBytes = this->pregapBytes = pregap * frameBytes; + this->postgapBytes = postgap * frameBytes; + + ring_buffer.reserve(samples * frameBytes + pregapBytes); + return NErr_Success; +} + +bool GaplessRingBuffer::Empty() const +{ + return (ring_buffer.size() <= pregapBytes); +} + +size_t GaplessRingBuffer::Read(void *destination, size_t destination_bytes) +{ + // make sure we've filled enough of the buffer to satisfy the postgap + if (Empty()) { + return 0; + } + + // don't read into postgap area + size_t remaining = ring_buffer.size() - postgapBytes; + destination_bytes = min(remaining, destination_bytes); + + return ring_buffer.read(destination, destination_bytes); +} + +size_t GaplessRingBuffer::Write(const void *input, size_t input_bytes) +{ + // cut pregap if necessary + if (currentPregapBytes) { + size_t cut = min(input_bytes, currentPregapBytes); + currentPregapBytes -= cut; + input_bytes -= cut; + input = (const uint8_t *)input + cut; + } + + return ring_buffer.write(input, input_bytes); +} + +void GaplessRingBuffer::Reset() +{ + currentPregapBytes = pregapBytes; + ring_buffer.clear(); +} \ No newline at end of file -- cgit