diff options
| author | Ailurux <ailuruxx@gmail.com> | 2023-06-19 11:21:32 +1000 |
|---|---|---|
| committer | Ailurux <ailuruxx@gmail.com> | 2023-06-19 11:21:32 +1000 |
| commit | 039272455acddbe446269ea4b6ef66f44f457f1e (patch) | |
| tree | 1e9a8173aeb4eb027701e89019e9410a9550d3cb /src/audio/audio_fsm.cpp | |
| parent | 8ce751ad56c7efe19f835e3b6bbb1a843cef9119 (diff) | |
| parent | 6ff8b5886ef91ed46dba08686900d519f6c9c62d (diff) | |
| download | tangara-fw-039272455acddbe446269ea4b6ef66f44f457f1e.tar.gz | |
Merge branch 'main' of https://git.sr.ht/~jacqueline/tangara-fw
Diffstat (limited to 'src/audio/audio_fsm.cpp')
| -rw-r--r-- | src/audio/audio_fsm.cpp | 54 |
1 files changed, 47 insertions, 7 deletions
diff --git a/src/audio/audio_fsm.cpp b/src/audio/audio_fsm.cpp index 6c974905..a65b9f3b 100644 --- a/src/audio/audio_fsm.cpp +++ b/src/audio/audio_fsm.cpp @@ -5,6 +5,7 @@ */ #include "audio_fsm.hpp" +#include <future> #include <memory> #include <variant> #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 { @@ -28,7 +30,7 @@ std::unique_ptr<FatfsAudioInput> AudioState::sFileSource; std::unique_ptr<I2SAudioOutput> AudioState::sI2SOutput; std::vector<std::unique_ptr<IAudioElement>> AudioState::sPipeline; -std::deque<AudioState::EnqueuedItem> AudioState::sSongQueue; +std::deque<AudioState::EnqueuedItem> AudioState::sTrackQueue; auto AudioState::Init(drivers::GpioExpander* gpio_expander, std::weak_ptr<database::Database> database) -> bool { @@ -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<Standby>(); } -void Standby::react(const PlayFile& ev) { - if (sFileSource->OpenFile(ev.filename)) { - transit<Playback>(); +void Standby::react(const InputFileOpened& ev) { + transit<Playback>(); +} + +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,16 +103,34 @@ 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 (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<std::string>(next_item)) { sFileSource->OpenFile(std::get<std::string>(next_item)); + } else if (std::holds_alternative<database::TrackId>(next_item)) { + auto db = sDatabase.lock(); + if (!db) { + ESP_LOGW(kTag, "database not open; ignoring play request"); + return; + } + sFileSource->OpenFile( + db->GetTrackPath(std::get<database::TrackId>(next_item))); } } |
