// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #pragma once #include "Audio/AudioCommon.hpp" #include "Audio/Endpoint.hpp" #include "DecoderWorker.hpp" #include #include #include namespace audio { namespace channel { constexpr inline auto monoSound = 1; constexpr inline auto stereoSound = 2; } // namespace channel class Decoder : public Source { public: Decoder(const std::string &path); virtual ~Decoder(); virtual std::uint32_t decode(std::uint32_t samplesToRead, std::int16_t *pcmData) = 0; // Range 0 - 1 virtual void setPosition(float pos) = 0; std::uint32_t getSampleRate() { return sampleRate; } std::uint32_t getChannelNumber() { return chanNumber; } float getCurrentPosition() { return position; } void onDataReceive() override; void enableInput() override; void disableInput() override; auto getSourceFormat() -> AudioFormat override; auto getSupportedFormats() -> std::vector override; auto getTraits() const -> Endpoint::Traits override; void startDecodingWorker(const DecoderWorker::EndOfFileCallback &endOfFileCallback); void stopDecodingWorker(); // Factory method static std::unique_ptr Create(const std::string &path); protected: virtual auto getBitWidth() -> unsigned int { return bitsPerSample; } virtual std::unique_ptr fetchTags(); static constexpr Endpoint::Traits decoderCaps = {.usesDMA = false}; std::uint32_t sampleRate = 0; std::uint32_t chanNumber = 0; std::uint32_t bitsPerSample; float position = 0; std::FILE *fd = nullptr; std::unique_ptr streamBuffer; std::uint32_t fileSize = 0; std::string filePath; std::unique_ptr tags; bool isInitialized = false; // decoding worker std::unique_ptr audioWorker; DecoderWorker::EndOfFileCallback _endOfFileCallback; }; } // namespace audio