/* * Copyright 2023 jacqueline * * SPDX-License-Identifier: GPL-3.0-only */ #include "fatfs_source.hpp" #include #include #include #include "esp_log.h" #include "ff.h" #include "audio_source.hpp" #include "codec.hpp" #include "types.hpp" namespace audio { static constexpr char kTag[] = "fatfs_src"; FatfsSource::FatfsSource(codecs::StreamType t, std::unique_ptr file) : IStream(t), file_(std::move(file)) {} FatfsSource::~FatfsSource() { f_close(file_.get()); } auto FatfsSource::Read(cpp::span dest) -> ssize_t { if (f_eof(file_.get())) { return 0; } UINT bytes_read = 0; FRESULT res = f_read(file_.get(), dest.data(), dest.size(), &bytes_read); if (res != FR_OK) { ESP_LOGE(kTag, "error reading from file"); return -1; } return bytes_read; } auto FatfsSource::CanSeek() -> bool { return true; } auto FatfsSource::SeekTo(int64_t destination, SeekFrom from) -> void { switch (from) { case SeekFrom::kStartOfStream: f_lseek(file_.get(), destination); break; case SeekFrom::kEndOfStream: f_lseek(file_.get(), f_size(file_.get()) + destination); break; case SeekFrom::kCurrentPosition: f_lseek(file_.get(), f_tell(file_.get()) + destination); break; } } auto FatfsSource::CurrentPosition() -> int64_t { return f_tell(file_.get()); } } // namespace audio