diff options
| author | jacqueline <me@jacqueline.id.au> | 2023-02-10 15:32:21 +1100 |
|---|---|---|
| committer | jacqueline <me@jacqueline.id.au> | 2023-02-10 15:32:21 +1100 |
| commit | 61c91b3cdb2c9dd655f3adf0f461f5cefb3b2e9b (patch) | |
| tree | 8d0bb288781f86455f02219d0b7ac8cee493eeb3 /src/audio/include | |
| parent | cabfd4b75ecc733bdf36997606a686c4d2bc277d (diff) | |
| download | tangara-fw-61c91b3cdb2c9dd655f3adf0f461f5cefb3b2e9b.tar.gz | |
Mostly working pipeline, including proper EOF signalling
Diffstat (limited to 'src/audio/include')
| -rw-r--r-- | src/audio/include/audio_decoder.hpp | 1 | ||||
| -rw-r--r-- | src/audio/include/audio_element.hpp | 2 | ||||
| -rw-r--r-- | src/audio/include/audio_task.hpp | 4 | ||||
| -rw-r--r-- | src/audio/include/chunk.hpp | 5 | ||||
| -rw-r--r-- | src/audio/include/fatfs_audio_input.hpp | 1 | ||||
| -rw-r--r-- | src/audio/include/i2s_audio_output.hpp | 12 | ||||
| -rw-r--r-- | src/audio/include/stream_event.hpp | 2 |
7 files changed, 24 insertions, 3 deletions
diff --git a/src/audio/include/audio_decoder.hpp b/src/audio/include/audio_decoder.hpp index d0f7469b..aa83825f 100644 --- a/src/audio/include/audio_decoder.hpp +++ b/src/audio/include/audio_decoder.hpp @@ -37,6 +37,7 @@ class AudioDecoder : public IAudioElement { -> cpp::result<void, AudioProcessingError> override; auto ProcessChunk(const cpp::span<std::byte>& chunk) -> cpp::result<std::size_t, AudioProcessingError> override; + auto ProcessEndOfStream() -> void override; auto Process() -> cpp::result<void, AudioProcessingError> override; AudioDecoder(const AudioDecoder&) = delete; diff --git a/src/audio/include/audio_element.hpp b/src/audio/include/audio_element.hpp index c6453d4d..0c80524c 100644 --- a/src/audio/include/audio_element.hpp +++ b/src/audio/include/audio_element.hpp @@ -105,6 +105,8 @@ class IAudioElement { virtual auto ProcessChunk(const cpp::span<std::byte>& chunk) -> cpp::result<std::size_t, AudioProcessingError> = 0; + virtual auto ProcessEndOfStream() -> void = 0; + /* * Called when there has been no data received over the input buffer for some * time. This could be used to synthesize output, or to save memory by diff --git a/src/audio/include/audio_task.hpp b/src/audio/include/audio_task.hpp index 9a76ea7e..399ad679 100644 --- a/src/audio/include/audio_task.hpp +++ b/src/audio/include/audio_task.hpp @@ -1,9 +1,12 @@ #pragma once #include <memory> +#include <string> +#include <optional> #include "audio_element.hpp" #include "audio_element_handle.hpp" +#include "freertos/portmacro.h" namespace audio { @@ -12,6 +15,7 @@ struct AudioTaskArgs { }; auto StartAudioTask(const std::string& name, + std::optional<BaseType_t> core_id, std::shared_ptr<IAudioElement> element) -> std::unique_ptr<AudioElementHandle>; diff --git a/src/audio/include/chunk.hpp b/src/audio/include/chunk.hpp index 0ece1ed6..31e1f969 100644 --- a/src/audio/include/chunk.hpp +++ b/src/audio/include/chunk.hpp @@ -27,7 +27,8 @@ class ChunkReader { explicit ChunkReader(std::size_t chunk_size); ~ChunkReader(); - auto HandleLeftovers(std::size_t bytes_used) -> void; + auto HandleBytesLeftOver(std::size_t bytes_left) -> void; + auto HandleBytesUsed(std::size_t bytes_used) -> void; /* * Reads chunks of data from the given input stream, and invokes the given @@ -43,6 +44,8 @@ class ChunkReader { */ auto HandleNewData(cpp::span<std::byte> data) -> cpp::span<std::byte>; + auto GetLeftovers() -> cpp::span<std::byte>; + ChunkReader(const ChunkReader&) = delete; ChunkReader& operator=(const ChunkReader&) = delete; diff --git a/src/audio/include/fatfs_audio_input.hpp b/src/audio/include/fatfs_audio_input.hpp index 5625d941..883441c2 100644 --- a/src/audio/include/fatfs_audio_input.hpp +++ b/src/audio/include/fatfs_audio_input.hpp @@ -28,6 +28,7 @@ class FatfsAudioInput : public IAudioElement { -> cpp::result<void, AudioProcessingError> override; auto ProcessChunk(const cpp::span<std::byte>& chunk) -> cpp::result<std::size_t, AudioProcessingError> override; + auto ProcessEndOfStream() -> void override; auto Process() -> cpp::result<void, AudioProcessingError> override; FatfsAudioInput(const FatfsAudioInput&) = delete; diff --git a/src/audio/include/i2s_audio_output.hpp b/src/audio/include/i2s_audio_output.hpp index 02ac7a16..b4fd4c59 100644 --- a/src/audio/include/i2s_audio_output.hpp +++ b/src/audio/include/i2s_audio_output.hpp @@ -4,6 +4,7 @@ #include <memory> #include "audio_element.hpp" +#include "chunk.hpp" #include "result.hpp" #include "dac.hpp" @@ -21,13 +22,13 @@ class I2SAudioOutput : public IAudioElement { std::unique_ptr<drivers::AudioDac> dac); ~I2SAudioOutput(); - // TODO. - auto HasUnprocessedInput() -> bool override { return false; } + auto HasUnprocessedInput() -> bool 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 ProcessEndOfStream() -> void override; auto Process() -> cpp::result<void, AudioProcessingError> override; I2SAudioOutput(const I2SAudioOutput&) = delete; @@ -37,11 +38,18 @@ class I2SAudioOutput : public IAudioElement { auto SetVolume(uint8_t volume) -> void; auto SetSoftMute(bool enabled) -> void; + auto ClearDmaQueue() -> void; + drivers::GpioExpander* expander_; std::unique_ptr<drivers::AudioDac> dac_; uint8_t volume_; bool is_soft_muted_; + + std::optional<ChunkReader> chunk_reader_; + cpp::span<std::byte> latest_chunk_; + std::optional<std::size_t> dma_size_; + QueueHandle_t dma_queue_; }; } // namespace audio diff --git a/src/audio/include/stream_event.hpp b/src/audio/include/stream_event.hpp index 4f441fa5..e84c8388 100644 --- a/src/audio/include/stream_event.hpp +++ b/src/audio/include/stream_event.hpp @@ -16,6 +16,7 @@ struct StreamEvent { static auto CreateChunkData(QueueHandle_t source, std::size_t chunk_size) -> StreamEvent*; static auto CreateChunkNotification(QueueHandle_t source) -> StreamEvent*; + static auto CreateEndOfStream(QueueHandle_t source) -> StreamEvent*; StreamEvent(); ~StreamEvent(); @@ -28,6 +29,7 @@ struct StreamEvent { STREAM_INFO, CHUNK_DATA, CHUNK_NOTIFICATION, + END_OF_STREAM, } tag; union { |
