summaryrefslogtreecommitdiff
path: root/src/audio/include
diff options
context:
space:
mode:
authorjacqueline <me@jacqueline.id.au>2022-12-06 13:17:56 +1100
committerjacqueline <me@jacqueline.id.au>2022-12-06 13:17:56 +1100
commitf35bb64c2b8dbb72fd15f1880e4d01d263660910 (patch)
tree4696065116c21147da02b6e6470a6215b343081f /src/audio/include
parente0b2562cc4e0e5ae73efacddf68b83bd9fbb6acb (diff)
downloadtangara-fw-f35bb64c2b8dbb72fd15f1880e4d01d263660910.tar.gz
basic i2s output element
Diffstat (limited to 'src/audio/include')
-rw-r--r--src/audio/include/audio_decoder.hpp13
-rw-r--r--src/audio/include/audio_element.hpp12
-rw-r--r--src/audio/include/fatfs_audio_input.hpp14
-rw-r--r--src/audio/include/i2s_audio_output.hpp38
4 files changed, 48 insertions, 29 deletions
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 <cstddef>
#include <cstdint>
+#include <memory>
#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<void, AudioProcessingError>;
- auto ProcessChunk(cpp::span<std::byte>& chunk)
- -> cpp::result<std::size_t, AudioProcessingError>;
- auto ProcessIdle() -> cpp::result<void, AudioProcessingError>;
+ auto StackSizeBytes() const -> std::size_t override { return 8196; };
+
+ auto ProcessStreamInfo(const StreamInfo& info)
+ -> cpp::result<void, AudioProcessingError> override;
+ auto ProcessChunk(const cpp::span<std::byte>& chunk)
+ -> cpp::result<std::size_t, AudioProcessingError> override;
+ auto ProcessIdle() -> cpp::result<void, AudioProcessingError> 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<void, AudioProcessingError> = 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<std::byte>& chunk)
+ virtual auto ProcessChunk(const cpp::span<std::byte>& chunk)
-> cpp::result<std::size_t, AudioProcessingError> = 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<drivers::SdStorage> storage);
+ explicit FatfsAudioInput(std::shared_ptr<drivers::SdStorage> storage);
~FatfsAudioInput();
- auto ProcessStreamInfo(StreamInfo& info)
- -> cpp::result<void, AudioProcessingError>;
- auto ProcessChunk(cpp::span<std::byte>& chunk)
- -> cpp::result<std::size_t, AudioProcessingError> = 0;
- auto ProcessIdle() -> cpp::result<void, AudioProcessingError>;
+ auto ProcessStreamInfo(const StreamInfo& info)
+ -> cpp::result<void, AudioProcessingError> override;
+ auto ProcessChunk(const cpp::span<std::byte>& chunk)
+ -> cpp::result<std::size_t, AudioProcessingError> override;
+ auto ProcessIdle() -> cpp::result<void, AudioProcessingError> override;
auto SendChunk(cpp::span<std::byte> dest) -> size_t;
private:
- auto GetRingBufferDistance() -> size_t;
+ auto GetRingBufferDistance() const -> size_t;
std::shared_ptr<drivers::SdStorage> 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 <cstdint>
#include <memory>
+#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<std::unique_ptr<I2SAudioOutput>, Error>;
- I2SAudioOutput(std::unique_ptr<AudioDac>& dac,
- audio_element_handle_t element);
+ I2SAudioOutput(drivers::GpioExpander* expander,
+ std::unique_ptr<drivers::AudioDac> 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<void, AudioProcessingError> override;
+ auto ProcessChunk(const cpp::span<std::byte>& chunk)
+ -> cpp::result<std::size_t, AudioProcessingError> override;
+ auto ProcessIdle() -> cpp::result<void, AudioProcessingError> override;
+
+ I2SAudioOutput(const I2SAudioOutput&) = delete;
+ I2SAudioOutput& operator=(const I2SAudioOutput&) = delete;
private:
- std::unique_ptr<AudioDac> dac_;
- bool is_soft_muted_ = false;
+ auto SetVolume(uint8_t volume) -> void;
+ auto SetSoftMute(bool enabled) -> void;
+
+ drivers::GpioExpander* expander_;
+ std::unique_ptr<drivers::AudioDac> dac_;
+
+ uint8_t volume_;
+ bool is_soft_muted_;
};
-} // namespace drivers
+} // namespace audio