summaryrefslogtreecommitdiff
path: root/src/audio/include
diff options
context:
space:
mode:
Diffstat (limited to 'src/audio/include')
-rw-r--r--src/audio/include/audio_decoder.hpp1
-rw-r--r--src/audio/include/audio_element.hpp2
-rw-r--r--src/audio/include/audio_task.hpp4
-rw-r--r--src/audio/include/chunk.hpp5
-rw-r--r--src/audio/include/fatfs_audio_input.hpp1
-rw-r--r--src/audio/include/i2s_audio_output.hpp12
-rw-r--r--src/audio/include/stream_event.hpp2
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 {