diff --git a/src/audio/audio_fsm.cpp b/src/audio/audio_fsm.cpp index 17bb888c..a1bb956f 100644 --- a/src/audio/audio_fsm.cpp +++ b/src/audio/audio_fsm.cpp @@ -6,6 +6,7 @@ #include "audio_fsm.hpp" #include "audio_decoder.hpp" +#include "audio_events.hpp" #include "audio_task.hpp" #include "dac.hpp" #include "fatfs_audio_input.hpp" @@ -50,6 +51,12 @@ void Uninitialised::react(const system_fsm::BootComplete&) { }); } +void Standby::react(const PlayFile &ev) { + if (sFileSource->OpenFile(ev.filename)) { + transit(); + } +} + } // namespace states } // namespace audio diff --git a/src/audio/audio_task.cpp b/src/audio/audio_task.cpp index 58466c4f..6cc2d927 100644 --- a/src/audio/audio_task.cpp +++ b/src/audio/audio_task.cpp @@ -21,6 +21,7 @@ #include "esp_err.h" #include "esp_heap_caps.h" #include "esp_log.h" +#include "event_queue.hpp" #include "freertos/portmacro.h" #include "freertos/projdefs.h" #include "freertos/queue.h" @@ -44,10 +45,14 @@ static const char* kTag = "task"; void AudioTaskMain(std::unique_ptr pipeline, IAudioSink* sink) { std::optional output_format; + uint_fast16_t delay_ticks = pdMS_TO_TICKS(5); std::vector elements = pipeline->GetIterationOrder(); + events::EventQueue &event_queue = events::EventQueue::GetInstance(); while (1) { + event_queue.ServiceAudio(delay_ticks); + for (int i = 0; i < elements.size(); i++) { std::vector raw_in_streams; elements.at(i)->InStreams(&raw_in_streams); diff --git a/src/audio/fatfs_audio_input.cpp b/src/audio/fatfs_audio_input.cpp index affe2ff3..ed5db315 100644 --- a/src/audio/fatfs_audio_input.cpp +++ b/src/audio/fatfs_audio_input.cpp @@ -35,7 +35,7 @@ FatfsAudioInput::FatfsAudioInput() FatfsAudioInput::~FatfsAudioInput() {} -auto FatfsAudioInput::OpenFile(const std::string& path) -> void { +auto FatfsAudioInput::OpenFile(const std::string& path) -> bool { if (is_file_open_) { f_close(¤t_file_); is_file_open_ = false; @@ -44,11 +44,11 @@ auto FatfsAudioInput::OpenFile(const std::string& path) -> void { FRESULT res = f_open(¤t_file_, path.c_str(), FA_READ); if (res != FR_OK) { ESP_LOGE(kTag, "failed to open file! res: %i", res); - // TODO(jacqueline): Handle errors. - return; + return false; } is_file_open_ = true; + return true; } auto FatfsAudioInput::Process(const std::vector& inputs, diff --git a/src/audio/include/audio_events.hpp b/src/audio/include/audio_events.hpp index e59d7739..765e0899 100644 --- a/src/audio/include/audio_events.hpp +++ b/src/audio/include/audio_events.hpp @@ -6,14 +6,22 @@ #pragma once +#include + #include "tinyfsm.hpp" #include "song.hpp" namespace audio { +struct PlayFile : tinyfsm::Event { + std::string filename; +}; + struct PlaySong : tinyfsm::Event { database::SongId id; + std::optional data; + std::optional tags; }; } // namespace audio diff --git a/src/audio/include/audio_fsm.hpp b/src/audio/include/audio_fsm.hpp index bf5acf69..7368cfc8 100644 --- a/src/audio/include/audio_fsm.hpp +++ b/src/audio/include/audio_fsm.hpp @@ -37,6 +37,7 @@ class AudioState : public tinyfsm::Fsm { virtual void react(const system_fsm::BootComplete&) {} virtual void react(const PlaySong&) {} + virtual void react(const PlayFile&) {} protected: static drivers::GpioExpander* sGpioExpander; @@ -59,6 +60,12 @@ class Uninitialised : public AudioState { class Standby : public AudioState { public: void react(const PlaySong&) override {} + void react(const PlayFile&) override; + using AudioState::react; +}; + +class Playback : public AudioState { + public: using AudioState::react; }; diff --git a/src/audio/include/fatfs_audio_input.hpp b/src/audio/include/fatfs_audio_input.hpp index d2285515..98ad4d2b 100644 --- a/src/audio/include/fatfs_audio_input.hpp +++ b/src/audio/include/fatfs_audio_input.hpp @@ -28,10 +28,10 @@ namespace audio { class FatfsAudioInput : public IAudioElement { public: - explicit FatfsAudioInput(); + FatfsAudioInput(); ~FatfsAudioInput(); - auto OpenFile(const std::string& path) -> void; + auto OpenFile(const std::string& path) -> bool; auto Process(const std::vector& inputs, OutputStream* output) -> void override;