summaryrefslogtreecommitdiff
path: root/src/audio/audio_fsm.cpp
diff options
context:
space:
mode:
authorjacqueline <me@jacqueline.id.au>2023-06-19 08:51:34 +1000
committerjacqueline <me@jacqueline.id.au>2023-06-19 08:51:34 +1000
commit6ff8b5886ef91ed46dba08686900d519f6c9c62d (patch)
tree133daa91898e047fd93a5e83ba6990af2904e5a1 /src/audio/audio_fsm.cpp
parent4e5dba158367f9b8b440e6c5051c95d9c22b76d7 (diff)
downloadtangara-fw-6ff8b5886ef91ed46dba08686900d519f6c9c62d.tar.gz
Support playing tracks by track id
Diffstat (limited to 'src/audio/audio_fsm.cpp')
-rw-r--r--src/audio/audio_fsm.cpp46
1 files changed, 43 insertions, 3 deletions
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 <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 {
@@ -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,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<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)));
}
}