/* * Copyright 2023 jacqueline * * SPDX-License-Identifier: GPL-3.0-only */ #pragma once #include #include #include #include #include #include "mad.h" #include "span.hpp" #include "codec.hpp" namespace codecs { class MadMp3Decoder : public ICodec { public: MadMp3Decoder(); ~MadMp3Decoder(); /* * Returns the output format for the next frame in the stream. MP3 streams * may represent multiple distinct tracks, with different bitrates, and so we * handle the stream only on a frame-by-frame basis. */ auto BeginStream(cpp::span) -> Result override; /* * Writes samples for the current frame. */ auto ContinueStream(cpp::span input, cpp::span output) -> Result override; auto SeekStream(cpp::span input, std::size_t target_sample) -> Result override; private: mad_stream stream_; mad_frame frame_; mad_synth synth_; int current_sample_; auto GetInputPosition() -> std::size_t; }; } // namespace codecs