From 265049c5192cf0ce862c7db7b4745636afb6c17b Mon Sep 17 00:00:00 2001 From: jacqueline Date: Wed, 8 May 2024 16:03:03 +1000 Subject: Count samples going in and out of the drain buffer This is a more accurate way of knowing which track is playing when, and also simplifies a lot of fragile logic in audio_fsm --- src/tangara/audio/stream_cues.cpp | 57 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 src/tangara/audio/stream_cues.cpp (limited to 'src/tangara/audio/stream_cues.cpp') diff --git a/src/tangara/audio/stream_cues.cpp b/src/tangara/audio/stream_cues.cpp new file mode 100644 index 00000000..0161fbf4 --- /dev/null +++ b/src/tangara/audio/stream_cues.cpp @@ -0,0 +1,57 @@ +/* + * Copyright 2024 jacqueline + * + * SPDX-License-Identifier: GPL-3.0-only + */ + +#include "audio/stream_cues.hpp" + +#include +#include + +namespace audio { + +StreamCues::StreamCues() : now_(0) {} + +auto StreamCues::update(uint32_t sample) -> void { + if (sample < now_) { + // The current time must have overflowed. Deal with any cues between now_ + // and UINT32_MAX, then proceed as normal. + while (!upcoming_.empty() && upcoming_.front().start_at > now_) { + current_ = upcoming_.front(); + upcoming_.pop_front(); + } + } + now_ = sample; + + while (!upcoming_.empty() && upcoming_.front().start_at <= now_) { + current_ = upcoming_.front(); + upcoming_.pop_front(); + } +} + +auto StreamCues::addCue(std::shared_ptr track, uint32_t sample) + -> void { + upcoming_.push_back(Cue{ + .track = track, + .start_at = sample, + }); +} + +auto StreamCues::current() -> std::pair, uint32_t> { + if (!current_) { + return {}; + } + + uint32_t duration; + if (now_ < current_->start_at) { + // now_ overflowed since this track started. + duration = now_ + (UINT32_MAX - current_->start_at); + } else { + duration = now_ - current_->start_at; + } + + return {current_->track, duration}; +} + +} // namespace audio -- cgit v1.2.3 From 690c64c151777121afc2b39868f73b0fe666458e Mon Sep 17 00:00:00 2001 From: jacqueline Date: Thu, 9 May 2024 10:59:49 +1000 Subject: Fix playback after restoring queue on boot --- src/tangara/audio/stream_cues.cpp | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) (limited to 'src/tangara/audio/stream_cues.cpp') diff --git a/src/tangara/audio/stream_cues.cpp b/src/tangara/audio/stream_cues.cpp index 0161fbf4..7a6a1426 100644 --- a/src/tangara/audio/stream_cues.cpp +++ b/src/tangara/audio/stream_cues.cpp @@ -32,10 +32,14 @@ auto StreamCues::update(uint32_t sample) -> void { auto StreamCues::addCue(std::shared_ptr track, uint32_t sample) -> void { - upcoming_.push_back(Cue{ - .track = track, - .start_at = sample, - }); + if (sample == now_) { + current_ = {track, now_}; + } else { + upcoming_.push_back(Cue{ + .track = track, + .start_at = sample, + }); + } } auto StreamCues::current() -> std::pair, uint32_t> { @@ -54,4 +58,8 @@ auto StreamCues::current() -> std::pair, uint32_t> { return {current_->track, duration}; } +auto StreamCues::hasStream() -> bool { + return current_ || !upcoming_.empty(); +} + } // namespace audio -- cgit v1.2.3