/* * Copyright 2023 jacqueline * * SPDX-License-Identifier: GPL-3.0-only */ #pragma once #include #include #include #include #include #include "ff.h" #include "freertos/portmacro.h" #include "audio_source.hpp" #include "codec.hpp" #include "future_fetcher.hpp" #include "tag_parser.hpp" #include "types.hpp" namespace audio { /* * Audio source that fetches data from a FatFs (or exfat i guess) filesystem. * * All public methods are safe to call from any task. */ class FatfsAudioInput : public IAudioSource { public: explicit FatfsAudioInput(database::ITagParser& tag_parser); ~FatfsAudioInput(); /* * Immediately cease reading any current source, and begin reading from the * given file path. */ auto SetPath(std::future>) -> void; auto SetPath(const std::string&) -> void; auto SetPath() -> void; auto HasNewStream() -> bool override; auto NextStream() -> std::shared_ptr override; FatfsAudioInput(const FatfsAudioInput&) = delete; FatfsAudioInput& operator=(const FatfsAudioInput&) = delete; private: auto OpenFile(const std::string& path) -> bool; auto ContainerToStreamType(database::Container) -> std::optional; database::ITagParser& tag_parser_; std::mutex new_stream_mutex_; std::shared_ptr new_stream_; SemaphoreHandle_t has_new_stream_; std::unique_ptr>> pending_path_; }; } // namespace audio