From 022aa38396cecb11b9de4b61665a6416378b4a95 Mon Sep 17 00:00:00 2001 From: ailurux Date: Wed, 14 Aug 2024 10:19:26 +1000 Subject: [PATCH 1/2] Fix for position persisting when queue reset --- src/tangara/audio/track_queue.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/tangara/audio/track_queue.cpp b/src/tangara/audio/track_queue.cpp index 91bdda39..fb4ff696 100644 --- a/src/tangara/audio/track_queue.cpp +++ b/src/tangara/audio/track_queue.cpp @@ -286,6 +286,7 @@ auto TrackQueue::finish() -> void { auto TrackQueue::clear() -> void { { const std::unique_lock lock(mutex_); + position_ = 0; playlist_.clear(); opened_playlist_.reset(); if (shuffle_) { From 40c754a72a23a849321b60dbd77fa1303c77953b Mon Sep 17 00:00:00 2001 From: jacqueline Date: Wed, 14 Aug 2024 15:18:57 +1000 Subject: [PATCH 2/2] Always initialise bytes_cleared when clearing PcmBuffers --- src/drivers/pcm_buffer.cpp | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/drivers/pcm_buffer.cpp b/src/drivers/pcm_buffer.cpp index 3f4a0443..142a6376 100644 --- a/src/drivers/pcm_buffer.cpp +++ b/src/drivers/pcm_buffer.cpp @@ -66,10 +66,17 @@ IRAM_ATTR auto PcmBuffer::receive(std::span dest, bool isr) auto PcmBuffer::clear() -> void { while (!isEmpty()) { - size_t bytes_cleared; + size_t bytes_cleared = 0; void* data = xRingbufferReceive(ringbuf_, &bytes_cleared, 0); - vRingbufferReturnItem(ringbuf_, data); - received_ += bytes_cleared / sizeof(int16_t); + if (data) { + vRingbufferReturnItem(ringbuf_, data); + received_ += bytes_cleared / sizeof(int16_t); + } else { + // Defensively guard against looping forever if for some reason the + // buffer isn't draining. + ESP_LOGW(kTag, "PcmBuffer not draining"); + break; + } } }