diff options
| author | jacqueline <me@jacqueline.id.au> | 2023-03-10 11:28:33 +1100 |
|---|---|---|
| committer | jacqueline <me@jacqueline.id.au> | 2023-04-19 10:27:59 +1000 |
| commit | a9531c86a433c8b7ae1f77ff0266c27c39eca7f4 (patch) | |
| tree | 11835552aa2ecb400537781d8eb3851118c47e61 /src/audio/fatfs_audio_input.cpp | |
| parent | 2a46eecdc6334c31cee2b40427d2536b48cbb6be (diff) | |
| download | tangara-fw-a9531c86a433c8b7ae1f77ff0266c27c39eca7f4.tar.gz | |
mostly single task pipeline
Diffstat (limited to 'src/audio/fatfs_audio_input.cpp')
| -rw-r--r-- | src/audio/fatfs_audio_input.cpp | 89 |
1 files changed, 25 insertions, 64 deletions
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<drivers::SdStorage> 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<StreamEvent>(event)); } -auto FatfsAudioInput::ProcessChunk(const cpp::span<std::byte>& chunk) -> void {} - -auto FatfsAudioInput::ProcessEndOfStream() -> void { - if (is_file_open_) { - f_close(¤t_file_); - is_file_open_ = false; - SendOrBufferEvent(std::unique_ptr<StreamEvent>( - StreamEvent::CreateEndOfStream(input_events_))); +auto FatfsAudioInput::Process(std::vector<Stream>* 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>( - 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; } } |
