Skip to content

Commit 674a5b4

Browse files
committed
fix(audio): restore full AudioBufferFifo capacity
The full() check using readIdx == nextBufferIdx(writeIdx) leaves one buffer slot unusable as a watermark. Add explicit bufferFull flag so all AUDIO_BUFFER_COUNT slots are usable, restoring the 10-buffer (100ms) headroom for SPI flash targets.
1 parent 18347c5 commit 674a5b4

1 file changed

Lines changed: 13 additions & 5 deletions

File tree

radio/src/audio.h

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -302,18 +302,19 @@ class AudioBufferFifo {
302302
private:
303303
volatile uint8_t readIdx;
304304
volatile uint8_t writeIdx;
305+
volatile bool bufferFull;
305306

306307
inline uint8_t nextBufferIdx(uint8_t idx) const
307308
{
308309
return (idx >= AUDIO_BUFFER_COUNT - 1 ? 0 : idx + 1);
309310
}
310311

311-
bool full() const { return readIdx == nextBufferIdx(writeIdx); }
312+
bool full() const { return bufferFull; }
312313
bool empty() const { return readIdx == writeIdx; }
313314
uint8_t used() const { return (writeIdx - readIdx) % AUDIO_BUFFER_COUNT; }
314315

315316
public:
316-
AudioBufferFifo() : readIdx(0), writeIdx(0)
317+
AudioBufferFifo() : readIdx(0), writeIdx(0), bufferFull(false)
317318
{
318319
memset(audioBuffers, 0, sizeof(audioBuffers));
319320
}
@@ -326,10 +327,17 @@ class AudioBufferFifo {
326327
}
327328

328329
// puts filled buffer into FIFO
329-
void audioPushBuffer() { writeIdx = nextBufferIdx(writeIdx); }
330+
void audioPushBuffer()
331+
{
332+
writeIdx = nextBufferIdx(writeIdx);
333+
if (writeIdx == readIdx) bufferFull = true;
334+
}
330335

331-
// frees the last played buffer
332-
void freeNextFilledBuffer() { readIdx = nextBufferIdx(readIdx); }
336+
void freeNextFilledBuffer()
337+
{
338+
readIdx = nextBufferIdx(readIdx);
339+
bufferFull = false;
340+
}
333341

334342
// returns a pointer to the audio buffer to be played
335343
const AudioBuffer *getNextFilledBuffer()

0 commit comments

Comments
 (0)