summaryrefslogtreecommitdiff
path: root/src/audio/audio_playback.cpp
diff options
context:
space:
mode:
authorjacqueline <me@jacqueline.id.au>2023-03-10 11:28:33 +1100
committerjacqueline <me@jacqueline.id.au>2023-04-19 10:27:59 +1000
commita9531c86a433c8b7ae1f77ff0266c27c39eca7f4 (patch)
tree11835552aa2ecb400537781d8eb3851118c47e61 /src/audio/audio_playback.cpp
parent2a46eecdc6334c31cee2b40427d2536b48cbb6be (diff)
downloadtangara-fw-a9531c86a433c8b7ae1f77ff0266c27c39eca7f4.tar.gz
mostly single task pipeline
Diffstat (limited to 'src/audio/audio_playback.cpp')
-rw-r--r--src/audio/audio_playback.cpp60
1 files changed, 33 insertions, 27 deletions
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<drivers::SdStorage> storage)
+auto AudioPlayback::create(drivers::GpioExpander* expander)
-> cpp::result<std::unique_ptr<AudioPlayback>, Error> {
// Create everything
- auto source = std::make_shared<FatfsAudioInput>(storage);
+ auto source = std::make_shared<FatfsAudioInput>();
auto codec = std::make_shared<AudioDecoder>();
auto sink_res = I2SAudioOutput::create(expander);
@@ -35,41 +35,47 @@ auto AudioPlayback::create(drivers::GpioExpander* expander,
auto playback = std::make_unique<AudioPlayback>();
- // 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<FatfsAudioInput>();
+ auto codec = std::make_shared<AudioDecoder>();
-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<AudioPlayback>();
+
+ 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