summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorjacqueline <me@jacqueline.id.au>2024-05-09 10:59:49 +1000
committerjacqueline <me@jacqueline.id.au>2024-05-09 10:59:49 +1000
commit690c64c151777121afc2b39868f73b0fe666458e (patch)
tree03be2c6fbc1496e48d465f2ec3510d11ab4d73d9 /src
parent265049c5192cf0ce862c7db7b4745636afb6c17b (diff)
downloadtangara-fw-690c64c151777121afc2b39868f73b0fe666458e.tar.gz
Fix playback after restoring queue on boot
Diffstat (limited to 'src')
-rw-r--r--src/tangara/audio/audio_fsm.cpp14
-rw-r--r--src/tangara/audio/stream_cues.cpp16
-rw-r--r--src/tangara/audio/stream_cues.hpp3
3 files changed, 25 insertions, 8 deletions
diff --git a/src/tangara/audio/audio_fsm.cpp b/src/tangara/audio/audio_fsm.cpp
index a7c006f5..71f41938 100644
--- a/src/tangara/audio/audio_fsm.cpp
+++ b/src/tangara/audio/audio_fsm.cpp
@@ -191,6 +191,11 @@ void AudioState::react(const internal::StreamStarted& ev) {
if (!sIsPaused && !is_in_state<states::Playback>()) {
transit<states::Playback>();
+ } else {
+ // Make sure everyone knows we've got a track ready to go, even if we're
+ // not playing it yet. This mostly matters when restoring the queue from
+ // disk after booting.
+ emitPlaybackUpdate(true);
}
}
@@ -485,12 +490,13 @@ void Playback::react(const system_fsm::SdStateChanged& ev) {
void Playback::react(const internal::StreamHeartbeat& ev) {
sStreamCues.update(sOutput->samplesUsed());
- auto current = sStreamCues.current();
- if (!current.first) {
- transit<Standby>();
- } else {
+ if (sStreamCues.hasStream()) {
emitPlaybackUpdate(false);
+ } else {
+ // Finished the current stream, and there's nothing upcoming. We must be
+ // finished.
+ transit<Standby>();
}
}
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<TrackInfo> 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<std::shared_ptr<TrackInfo>, uint32_t> {
@@ -54,4 +58,8 @@ auto StreamCues::current() -> std::pair<std::shared_ptr<TrackInfo>, uint32_t> {
return {current_->track, duration};
}
+auto StreamCues::hasStream() -> bool {
+ return current_ || !upcoming_.empty();
+}
+
} // namespace audio
diff --git a/src/tangara/audio/stream_cues.hpp b/src/tangara/audio/stream_cues.hpp
index f55865b7..cd0782b0 100644
--- a/src/tangara/audio/stream_cues.hpp
+++ b/src/tangara/audio/stream_cues.hpp
@@ -26,9 +26,12 @@ class StreamCues {
/* Updates the current track given the new most recently played sample. */
auto update(uint32_t sample) -> void;
+
/* Returns the current track, and how long it has been playing for. */
auto current() -> std::pair<std::shared_ptr<TrackInfo>, uint32_t>;
+ auto hasStream() -> bool;
+
auto addCue(std::shared_ptr<TrackInfo>, uint32_t start_at) -> void;
private: