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 From 7c6fd654f50e6665efa4226c6b927f9762734182 Mon Sep 17 00:00:00 2001 From: jacqueline Date: Sat, 1 Apr 2023 13:22:21 +1100 Subject: New pipeline building, still needs proper control --- src/audio/audio_playback.cpp | 48 +++++++++++--------------------------------- 1 file changed, 12 insertions(+), 36 deletions(-) (limited to 'src/audio/audio_playback.cpp') diff --git a/src/audio/audio_playback.cpp b/src/audio/audio_playback.cpp index 613f629c..89139ec4 100644 --- a/src/audio/audio_playback.cpp +++ b/src/audio/audio_playback.cpp @@ -8,6 +8,7 @@ #include "freertos/portmacro.h" #include "audio_decoder.hpp" +#include "audio_element.hpp" #include "audio_task.hpp" #include "chunk.hpp" #include "fatfs_audio_input.hpp" @@ -23,55 +24,30 @@ namespace audio { auto AudioPlayback::create(drivers::GpioExpander* expander) -> cpp::result, Error> { - // Create everything - auto source = std::make_shared(); - auto codec = std::make_shared(); - auto sink_res = I2SAudioOutput::create(expander); if (sink_res.has_error()) { return cpp::fail(ERR_INIT_ELEMENT); } - auto sink = sink_res.value(); - - auto playback = std::make_unique(); - - Pipeline *pipeline = new Pipeline(sink.get()); - pipeline->AddInput(codec.get())->AddInput(source.get()); - - task::Start(pipeline); - - return playback; + return std::make_unique(std::move(sink_res.value())); } -AudioPlayback::AudioPlayback() { - // Create everything - auto source = std::make_shared(); - auto codec = std::make_shared(); +AudioPlayback::AudioPlayback(std::unique_ptr output) + : file_source_(), i2s_output_(std::move(output)) { + AudioDecoder* codec = new AudioDecoder(); + elements_.emplace_back(codec); - auto sink_res = I2SAudioOutput::create(expander); - if (sink_res.has_error()) { - return cpp::fail(ERR_INIT_ELEMENT); - } - auto sink = sink_res.value(); - - auto playback = std::make_unique(); + Pipeline* pipeline = new Pipeline(elements_.front().get()); + pipeline->AddInput(file_source_.get()); - Pipeline *pipeline = new Pipeline(sink.get()); - pipeline->AddInput(codec.get())->AddInput(source.get()); - - task::Start(pipeline); - - return playback; + task::StartPipeline(pipeline, i2s_output_.get()); + task::StartDrain(i2s_output_.get()); } -AudioPlayback::~AudioPlayback() { - pipeline_->Quit(); -} +AudioPlayback::~AudioPlayback() {} auto AudioPlayback::Play(const std::string& filename) -> void { // TODO: concurrency, yo! - file_source->OpenFile(filename); - pipeline_->Play(); + file_source_->OpenFile(filename); } auto AudioPlayback::LogStatus() -> void { -- cgit v1.2.3 From 3836768bb8b95188e6657ab69027d1d9e4b13a77 Mon Sep 17 00:00:00 2001 From: jacqueline Date: Mon, 3 Apr 2023 14:06:30 +1000 Subject: new pipeline working(?), but the dac eludes me --- src/audio/audio_playback.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'src/audio/audio_playback.cpp') diff --git a/src/audio/audio_playback.cpp b/src/audio/audio_playback.cpp index 89139ec4..9a978535 100644 --- a/src/audio/audio_playback.cpp +++ b/src/audio/audio_playback.cpp @@ -32,7 +32,8 @@ auto AudioPlayback::create(drivers::GpioExpander* expander) } AudioPlayback::AudioPlayback(std::unique_ptr output) - : file_source_(), i2s_output_(std::move(output)) { + : file_source_(std::make_unique()), + i2s_output_(std::move(output)) { AudioDecoder* codec = new AudioDecoder(); elements_.emplace_back(codec); @@ -51,7 +52,7 @@ auto AudioPlayback::Play(const std::string& filename) -> void { } auto AudioPlayback::LogStatus() -> void { - // TODO. + i2s_output_->Log(); } } // namespace audio -- cgit v1.2.3 From 731b2cfa77a063e98da8fa26acc1e7ed1de8c169 Mon Sep 17 00:00:00 2001 From: jacqueline Date: Thu, 20 Apr 2023 11:25:43 +1000 Subject: working isr-based sink, but still grainy --- src/audio/audio_playback.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/audio/audio_playback.cpp') diff --git a/src/audio/audio_playback.cpp b/src/audio/audio_playback.cpp index 9a978535..fac4bfab 100644 --- a/src/audio/audio_playback.cpp +++ b/src/audio/audio_playback.cpp @@ -41,7 +41,7 @@ AudioPlayback::AudioPlayback(std::unique_ptr output) pipeline->AddInput(file_source_.get()); task::StartPipeline(pipeline, i2s_output_.get()); - task::StartDrain(i2s_output_.get()); + // task::StartDrain(i2s_output_.get()); } AudioPlayback::~AudioPlayback() {} -- cgit v1.2.3 From 7083459cf3c62c32d0c039a4665e702d70a27bba Mon Sep 17 00:00:00 2001 From: jacqueline Date: Fri, 21 Apr 2023 15:27:57 +1000 Subject: wrap driver instance ownership + di in a class --- src/audio/audio_playback.cpp | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) (limited to 'src/audio/audio_playback.cpp') diff --git a/src/audio/audio_playback.cpp b/src/audio/audio_playback.cpp index fac4bfab..c51e41fb 100644 --- a/src/audio/audio_playback.cpp +++ b/src/audio/audio_playback.cpp @@ -5,6 +5,7 @@ #include #include +#include "driver_cache.hpp" #include "freertos/portmacro.h" #include "audio_decoder.hpp" @@ -21,19 +22,10 @@ #include "stream_message.hpp" namespace audio { - -auto AudioPlayback::create(drivers::GpioExpander* expander) - -> cpp::result, Error> { - auto sink_res = I2SAudioOutput::create(expander); - if (sink_res.has_error()) { - return cpp::fail(ERR_INIT_ELEMENT); - } - return std::make_unique(std::move(sink_res.value())); -} - -AudioPlayback::AudioPlayback(std::unique_ptr output) +AudioPlayback::AudioPlayback(drivers::DriverCache* drivers) : file_source_(std::make_unique()), - i2s_output_(std::move(output)) { + i2s_output_(std::make_unique(drivers->AcquireGpios(), + drivers->AcquireDac())) { AudioDecoder* codec = new AudioDecoder(); elements_.emplace_back(codec); -- cgit v1.2.3