summaryrefslogtreecommitdiff
path: root/src/audio/audio_fsm.cpp
diff options
context:
space:
mode:
authorAilurux <ailuruxx@gmail.com>2023-06-19 11:21:32 +1000
committerAilurux <ailuruxx@gmail.com>2023-06-19 11:21:32 +1000
commit039272455acddbe446269ea4b6ef66f44f457f1e (patch)
tree1e9a8173aeb4eb027701e89019e9410a9550d3cb /src/audio/audio_fsm.cpp
parent8ce751ad56c7efe19f835e3b6bbb1a843cef9119 (diff)
parent6ff8b5886ef91ed46dba08686900d519f6c9c62d (diff)
downloadtangara-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.cpp54
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)));
}
}