summaryrefslogtreecommitdiff
path: root/src/audio/fatfs_audio_input.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/fatfs_audio_input.cpp
parent2a46eecdc6334c31cee2b40427d2536b48cbb6be (diff)
downloadtangara-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.cpp89
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(&current_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(&current_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(&current_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(&current_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(&current_file_)) {
- f_close(&current_file_);
- is_file_open_ = false;
- }
+ FRESULT result =
+ f_read(&current_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(&current_file_)) {
+ f_close(&current_file_);
+ is_file_open_ = false;
}
}