summaryrefslogtreecommitdiff
path: root/src/audio/include
diff options
context:
space:
mode:
Diffstat (limited to 'src/audio/include')
-rw-r--r--src/audio/include/audio_sink.hpp24
1 files changed, 20 insertions, 4 deletions
diff --git a/src/audio/include/audio_sink.hpp b/src/audio/include/audio_sink.hpp
index 03a4690d..a11a9c92 100644
--- a/src/audio/include/audio_sink.hpp
+++ b/src/audio/include/audio_sink.hpp
@@ -1,6 +1,9 @@
#pragma once
+#include <stdint.h>
#include "audio_element.hpp"
+#include "esp_heap_caps.h"
+#include "freertos/FreeRTOS.h"
#include "stream_info.hpp"
namespace audio {
@@ -8,17 +11,30 @@ class IAudioSink {
private:
// TODO: tune. at least about 12KiB seems right for mp3
static const std::size_t kDrainBufferSize = 24 * 1024;
- StreamBufferHandle_t buffer_;
+ uint8_t *buffer_;
+ StaticStreamBuffer_t *metadata_;
+ StreamBufferHandle_t *handle_;
public:
- IAudioSink() : buffer_(xStreamBufferCreate(kDrainBufferSize, 1)) {}
- virtual ~IAudioSink() { vStreamBufferDelete(buffer_); }
+ IAudioSink() :
+ buffer_(reinterpret_cast<uint8_t*>(heap_caps_malloc(kDrainBufferSize, MALLOC_CAP_DMA))),
+ metadata_(reinterpret_cast<StaticStreamBuffer_t*>(heap_caps_malloc(sizeof(StaticStreamBuffer_t), MALLOC_CAP_DMA))),
+ handle_(reinterpret_cast<StreamBufferHandle_t*>(heap_caps_malloc(sizeof(StreamBufferHandle_t), MALLOC_CAP_DMA))) {
+ *handle_ = xStreamBufferCreateStatic(kDrainBufferSize, 1, buffer_, metadata_);
+ }
+
+ virtual ~IAudioSink() {
+ vStreamBufferDelete(*handle_);
+ free(buffer_);
+ free(handle_);
+ free(metadata_);
+ }
virtual auto Configure(const StreamInfo::Format& format) -> bool = 0;
virtual auto Send(const cpp::span<std::byte>& data) -> void = 0;
virtual auto Log() -> void {}
- auto buffer() const -> StreamBufferHandle_t { return buffer_; }
+ auto buffer() -> StreamBufferHandle_t* { return handle_; }
};
} // namespace audio