From 61c91b3cdb2c9dd655f3adf0f461f5cefb3b2e9b Mon Sep 17 00:00:00 2001 From: jacqueline Date: Fri, 10 Feb 2023 15:32:21 +1100 Subject: Mostly working pipeline, including proper EOF signalling --- src/audio/include/audio_decoder.hpp | 1 + src/audio/include/audio_element.hpp | 2 ++ src/audio/include/audio_task.hpp | 4 ++++ src/audio/include/chunk.hpp | 5 ++++- src/audio/include/fatfs_audio_input.hpp | 1 + src/audio/include/i2s_audio_output.hpp | 12 ++++++++++-- src/audio/include/stream_event.hpp | 2 ++ 7 files changed, 24 insertions(+), 3 deletions(-) (limited to 'src/audio/include') 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 override; auto ProcessChunk(const cpp::span& chunk) -> cpp::result override; + auto ProcessEndOfStream() -> void override; auto Process() -> cpp::result 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& chunk) -> cpp::result = 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 +#include +#include #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 core_id, std::shared_ptr element) -> std::unique_ptr; 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 data) -> cpp::span; + auto GetLeftovers() -> cpp::span; + 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 override; auto ProcessChunk(const cpp::span& chunk) -> cpp::result override; + auto ProcessEndOfStream() -> void override; auto Process() -> cpp::result 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 #include "audio_element.hpp" +#include "chunk.hpp" #include "result.hpp" #include "dac.hpp" @@ -21,13 +22,13 @@ class I2SAudioOutput : public IAudioElement { std::unique_ptr dac); ~I2SAudioOutput(); - // TODO. - auto HasUnprocessedInput() -> bool override { return false; } + auto HasUnprocessedInput() -> bool override; auto ProcessStreamInfo(const StreamInfo& info) -> cpp::result override; auto ProcessChunk(const cpp::span& chunk) -> cpp::result override; + auto ProcessEndOfStream() -> void override; auto Process() -> cpp::result 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 dac_; uint8_t volume_; bool is_soft_muted_; + + std::optional chunk_reader_; + cpp::span latest_chunk_; + std::optional 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 { -- cgit v1.2.3