From 135e912f3ef435f763e4a68b2dc22da6d33ebc85 Mon Sep 17 00:00:00 2001 From: h3ndrik Date: Mon, 20 Aug 2018 16:53:59 +0200 Subject: [PATCH] increase max buffer size beyond 64k (#117) The ESP32 can easily handle a buffer size greater than UINT16_MAX (64KB) so make the size an uint32_t. --- src/AudioFileSourceBuffer.cpp | 24 ++++++++++++------------ src/AudioFileSourceBuffer.h | 12 ++++++------ 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/AudioFileSourceBuffer.cpp b/src/AudioFileSourceBuffer.cpp index abd9947d..888944d1 100644 --- a/src/AudioFileSourceBuffer.cpp +++ b/src/AudioFileSourceBuffer.cpp @@ -23,7 +23,7 @@ #pragma GCC optimize ("O3") -AudioFileSourceBuffer::AudioFileSourceBuffer(AudioFileSource *source, int buffSizeBytes) +AudioFileSourceBuffer::AudioFileSourceBuffer(AudioFileSource *source, uint32_t buffSizeBytes) { buffSize = buffSizeBytes; buffer = (uint8_t*)malloc(sizeof(uint8_t) * buffSize); @@ -36,7 +36,7 @@ AudioFileSourceBuffer::AudioFileSourceBuffer(AudioFileSource *source, int buffSi filled = false; } -AudioFileSourceBuffer::AudioFileSourceBuffer(AudioFileSource *source, void *inBuff, int buffSizeBytes) +AudioFileSourceBuffer::AudioFileSourceBuffer(AudioFileSource *source, void *inBuff, uint32_t buffSizeBytes) { buffSize = buffSizeBytes; buffer = (uint8_t*)inBuff; @@ -149,24 +149,24 @@ void AudioFileSourceBuffer::fill() if (length < buffSize) { // Now try and opportunistically fill the buffer if (readPtr > writePtr) { - int bytesAvailMid = readPtr - writePtr - 1; - if (bytesAvailMid > 0) { - int cnt = src->readNonBlock(&buffer[writePtr], bytesAvailMid); - length += cnt; - writePtr = (writePtr + cnt) % buffSize; - } + if (readPtr == writePtr+1) return; + uint32_t bytesAvailMid = readPtr - writePtr - 1; + int cnt = src->readNonBlock(&buffer[writePtr], bytesAvailMid); + length += cnt; + writePtr = (writePtr + cnt) % buffSize; return; } - int bytesAvailEnd = buffSize - writePtr; - if (bytesAvailEnd > 0) { + if (buffSize > writePtr) { + uint32_t bytesAvailEnd = buffSize - writePtr; int cnt = src->readNonBlock(&buffer[writePtr], bytesAvailEnd); length += cnt; writePtr = (writePtr + cnt) % buffSize; if (cnt != bytesAvailEnd) return; } - int bytesAvailStart = readPtr - 1; - if (bytesAvailStart > 0) { + + if (readPtr > 1) { + uint32_t bytesAvailStart = readPtr - 1; int cnt = src->readNonBlock(&buffer[writePtr], bytesAvailStart); length += cnt; writePtr = (writePtr + cnt) % buffSize; diff --git a/src/AudioFileSourceBuffer.h b/src/AudioFileSourceBuffer.h index cc4e659c..6c8dc6c2 100644 --- a/src/AudioFileSourceBuffer.h +++ b/src/AudioFileSourceBuffer.h @@ -27,8 +27,8 @@ class AudioFileSourceBuffer : public AudioFileSource { public: - AudioFileSourceBuffer(AudioFileSource *in, int bufferBytes); - AudioFileSourceBuffer(AudioFileSource *in, void *buffer, int bufferBytes); // Pre-allocated buffer by app + AudioFileSourceBuffer(AudioFileSource *in, uint32_t bufferBytes); + AudioFileSourceBuffer(AudioFileSource *in, void *buffer, uint32_t bufferBytes); // Pre-allocated buffer by app virtual ~AudioFileSourceBuffer() override; virtual uint32_t read(void *data, uint32_t len) override; @@ -48,12 +48,12 @@ class AudioFileSourceBuffer : public AudioFileSource private: AudioFileSource *src; - uint16_t buffSize; + uint32_t buffSize; uint8_t *buffer; bool deallocateBuffer; - uint16_t writePtr; - uint16_t readPtr; - uint16_t length; + uint32_t writePtr; + uint32_t readPtr; + uint32_t length; bool filled; };