summaryrefslogtreecommitdiff
path: root/src/audio
diff options
context:
space:
mode:
authorjacqueline <me@jacqueline.id.au>2023-04-04 14:12:01 +1000
committerjacqueline <me@jacqueline.id.au>2023-04-19 10:29:40 +1000
commit7a54ff0df9c18b662e5bdc11ac2e26ff052cfa4d (patch)
treea2f456c3c6e41faef168fb39f310df74ac46f4af /src/audio
parent40a9734b04c48339cfdf6ed9043aa3f6f0dda62d (diff)
downloadtangara-fw-7a54ff0df9c18b662e5bdc11ac2e26ff052cfa4d.tar.gz
WIP track down new pipeline memory issues
Diffstat (limited to 'src/audio')
-rw-r--r--src/audio/audio_decoder.cpp18
-rw-r--r--src/audio/audio_task.cpp6
-rw-r--r--src/audio/fatfs_audio_input.cpp2
3 files changed, 10 insertions, 16 deletions
diff --git a/src/audio/audio_decoder.cpp b/src/audio/audio_decoder.cpp
index b829f959..faaadb3e 100644
--- a/src/audio/audio_decoder.cpp
+++ b/src/audio/audio_decoder.cpp
@@ -66,20 +66,13 @@ auto AudioDecoder::ProcessStreamInfo(const StreamInfo& info) -> bool {
auto AudioDecoder::Process(const std::vector<InputStream>& inputs,
OutputStream* output) -> void {
- // We don't really expect multiple inputs, so just pick the first that
- // contains data. If none of them contain data, then we can still flush
- // pending samples.
- auto input = std::find_if(
- inputs.begin(), inputs.end(),
- [](const InputStream& s) { return s.data().size_bytes() > 0; });
- if (input == inputs.end()) {
- input = inputs.begin();
- }
-
+ auto input = inputs.begin();
const StreamInfo& info = input->info();
- if (std::holds_alternative<std::monostate>(info.format)) {
+ if (std::holds_alternative<std::monostate>(info.format) || info.bytes_in_stream == 0) {
+ output->prepare({});
return;
}
+
if (!current_input_format_ || *current_input_format_ != info.format) {
// The input stream has changed! Immediately throw everything away and
// start from scratch.
@@ -133,7 +126,8 @@ auto AudioDecoder::Process(const std::vector<InputStream>& inputs,
}
}
- input->consume(current_codec_->GetInputPosition());
+ ESP_LOGI(kTag, "decoded %u bytes", current_codec_->GetInputPosition() - 1);
+ input->consume(current_codec_->GetInputPosition() - 1);
}
} // namespace audio
diff --git a/src/audio/audio_task.cpp b/src/audio/audio_task.cpp
index babe0a97..464879d8 100644
--- a/src/audio/audio_task.cpp
+++ b/src/audio/audio_task.cpp
@@ -130,9 +130,7 @@ void AudioTaskMain(void* args) {
continue;
}
- if ((!output_format || output_format != sink_stream.info().format) &&
- !std::holds_alternative<std::monostate>(
- sink_stream.info().format)) {
+ if (!output_format || output_format != sink_stream.info().format) {
// The format of the stream within the sink stream has changed. We
// need to reconfigure the sink, but shouldn't do so until we've fully
// drained the current buffer.
@@ -145,7 +143,7 @@ void AudioTaskMain(void* args) {
// We've reconfigured the sink, or it was already configured correctly.
// Send through some data.
- if (output_format == sink_stream.info().format) {
+ if (output_format == sink_stream.info().format && !std::holds_alternative<std::monostate>(*output_format)) {
// TODO: tune the delay on this, as it's currently the only way to
// throttle this task's CPU time. Maybe also hold off on the pipeline
// if the buffer is already close to full?
diff --git a/src/audio/fatfs_audio_input.cpp b/src/audio/fatfs_audio_input.cpp
index b9882711..b4e6db75 100644
--- a/src/audio/fatfs_audio_input.cpp
+++ b/src/audio/fatfs_audio_input.cpp
@@ -4,6 +4,7 @@
#include <cstdint>
#include <memory>
#include <string>
+#include <variant>
#include "arena.hpp"
#include "esp_heap_caps.h"
@@ -47,6 +48,7 @@ auto FatfsAudioInput::OpenFile(const std::string& path) -> void {
auto FatfsAudioInput::Process(const std::vector<InputStream>& inputs,
OutputStream* output) -> void {
if (!is_file_open_) {
+ output->prepare({});
return;
}