diff options
| author | jacqueline <me@jacqueline.id.au> | 2023-06-07 13:19:45 +1000 |
|---|---|---|
| committer | jacqueline <me@jacqueline.id.au> | 2023-06-07 13:19:45 +1000 |
| commit | 1f903accd95361735c841c87fdc6494ad3331b40 (patch) | |
| tree | 5b69bd0548c06a93852a576fa90a170fa303a15e /src/audio/include | |
| parent | 2a568846bd8f1c9e23e86e7570557eed6f18cf9f (diff) | |
| download | tangara-fw-1f903accd95361735c841c87fdc6494ad3331b40.tar.gz | |
Flesh out audio state machine for playback
Also fix mono playback
Diffstat (limited to 'src/audio/include')
| -rw-r--r-- | src/audio/include/audio_events.hpp | 3 | ||||
| -rw-r--r-- | src/audio/include/audio_fsm.hpp | 14 | ||||
| -rw-r--r-- | src/audio/include/audio_sink.hpp | 2 | ||||
| -rw-r--r-- | src/audio/include/i2s_audio_output.hpp | 2 | ||||
| -rw-r--r-- | src/audio/include/pipeline.hpp | 4 |
5 files changed, 25 insertions, 0 deletions
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<database::SongTags> 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 <deque> #include <memory> #include <vector> @@ -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<AudioState> { 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<drivers::I2SDac> sDac; @@ -49,6 +54,9 @@ class AudioState : public tinyfsm::Fsm<AudioState> { static std::unique_ptr<FatfsAudioInput> sFileSource; static std::unique_ptr<I2SAudioOutput> sI2SOutput; static std::vector<std::unique_ptr<IAudioElement>> sPipeline; + + typedef std::variant<database::SongId, std::string> EnqueuedItem; + static std::deque<EnqueuedItem> 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<drivers::DigitalPot> 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<Pipeline*>; + // Not copyable or movable. + Pipeline(const Pipeline&) = delete; + Pipeline& operator=(const Pipeline&) = delete; + private: IAudioElement* root_; std::vector<std::unique_ptr<Pipeline>> subtrees_; |
