From f35bb64c2b8dbb72fd15f1880e4d01d263660910 Mon Sep 17 00:00:00 2001 From: jacqueline Date: Tue, 6 Dec 2022 13:17:56 +1100 Subject: basic i2s output element --- src/audio/include/audio_decoder.hpp | 13 ++++++----- src/audio/include/audio_element.hpp | 12 +++++------ src/audio/include/fatfs_audio_input.hpp | 14 ++++++------ src/audio/include/i2s_audio_output.hpp | 38 +++++++++++++++++++++++---------- 4 files changed, 48 insertions(+), 29 deletions(-) (limited to 'src/audio/include') diff --git a/src/audio/include/audio_decoder.hpp b/src/audio/include/audio_decoder.hpp index a32442da..a6b15d9e 100644 --- a/src/audio/include/audio_decoder.hpp +++ b/src/audio/include/audio_decoder.hpp @@ -2,6 +2,7 @@ #include #include +#include #include "ff.h" #include "span.hpp" @@ -23,11 +24,13 @@ class AudioDecoder : public IAudioElement { auto SetInputBuffer(MessageBufferHandle_t*) -> void; auto SetOutputBuffer(MessageBufferHandle_t*) -> void; - auto ProcessStreamInfo(StreamInfo& info) - -> cpp::result; - auto ProcessChunk(cpp::span& chunk) - -> cpp::result; - auto ProcessIdle() -> cpp::result; + auto StackSizeBytes() const -> std::size_t override { return 8196; }; + + auto ProcessStreamInfo(const StreamInfo& info) + -> cpp::result override; + auto ProcessChunk(const cpp::span& chunk) + -> cpp::result override; + auto ProcessIdle() -> cpp::result override; AudioDecoder(const AudioDecoder&) = delete; AudioDecoder& operator=(const AudioDecoder&) = delete; diff --git a/src/audio/include/audio_element.hpp b/src/audio/include/audio_element.hpp index 06e47b35..1973fccf 100644 --- a/src/audio/include/audio_element.hpp +++ b/src/audio/include/audio_element.hpp @@ -48,26 +48,26 @@ class IAudioElement { * be tuned according to the observed stack size of each element, as different * elements have fairly different stack requirements. */ - virtual auto StackSizeBytes() -> std::size_t { return 2048; }; + virtual auto StackSizeBytes() const -> std::size_t { return 2048; }; /* * How long to wait for new data on the input stream before triggering a call * to ProcessIdle(). If this is portMAX_DELAY (the default), then ProcessIdle * will never be called. */ - virtual auto IdleTimeout() -> TickType_t { return portMAX_DELAY; } + virtual auto IdleTimeout() const -> TickType_t { return portMAX_DELAY; } /* Returns this element's input buffer. */ - auto InputBuffer() -> MessageBufferHandle_t* { return input_buffer_; } + auto InputBuffer() const -> MessageBufferHandle_t* { return input_buffer_; } /* Returns this element's output buffer. */ - auto OutputBuffer() -> MessageBufferHandle_t* { return output_buffer_; } + auto OutputBuffer() const -> MessageBufferHandle_t* { return output_buffer_; } /* * Called when a StreamInfo message is received. Used to configure this * element in preperation for incoming chunks. */ - virtual auto ProcessStreamInfo(StreamInfo& info) + virtual auto ProcessStreamInfo(const StreamInfo& info) -> cpp::result = 0; /* @@ -76,7 +76,7 @@ class IAudioElement { * bytes in this chunk that were actually used; leftover bytes will be * prepended to the next call. */ - virtual auto ProcessChunk(cpp::span& chunk) + virtual auto ProcessChunk(const cpp::span& chunk) -> cpp::result = 0; /* diff --git a/src/audio/include/fatfs_audio_input.hpp b/src/audio/include/fatfs_audio_input.hpp index 3ca79457..63555ddc 100644 --- a/src/audio/include/fatfs_audio_input.hpp +++ b/src/audio/include/fatfs_audio_input.hpp @@ -17,19 +17,19 @@ namespace audio { class FatfsAudioInput : public IAudioElement { public: - FatfsAudioInput(std::shared_ptr storage); + explicit FatfsAudioInput(std::shared_ptr storage); ~FatfsAudioInput(); - auto ProcessStreamInfo(StreamInfo& info) - -> cpp::result; - auto ProcessChunk(cpp::span& chunk) - -> cpp::result = 0; - auto ProcessIdle() -> cpp::result; + auto ProcessStreamInfo(const StreamInfo& info) + -> cpp::result override; + auto ProcessChunk(const cpp::span& chunk) + -> cpp::result override; + auto ProcessIdle() -> cpp::result override; auto SendChunk(cpp::span dest) -> size_t; private: - auto GetRingBufferDistance() -> size_t; + auto GetRingBufferDistance() const -> size_t; std::shared_ptr storage_; diff --git a/src/audio/include/i2s_audio_output.hpp b/src/audio/include/i2s_audio_output.hpp index cd542f71..4b4a458d 100644 --- a/src/audio/include/i2s_audio_output.hpp +++ b/src/audio/include/i2s_audio_output.hpp @@ -3,30 +3,46 @@ #include #include +#include "audio_element.hpp" #include "result.hpp" #include "dac.hpp" #include "gpio_expander.hpp" +#include "sys/_stdint.h" -namespace drivers { +namespace audio { -class I2SAudioOutput : public IAudioOutput { +class I2SAudioOutput : public IAudioElement { public: enum Error { DAC_CONFIG, I2S_CONFIG, STREAM_INIT }; - static auto create(GpioExpander* expander) + static auto create(drivers::GpioExpander* expander) -> cpp::result, Error>; - I2SAudioOutput(std::unique_ptr& dac, - audio_element_handle_t element); + I2SAudioOutput(drivers::GpioExpander* expander, + std::unique_ptr dac); ~I2SAudioOutput(); - virtual auto SetVolume(uint8_t volume) -> void; - virtual auto Configure(audio_element_info_t& info) -> void; - virtual auto SetSoftMute(bool enabled) -> void; + auto SetInputBuffer(MessageBufferHandle_t* in) -> void { input_buffer_ = in; } + + auto IdleTimeout() const -> TickType_t override; + auto ProcessStreamInfo(const StreamInfo& info) + -> cpp::result override; + auto ProcessChunk(const cpp::span& chunk) + -> cpp::result override; + auto ProcessIdle() -> cpp::result override; + + I2SAudioOutput(const I2SAudioOutput&) = delete; + I2SAudioOutput& operator=(const I2SAudioOutput&) = delete; private: - std::unique_ptr dac_; - bool is_soft_muted_ = false; + auto SetVolume(uint8_t volume) -> void; + auto SetSoftMute(bool enabled) -> void; + + drivers::GpioExpander* expander_; + std::unique_ptr dac_; + + uint8_t volume_; + bool is_soft_muted_; }; -} // namespace drivers +} // namespace audio -- cgit v1.2.3