/* * Copyright 2025 ayumi * * SPDX-License-Identifier: GPL-3.0-only */ #pragma once #include #include #include #include #include #include #include extern "C" { #include "decomp.h" } #include "sample.hpp" #include "codec.hpp" namespace codecs { class AlacDecoder : public ICodec { public: AlacDecoder(); ~AlacDecoder(); auto OpenStream(std::shared_ptr input, uint32_t offset) -> cpp::result override; auto DecodeTo(std::span destination) -> cpp::result override; AlacDecoder(const AlacDecoder&) = delete; AlacDecoder& operator=(const AlacDecoder&) = delete; private: auto readBoxHeader() -> cpp::result>, ICodec::Error>; auto readFullBoxHeader() -> std::tuple; auto readFtyp(uint64_t size) -> cpp::result; void readFree(uint64_t size); auto readStsd() -> cpp::result; auto readStts() -> cpp::result; auto readStsc() -> cpp::result; auto readStsz() -> cpp::result; auto readStco() -> cpp::result; auto readCo64() -> cpp::result; auto readBox() -> cpp::result; auto readContainer(uint64_t size) -> cpp::result; auto getFrameDuration(uint32_t frame) -> cpp::result; auto getFrameSize(uint32_t frame) -> uint32_t; auto getTotalSamples() -> uint64_t; auto getTotalFrames() -> uint32_t; auto getTotalFrameSize() -> uint64_t; auto frameToOffset(uint32_t frame) -> cpp::result, ICodec::Error>; auto getChunkMixMaxFrames(uint32_t chunk) -> cpp::result, ICodec::Error>; auto sampleToFrame(uint64_t sample) -> cpp::result, ICodec::Error>; auto UnpackFrame(uint32_t offset) -> cpp::result; std::shared_ptr input_; alac_file alac_; uint8_t bitdepth_; uint8_t channels_; uint16_t sampleRate_; uint16_t index_; std::vector> stts_; std::vector> stsc_; std::variant> stsz_; std::vector stco_; bool hasStts_ = false; bool hasStsc_ = false; bool hasStsz_ = false; bool hasStco_ = false; uint32_t chunk_; uint32_t frame_; std::vector in_; std::vector out_; size_t outSize_; size_t outOff_; }; } // namespace codecs