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/fatfs_audio_input.cpp | 89 ++++++++++++----------------------------- 1 file changed, 25 insertions(+), 64 deletions(-) (limited to 'src/audio/fatfs_audio_input.cpp') diff --git a/src/audio/fatfs_audio_input.cpp b/src/audio/fatfs_audio_input.cpp index 5354c5fd..bd8748eb 100644 --- a/src/audio/fatfs_audio_input.cpp +++ b/src/audio/fatfs_audio_input.cpp @@ -7,6 +7,8 @@ #include "arena.hpp" #include "esp_heap_caps.h" +#include "esp_log.h" +#include "ff.h" #include "freertos/portmacro.h" #include "audio_element.hpp" @@ -15,43 +17,23 @@ #include "stream_event.hpp" #include "stream_info.hpp" #include "stream_message.hpp" +#include "types.hpp" static const char* kTag = "SRC"; namespace audio { -static const std::size_t kChunkSize = 24 * 1024; -static const std::size_t kChunkReadahead = 2; - -FatfsAudioInput::FatfsAudioInput(std::shared_ptr storage) - : IAudioElement(), - arena_(kChunkSize, kChunkReadahead, MALLOC_CAP_SPIRAM), - storage_(storage), - current_file_(), - is_file_open_(false) {} +FatfsAudioInput::FatfsAudioInput() + : IAudioElement(), current_file_(), is_file_open_(false) {} FatfsAudioInput::~FatfsAudioInput() {} -auto FatfsAudioInput::HasUnprocessedInput() -> bool { - return is_file_open_; -} - -auto FatfsAudioInput::IsOverBuffered() -> bool { - return arena_.BlocksFree() == 0; -} - -auto FatfsAudioInput::ProcessStreamInfo(const StreamInfo& info) -> void { +auto FatfsAudioInput::OpenFile(const std::string& path) -> void { if (is_file_open_) { f_close(¤t_file_); is_file_open_ = false; } - - if (!info.path) { - // TODO(jacqueline): Handle errors. - return; - } - ESP_LOGI(kTag, "opening file %s", info.path->c_str()); - std::string path = *info.path; + ESP_LOGI(kTag, "opening file %s", path.c_str()); FRESULT res = f_open(¤t_file_, path.c_str(), FA_READ); if (res != FR_OK) { ESP_LOGE(kTag, "failed to open file! res: %i", res); @@ -60,51 +42,30 @@ auto FatfsAudioInput::ProcessStreamInfo(const StreamInfo& info) -> void { } is_file_open_ = true; - - StreamInfo new_info(info); - new_info.chunk_size = kChunkSize; - ESP_LOGI(kTag, "chunk size: %u bytes", kChunkSize); - - auto event = StreamEvent::CreateStreamInfo(input_events_, new_info); - SendOrBufferEvent(std::unique_ptr(event)); } -auto FatfsAudioInput::ProcessChunk(const cpp::span& chunk) -> void {} - -auto FatfsAudioInput::ProcessEndOfStream() -> void { - if (is_file_open_) { - f_close(¤t_file_); - is_file_open_ = false; - SendOrBufferEvent(std::unique_ptr( - StreamEvent::CreateEndOfStream(input_events_))); +auto FatfsAudioInput::Process(std::vector* inputs, + MutableStream* output) -> void { + if (!is_file_open_) { + return; } -} - -auto FatfsAudioInput::Process() -> void { - if (is_file_open_) { - auto dest_block = memory::ArenaRef::Acquire(&arena_); - if (!dest_block) { - return; - } - FRESULT result = f_read(¤t_file_, dest_block->ptr.start, - dest_block->ptr.size, &dest_block->ptr.used_size); - if (result != FR_OK) { - ESP_LOGE(kTag, "file I/O error %d", result); - // TODO(jacqueline): Handle errors. - return; - } - - if (dest_block->ptr.used_size < dest_block->ptr.size || - f_eof(¤t_file_)) { - f_close(¤t_file_); - is_file_open_ = false; - } + FRESULT result = + f_read(¤t_file_, output->data.data(), output->data.size_bytes(), + &output->info->bytes_in_stream); + if (result != FR_OK) { + ESP_LOGE(kTag, "file I/O error %d", result); + // TODO(jacqueline): Handle errors. + return; + } - auto dest_event = std::unique_ptr( - StreamEvent::CreateArenaChunk(input_events_, dest_block->Release())); + // TODO: read from filename? + output->info->data = StreamInfo::Encoded{codecs::STREAM_MP3}; - SendOrBufferEvent(std::move(dest_event)); + if (output->info->bytes_in_stream < output->data.size_bytes() || + f_eof(¤t_file_)) { + f_close(¤t_file_); + is_file_open_ = false; } } -- 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/fatfs_audio_input.cpp | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) (limited to 'src/audio/fatfs_audio_input.cpp') diff --git a/src/audio/fatfs_audio_input.cpp b/src/audio/fatfs_audio_input.cpp index bd8748eb..b9882711 100644 --- a/src/audio/fatfs_audio_input.cpp +++ b/src/audio/fatfs_audio_input.cpp @@ -44,26 +44,30 @@ auto FatfsAudioInput::OpenFile(const std::string& path) -> void { is_file_open_ = true; } -auto FatfsAudioInput::Process(std::vector* inputs, - MutableStream* output) -> void { +auto FatfsAudioInput::Process(const std::vector& inputs, + OutputStream* output) -> void { if (!is_file_open_) { return; } + StreamInfo::Format format = StreamInfo::Encoded{codecs::STREAM_MP3}; + if (!output->prepare(format)) { + return; + } + + std::size_t max_size = output->data().size_bytes(); + std::size_t size = 0; FRESULT result = - f_read(¤t_file_, output->data.data(), output->data.size_bytes(), - &output->info->bytes_in_stream); + f_read(¤t_file_, output->data().data(), max_size, &size); if (result != FR_OK) { ESP_LOGE(kTag, "file I/O error %d", result); // TODO(jacqueline): Handle errors. return; } - // TODO: read from filename? - output->info->data = StreamInfo::Encoded{codecs::STREAM_MP3}; + output->add(size); - if (output->info->bytes_in_stream < output->data.size_bytes() || - f_eof(¤t_file_)) { + if (size < max_size || f_eof(¤t_file_)) { f_close(¤t_file_); is_file_open_ = false; } -- 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/fatfs_audio_input.cpp | 3 +++ 1 file changed, 3 insertions(+) (limited to 'src/audio/fatfs_audio_input.cpp') diff --git a/src/audio/fatfs_audio_input.cpp b/src/audio/fatfs_audio_input.cpp index b9882711..240f7084 100644 --- a/src/audio/fatfs_audio_input.cpp +++ b/src/audio/fatfs_audio_input.cpp @@ -65,6 +65,9 @@ auto FatfsAudioInput::Process(const std::vector& inputs, return; } + if (size > 0) { + ESP_LOGI(kTag, "read %u bytes", size); + } output->add(size); if (size < max_size || f_eof(¤t_file_)) { -- cgit v1.2.3 From 40a9734b04c48339cfdf6ed9043aa3f6f0dda62d Mon Sep 17 00:00:00 2001 From: jacqueline Date: Tue, 4 Apr 2023 09:46:52 +1000 Subject: Redo pcm registers to include pages --- src/audio/fatfs_audio_input.cpp | 3 --- 1 file changed, 3 deletions(-) (limited to 'src/audio/fatfs_audio_input.cpp') diff --git a/src/audio/fatfs_audio_input.cpp b/src/audio/fatfs_audio_input.cpp index 240f7084..b9882711 100644 --- a/src/audio/fatfs_audio_input.cpp +++ b/src/audio/fatfs_audio_input.cpp @@ -65,9 +65,6 @@ auto FatfsAudioInput::Process(const std::vector& inputs, return; } - if (size > 0) { - ESP_LOGI(kTag, "read %u bytes", size); - } output->add(size); if (size < max_size || f_eof(¤t_file_)) { -- cgit v1.2.3 From 7a54ff0df9c18b662e5bdc11ac2e26ff052cfa4d Mon Sep 17 00:00:00 2001 From: jacqueline Date: Tue, 4 Apr 2023 14:12:01 +1000 Subject: WIP track down new pipeline memory issues --- src/audio/fatfs_audio_input.cpp | 2 ++ 1 file changed, 2 insertions(+) (limited to 'src/audio/fatfs_audio_input.cpp') 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 #include #include +#include #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& inputs, OutputStream* output) -> void { if (!is_file_open_) { + output->prepare({}); return; } -- cgit v1.2.3 From 561f9d2a07ee6ee1c2f18dc375125f87ea7b0d55 Mon Sep 17 00:00:00 2001 From: jacqueline Date: Wed, 19 Apr 2023 13:00:42 +1000 Subject: Ensure the sink buffer is large enough to not fully drain during playback --- src/audio/fatfs_audio_input.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'src/audio/fatfs_audio_input.cpp') diff --git a/src/audio/fatfs_audio_input.cpp b/src/audio/fatfs_audio_input.cpp index b4e6db75..22d707d6 100644 --- a/src/audio/fatfs_audio_input.cpp +++ b/src/audio/fatfs_audio_input.cpp @@ -48,7 +48,8 @@ auto FatfsAudioInput::OpenFile(const std::string& path) -> void { auto FatfsAudioInput::Process(const std::vector& inputs, OutputStream* output) -> void { if (!is_file_open_) { - output->prepare({}); + // TODO(jacqueline): should we clear the stream format? + // output->prepare({}); return; } -- cgit v1.2.3