/* * Copyright 2023 jacqueline * * SPDX-License-Identifier: GPL-3.0-only */ #pragma once #include #include #include #include "audio_decoder.hpp" #include "audio_sink.hpp" #include "audio_source.hpp" #include "codec.hpp" #include "pipeline.hpp" #include "stream_info.hpp" namespace audio { struct Duration { enum class Source { kLibTags, kCodec, kFileSize, }; Source src; uint32_t duration; }; class Timer { public: Timer(const StreamInfo::Pcm&, const Duration&); auto AddBytes(std::size_t) -> void; private: auto bytes_to_samples(uint32_t) -> uint32_t; StreamInfo::Pcm format_; uint32_t current_seconds_; uint32_t current_sample_in_second_; uint32_t total_duration_seconds_; }; class AudioTask { public: static auto Start(IAudioSource* source, IAudioSink* sink) -> AudioTask*; auto Main() -> void; private: AudioTask(IAudioSource* source, IAudioSink* sink); auto HandleNewStream(const InputStream&) -> bool; auto BeginDecoding(InputStream&) -> bool; auto ContinueDecoding(InputStream&) -> bool; auto FinishDecoding(InputStream&) -> void; auto ForwardPcmStream(StreamInfo::Pcm&, cpp::span) -> bool; auto ConfigureSink(const StreamInfo::Pcm&, const Duration&) -> bool; IAudioSource* source_; IAudioSink* sink_; std::unique_ptr codec_; std::unique_ptr timer_; bool has_begun_decoding_; std::optional current_input_format_; std::optional current_output_format_; std::byte* sample_buffer_; std::size_t sample_buffer_len_; }; } // namespace audio