From c6bb42cdd21b63accd20012373a8a0e41d8566f5 Mon Sep 17 00:00:00 2001 From: jacqueline Date: Thu, 15 Jun 2023 10:42:28 +1000 Subject: song -> track --- src/audio/audio_fsm.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'src/audio/audio_fsm.cpp') diff --git a/src/audio/audio_fsm.cpp b/src/audio/audio_fsm.cpp index 6c974905..0be28250 100644 --- a/src/audio/audio_fsm.cpp +++ b/src/audio/audio_fsm.cpp @@ -28,7 +28,7 @@ std::unique_ptr AudioState::sFileSource; std::unique_ptr AudioState::sI2SOutput; std::vector> AudioState::sPipeline; -std::deque AudioState::sSongQueue; +std::deque AudioState::sTrackQueue; auto AudioState::Init(drivers::GpioExpander* gpio_expander, std::weak_ptr database) -> bool { @@ -83,11 +83,11 @@ void Playback::exit() { void Playback::react(const InputFileFinished& ev) { ESP_LOGI(kTag, "finished file"); - if (sSongQueue.empty()) { + if (sTrackQueue.empty()) { return; } - EnqueuedItem next_item = sSongQueue.front(); - sSongQueue.pop_front(); + EnqueuedItem next_item = sTrackQueue.front(); + sTrackQueue.pop_front(); if (std::holds_alternative(next_item)) { sFileSource->OpenFile(std::get(next_item)); -- cgit v1.2.3 From 6ff8b5886ef91ed46dba08686900d519f6c9c62d Mon Sep 17 00:00:00 2001 From: jacqueline Date: Mon, 19 Jun 2023 08:51:34 +1000 Subject: Support playing tracks by track id --- src/audio/audio_fsm.cpp | 46 +++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 43 insertions(+), 3 deletions(-) (limited to 'src/audio/audio_fsm.cpp') diff --git a/src/audio/audio_fsm.cpp b/src/audio/audio_fsm.cpp index 0be28250..a65b9f3b 100644 --- a/src/audio/audio_fsm.cpp +++ b/src/audio/audio_fsm.cpp @@ -5,6 +5,7 @@ */ #include "audio_fsm.hpp" +#include #include #include #include "audio_decoder.hpp" @@ -14,6 +15,7 @@ #include "i2s_audio_output.hpp" #include "i2s_dac.hpp" #include "pipeline.hpp" +#include "track.hpp" namespace audio { @@ -59,18 +61,38 @@ auto AudioState::Init(drivers::GpioExpander* gpio_expander, return true; } +void AudioState::react(const system_fsm::StorageMounted& ev) { + sDatabase = ev.db; +} + namespace states { void Uninitialised::react(const system_fsm::BootComplete&) { transit(); } -void Standby::react(const PlayFile& ev) { - if (sFileSource->OpenFile(ev.filename)) { - transit(); +void Standby::react(const InputFileOpened& ev) { + transit(); +} + +void Standby::react(const PlayTrack& ev) { + auto db = sDatabase.lock(); + if (!db) { + ESP_LOGW(kTag, "database not open; ignoring play request"); + return; + } + + if (ev.data) { + sFileSource->OpenFile(ev.data->filepath()); + } else { + sFileSource->OpenFile(db->GetTrackPath(ev.id)); } } +void Standby::react(const PlayFile& ev) { + sFileSource->OpenFile(ev.filename); +} + void Playback::entry() { ESP_LOGI(kTag, "beginning playback"); sI2SOutput->SetInUse(true); @@ -81,6 +103,16 @@ void Playback::exit() { sI2SOutput->SetInUse(false); } +void Playback::react(const PlayTrack& ev) { + sTrackQueue.push_back(EnqueuedItem(ev.id)); +} + +void Playback::react(const PlayFile& ev) { + sTrackQueue.push_back(EnqueuedItem(ev.filename)); +} + +void Playback::react(const InputFileOpened& ev) {} + void Playback::react(const InputFileFinished& ev) { ESP_LOGI(kTag, "finished file"); if (sTrackQueue.empty()) { @@ -91,6 +123,14 @@ void Playback::react(const InputFileFinished& ev) { if (std::holds_alternative(next_item)) { sFileSource->OpenFile(std::get(next_item)); + } else if (std::holds_alternative(next_item)) { + auto db = sDatabase.lock(); + if (!db) { + ESP_LOGW(kTag, "database not open; ignoring play request"); + return; + } + sFileSource->OpenFile( + db->GetTrackPath(std::get(next_item))); } } -- cgit v1.2.3