summaryrefslogtreecommitdiff
path: root/src/audio/include
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/include
parent2a568846bd8f1c9e23e86e7570557eed6f18cf9f (diff)
downloadtangara-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.hpp3
-rw-r--r--src/audio/include/audio_fsm.hpp14
-rw-r--r--src/audio/include/audio_sink.hpp2
-rw-r--r--src/audio/include/i2s_audio_output.hpp2
-rw-r--r--src/audio/include/pipeline.hpp4
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_;