From a9531c86a433c8b7ae1f77ff0266c27c39eca7f4 Mon Sep 17 00:00:00 2001 From: jacqueline Date: Fri, 10 Mar 2023 11:28:33 +1100 Subject: mostly single task pipeline --- src/audio/audio_playback.cpp | 60 ++++++++++++++++++++++++-------------------- 1 file changed, 33 insertions(+), 27 deletions(-) (limited to 'src/audio/audio_playback.cpp') diff --git a/src/audio/audio_playback.cpp b/src/audio/audio_playback.cpp index c95a5d63..613f629c 100644 --- a/src/audio/audio_playback.cpp +++ b/src/audio/audio_playback.cpp @@ -13,6 +13,7 @@ #include "fatfs_audio_input.hpp" #include "gpio_expander.hpp" #include "i2s_audio_output.hpp" +#include "pipeline.hpp" #include "storage.hpp" #include "stream_buffer.hpp" #include "stream_info.hpp" @@ -20,11 +21,10 @@ namespace audio { -auto AudioPlayback::create(drivers::GpioExpander* expander, - std::shared_ptr storage) +auto AudioPlayback::create(drivers::GpioExpander* expander) -> cpp::result, Error> { // Create everything - auto source = std::make_shared(storage); + auto source = std::make_shared(); auto codec = std::make_shared(); auto sink_res = I2SAudioOutput::create(expander); @@ -35,41 +35,47 @@ auto AudioPlayback::create(drivers::GpioExpander* expander, auto playback = std::make_unique(); - // Configure the pipeline - playback->ConnectElements(source.get(), codec.get()); - playback->ConnectElements(codec.get(), sink.get()); + Pipeline *pipeline = new Pipeline(sink.get()); + pipeline->AddInput(codec.get())->AddInput(source.get()); - // Launch! - StartAudioTask("src", {}, source); - StartAudioTask("dec", {}, codec); - StartAudioTask("sink", 0, sink); - - playback->input_handle_ = source->InputEventQueue(); + task::Start(pipeline); return playback; } -AudioPlayback::AudioPlayback() {} +AudioPlayback::AudioPlayback() { + // Create everything + auto source = std::make_shared(); + auto codec = std::make_shared(); -AudioPlayback::~AudioPlayback() {} + auto sink_res = I2SAudioOutput::create(expander); + if (sink_res.has_error()) { + return cpp::fail(ERR_INIT_ELEMENT); + } + auto sink = sink_res.value(); -auto AudioPlayback::Play(const std::string& filename) -> void { - StreamInfo info; - info.path = filename; - auto event = StreamEvent::CreateStreamInfo(input_handle_, info); - xQueueSend(input_handle_, &event, portMAX_DELAY); - event = StreamEvent::CreateEndOfStream(input_handle_); - xQueueSend(input_handle_, &event, portMAX_DELAY); + auto playback = std::make_unique(); + + Pipeline *pipeline = new Pipeline(sink.get()); + pipeline->AddInput(codec.get())->AddInput(source.get()); + + task::Start(pipeline); + + return playback; } -auto AudioPlayback::LogStatus() -> void { - auto event = StreamEvent::CreateLogStatus(); - xQueueSendToFront(input_handle_, &event, portMAX_DELAY); +AudioPlayback::~AudioPlayback() { + pipeline_->Quit(); } -auto AudioPlayback::ConnectElements(IAudioElement* src, IAudioElement* sink) - -> void { - src->OutputEventQueue(sink->InputEventQueue()); +auto AudioPlayback::Play(const std::string& filename) -> void { + // TODO: concurrency, yo! + file_source->OpenFile(filename); + pipeline_->Play(); +} + +auto AudioPlayback::LogStatus() -> void { + // TODO. } } // namespace audio -- cgit v1.2.3