summaryrefslogtreecommitdiff
path: root/src/audio/audio_fsm.cpp
diff options
context:
space:
mode:
authorjacqueline <me@jacqueline.id.au>2023-06-07 13:19:45 +1000
committerjacqueline <me@jacqueline.id.au>2023-06-07 13:19:45 +1000
commit1f903accd95361735c841c87fdc6494ad3331b40 (patch)
tree5b69bd0548c06a93852a576fa90a170fa303a15e /src/audio/audio_fsm.cpp
parent2a568846bd8f1c9e23e86e7570557eed6f18cf9f (diff)
downloadtangara-fw-1f903accd95361735c841c87fdc6494ad3331b40.tar.gz
Flesh out audio state machine for playback
Also fix mono playback
Diffstat (limited to 'src/audio/audio_fsm.cpp')
-rw-r--r--src/audio/audio_fsm.cpp32
1 files changed, 32 insertions, 0 deletions
diff --git a/src/audio/audio_fsm.cpp b/src/audio/audio_fsm.cpp
index 3ab8b6e8..6c974905 100644
--- a/src/audio/audio_fsm.cpp
+++ b/src/audio/audio_fsm.cpp
@@ -6,6 +6,7 @@
#include "audio_fsm.hpp"
#include <memory>
+#include <variant>
#include "audio_decoder.hpp"
#include "audio_events.hpp"
#include "audio_task.hpp"
@@ -16,6 +17,8 @@
namespace audio {
+static const char kTag[] = "audio_fsm";
+
drivers::GpioExpander* AudioState::sGpioExpander;
std::shared_ptr<drivers::I2SDac> AudioState::sDac;
std::shared_ptr<drivers::DigitalPot> AudioState::sPots;
@@ -25,6 +28,8 @@ 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;
+
auto AudioState::Init(drivers::GpioExpander* gpio_expander,
std::weak_ptr<database::Database> database) -> bool {
sGpioExpander = gpio_expander;
@@ -66,6 +71,33 @@ void Standby::react(const PlayFile& ev) {
}
}
+void Playback::entry() {
+ ESP_LOGI(kTag, "beginning playback");
+ sI2SOutput->SetInUse(true);
+}
+
+void Playback::exit() {
+ ESP_LOGI(kTag, "finishing playback");
+ sI2SOutput->SetInUse(false);
+}
+
+void Playback::react(const InputFileFinished& ev) {
+ ESP_LOGI(kTag, "finished file");
+ if (sSongQueue.empty()) {
+ return;
+ }
+ EnqueuedItem next_item = sSongQueue.front();
+ sSongQueue.pop_front();
+
+ if (std::holds_alternative<std::string>(next_item)) {
+ sFileSource->OpenFile(std::get<std::string>(next_item));
+ }
+}
+
+void Playback::react(const AudioPipelineIdle& ev) {
+ transit<Standby>();
+}
+
} // namespace states
} // namespace audio