summaryrefslogtreecommitdiff
path: root/src/audio/audio_decoder.cpp
diff options
context:
space:
mode:
authorjacqueline <me@jacqueline.id.au>2022-11-22 17:05:02 +1100
committerjacqueline <me@jacqueline.id.au>2022-11-22 17:05:02 +1100
commit9176ef187227ffb56c249c5f321cd1bf50d4cfcc (patch)
treea846c8fc4e5788e97d6fca43c2807c4bf0ae0214 /src/audio/audio_decoder.cpp
parent9f8cfaa7a8abd885785830e03d7c417e856b8a22 (diff)
downloadtangara-fw-9176ef187227ffb56c249c5f321cd1bf50d4cfcc.tar.gz
Add cbor wrapper, and chunk streaming util
Diffstat (limited to 'src/audio/audio_decoder.cpp')
-rw-r--r--src/audio/audio_decoder.cpp42
1 files changed, 23 insertions, 19 deletions
diff --git a/src/audio/audio_decoder.cpp b/src/audio/audio_decoder.cpp
index ff9f0d62..7ed67339 100644
--- a/src/audio/audio_decoder.cpp
+++ b/src/audio/audio_decoder.cpp
@@ -1,12 +1,13 @@
#include "audio_decoder.hpp"
#include <cstddef>
+#include <cstdint>
+#include <string.h>
#include "esp_heap_caps.h"
#include "include/audio_element.hpp"
#include "include/fatfs_audio_input.hpp"
namespace audio {
-static const TickType_t kMaxWaitTicks = portMAX_DELAY;
// TODO: could this be larger? depends on the codecs i guess
static const std::size_t kWorkingBufferSize = kMaxFrameSize;
@@ -18,22 +19,14 @@ static const TickType_t kMaxWaitTicks = portMAX_DELAY;
free(working_buffer_);
}
- auto AudioDecoder::InputCommandQueue() -> QueueHandle_t {
- return input_queue_;
- }
-
- auto AudioDecoder::SetInputCommandQueue(QueueHandle_t queue) -> void {
- input_queue_ = queue;
- }
-
- auto AudioDecoder::SetOutputCommandQueue(QueueHandle_t queue) -> void {
- output_queue_ = queue;
- }
-
auto AudioDecoder::InputBuffer() -> StreamBufferHandle_t {
return input_buffer_;
}
+ auto AudioDecoder::OutputBuffer() -> StreamBufferHandle_t {
+ return output_buffer_;
+ }
+
auto AudioDecoder::SetInputBuffer(StreamBufferHandle_t buffer) -> void {
input_buffer_ = buffer;
}
@@ -72,12 +65,23 @@ static const TickType_t kMaxWaitTicks = portMAX_DELAY;
return OK;
}
- auto result = current_codec_->Process(data, length, working_buffer_, kWorkingBufferSize);
- if (result.has_value()) {
- xStreamBufferSend(&output_buffer_, working_buffer_, result.value(), kMaxWaitTicks);
- } else {
- // TODO: handle i guess
- return ERROR;
+ while (true) {
+ auto result = current_codec_->Process(data, length, working_buffer_, kWorkingBufferSize);
+
+ if (result.has_error()) {
+ // TODO: handle i guess
+ return ERROR;
+ }
+ ICodec::Result process_res = result.value();
+
+ if (process_res.flush_output) {
+ xStreamBufferSend(&output_buffer_, working_buffer_, process_res.output_written, kMaxWaitTicks);
+ }
+
+ if (process_res.need_more_input) {
+ // TODO: wtf do we do about the leftover bytes?
+ return OK;
+ }
}
return OK;