From 1f903accd95361735c841c87fdc6494ad3331b40 Mon Sep 17 00:00:00 2001 From: jacqueline Date: Wed, 7 Jun 2023 13:19:45 +1000 Subject: Flesh out audio state machine for playback Also fix mono playback --- src/audio/include/audio_events.hpp | 3 +++ src/audio/include/audio_fsm.hpp | 14 ++++++++++++++ src/audio/include/audio_sink.hpp | 2 ++ src/audio/include/i2s_audio_output.hpp | 2 ++ src/audio/include/pipeline.hpp | 4 ++++ 5 files changed, 25 insertions(+) (limited to 'src/audio/include') diff --git a/src/audio/include/audio_events.hpp b/src/audio/include/audio_events.hpp index 765e0899..920b134e 100644 --- a/src/audio/include/audio_events.hpp +++ b/src/audio/include/audio_events.hpp @@ -24,4 +24,7 @@ struct PlaySong : tinyfsm::Event { std::optional tags; }; +struct InputFileFinished : tinyfsm::Event {}; +struct AudioPipelineIdle : tinyfsm::Event {}; + } // namespace audio diff --git a/src/audio/include/audio_fsm.hpp b/src/audio/include/audio_fsm.hpp index 6274041c..5dad87c0 100644 --- a/src/audio/include/audio_fsm.hpp +++ b/src/audio/include/audio_fsm.hpp @@ -6,6 +6,7 @@ #pragma once +#include #include #include @@ -16,6 +17,7 @@ #include "gpio_expander.hpp" #include "i2s_audio_output.hpp" #include "i2s_dac.hpp" +#include "song.hpp" #include "storage.hpp" #include "tinyfsm.hpp" @@ -40,6 +42,9 @@ class AudioState : public tinyfsm::Fsm { virtual void react(const PlaySong&) {} virtual void react(const PlayFile&) {} + virtual void react(const InputFileFinished&) {} + virtual void react(const AudioPipelineIdle&) {} + protected: static drivers::GpioExpander* sGpioExpander; static std::shared_ptr sDac; @@ -49,6 +54,9 @@ class AudioState : public tinyfsm::Fsm { static std::unique_ptr sFileSource; static std::unique_ptr sI2SOutput; static std::vector> sPipeline; + + typedef std::variant EnqueuedItem; + static std::deque sSongQueue; }; namespace states { @@ -68,6 +76,12 @@ class Standby : public AudioState { class Playback : public AudioState { public: + void entry() override; + void exit() override; + + void react(const InputFileFinished&) override; + void react(const AudioPipelineIdle&) override; + using AudioState::react; }; diff --git a/src/audio/include/audio_sink.hpp b/src/audio/include/audio_sink.hpp index 2cc706ff..e6538bda 100644 --- a/src/audio/include/audio_sink.hpp +++ b/src/audio/include/audio_sink.hpp @@ -40,6 +40,8 @@ class IAudioSink { free(metadata_); } + virtual auto SetInUse(bool) -> void {} + virtual auto SetVolumeImbalance(int_fast8_t balance) -> void = 0; virtual auto SetVolume(uint_fast8_t percent) -> void = 0; virtual auto GetVolume() -> uint_fast8_t = 0; diff --git a/src/audio/include/i2s_audio_output.hpp b/src/audio/include/i2s_audio_output.hpp index 20980573..7c125476 100644 --- a/src/audio/include/i2s_audio_output.hpp +++ b/src/audio/include/i2s_audio_output.hpp @@ -29,6 +29,8 @@ class I2SAudioOutput : public IAudioSink { std::weak_ptr pots); ~I2SAudioOutput(); + auto SetInUse(bool) -> void override; + auto SetVolumeImbalance(int_fast8_t balance) -> void override; auto SetVolume(uint_fast8_t percent) -> void override; auto GetVolume() -> uint_fast8_t override; diff --git a/src/audio/include/pipeline.hpp b/src/audio/include/pipeline.hpp index c1f6bf59..bb773006 100644 --- a/src/audio/include/pipeline.hpp +++ b/src/audio/include/pipeline.hpp @@ -36,6 +36,10 @@ class Pipeline { auto GetIterationOrder() -> std::vector; + // Not copyable or movable. + Pipeline(const Pipeline&) = delete; + Pipeline& operator=(const Pipeline&) = delete; + private: IAudioElement* root_; std::vector> subtrees_; -- cgit v1.2.3