#pragma once #include #include #include #include "freertos/FreeRTOS.h" #include "freertos/message_buffer.h" #include "freertos/queue.h" #include "span.hpp" #include "audio_element.hpp" #include "storage.hpp" namespace audio { class FatfsAudioInput : public IAudioElement { public: explicit FatfsAudioInput(std::shared_ptr storage); ~FatfsAudioInput(); auto ProcessStreamInfo(const StreamInfo& info) -> cpp::result override; auto ProcessChunk(const cpp::span& chunk) -> cpp::result override; auto ProcessIdle() -> cpp::result override; auto SendChunk(cpp::span dest) -> size_t; private: auto GetRingBufferDistance() const -> size_t; std::shared_ptr storage_; std::byte* raw_file_buffer_; cpp::span file_buffer_; cpp::span::iterator file_buffer_read_pos_; cpp::span::iterator pending_read_pos_; cpp::span::iterator file_buffer_write_pos_; std::byte* raw_chunk_buffer_; cpp::span chunk_buffer_; FIL current_file_; bool is_file_open_; uint8_t* output_buffer_memory_; StaticMessageBuffer_t output_buffer_metadata_; }; } // namespace audio