From 4bff06c76c223a156a14adc478ab1a9b083fd7b2 Mon Sep 17 00:00:00 2001 From: jacqueline Date: Tue, 23 May 2023 09:12:26 +1000 Subject: [PATCH] Drop himem audio buffers (for now?) For some reason the spinlocks required now block forever? Very odd. On the plus side, this turned out to be the issue that was stopping the audio pipeline from running on the app core. --- src/audio/audio_task.cpp | 35 +++------------------------------- src/audio/include/pipeline.hpp | 8 +++----- src/audio/pipeline.cpp | 12 ++++-------- 3 files changed, 10 insertions(+), 45 deletions(-) diff --git a/src/audio/audio_task.cpp b/src/audio/audio_task.cpp index 2309a5e5..390e3d2d 100644 --- a/src/audio/audio_task.cpp +++ b/src/audio/audio_task.cpp @@ -40,34 +40,12 @@ void AudioTaskMain(std::unique_ptr pipeline, IAudioSink* sink) { std::optional output_format; std::vector elements = pipeline->GetIterationOrder(); - std::size_t max_inputs = - (*std::max_element(elements.begin(), elements.end(), - [](Pipeline const* first, Pipeline const* second) { - return first->NumInputs() < second->NumInputs(); - })) - ->NumInputs(); - - // We need to be able to simultaneously map all of an element's inputs, plus - // its output. So preallocate that many ranges. - std::vector> in_regions(max_inputs); - MappableRegion out_region; - std::for_each(in_regions.begin(), in_regions.end(), - [](const auto& region) { assert(region.is_valid); }); - assert(out_region.is_valid); - - // Each element has exactly one output buffer. - std::vector> buffers(elements.size()); - std::vector buffer_infos(buffers.size()); - std::for_each(buffers.begin(), buffers.end(), - [](const HimemAlloc& alloc) { - assert(alloc.is_valid); - }); while (1) { for (int i = 0; i < elements.size(); i++) { std::vector raw_in_streams; - elements.at(i)->InStreams(&in_regions, &raw_in_streams); - RawStream raw_out_stream = elements.at(i)->OutStream(&out_region); + elements.at(i)->InStreams(&raw_in_streams); + RawStream raw_out_stream = elements.at(i)->OutStream(); // Crop the input and output streams to the ranges that are safe to // touch. For the input streams, this is the region that contains @@ -79,17 +57,12 @@ void AudioTaskMain(std::unique_ptr pipeline, IAudioSink* sink) { OutputStream out_stream(&raw_out_stream); elements.at(i)->OutputElement()->Process(in_streams, &out_stream); - - std::for_each(in_regions.begin(), in_regions.end(), - [](auto&& r) { r.Unmap(); }); - out_region.Unmap(); } - RawStream raw_sink_stream = elements.front()->OutStream(&out_region); + RawStream raw_sink_stream = elements.front()->OutStream(); InputStream sink_stream(&raw_sink_stream); if (sink_stream.info().bytes_in_stream == 0) { - out_region.Unmap(); vTaskDelay(pdMS_TO_TICKS(100)); continue; } @@ -121,8 +94,6 @@ void AudioTaskMain(std::unique_ptr pipeline, IAudioSink* sink) { } sink_stream.consume(sent); } - - out_region.Unmap(); } } diff --git a/src/audio/include/pipeline.hpp b/src/audio/include/pipeline.hpp index 7a658a38..1fa7da83 100644 --- a/src/audio/include/pipeline.hpp +++ b/src/audio/include/pipeline.hpp @@ -8,7 +8,6 @@ #include "freertos/portmacro.h" #include "audio_element.hpp" -#include "himem.hpp" #include "stream_info.hpp" namespace audio { @@ -25,10 +24,9 @@ class Pipeline { auto NumInputs() const -> std::size_t; - auto InStreams(std::vector>*, - std::vector*) -> void; + auto InStreams(std::vector*) -> void; - auto OutStream(MappableRegion*) -> RawStream; + auto OutStream() -> RawStream; auto GetIterationOrder() -> std::vector; @@ -36,7 +34,7 @@ class Pipeline { IAudioElement* root_; std::vector> subtrees_; - HimemAlloc output_buffer_; + std::array output_buffer_; StreamInfo output_info_; }; diff --git a/src/audio/pipeline.cpp b/src/audio/pipeline.cpp index bab2f3ff..270622cf 100644 --- a/src/audio/pipeline.cpp +++ b/src/audio/pipeline.cpp @@ -23,18 +23,14 @@ auto Pipeline::NumInputs() const -> std::size_t { return subtrees_.size(); } -auto Pipeline::InStreams( - std::vector>* regions, - std::vector* out) -> void { +auto Pipeline::InStreams(std::vector* out) -> void { for (int i = 0; i < subtrees_.size(); i++) { - RawStream s = subtrees_[i]->OutStream(®ions->at(i)); - out->push_back(s); + out->push_back(subtrees_[i]->OutStream()); } } -auto Pipeline::OutStream(MappableRegion* region) - -> RawStream { - return {&output_info_, region->Map(output_buffer_)}; +auto Pipeline::OutStream() -> RawStream { + return {&output_info_, output_buffer_}; } auto Pipeline::GetIterationOrder() -> std::vector {