// 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 "Endpoint.hpp" #include "Stream.hpp" #include "transcode/Transform.hpp" #include "transcode/InputTranscodeProxy.hpp" #include #include #include namespace audio { class StreamFactory { public: StreamFactory() = default; explicit StreamFactory(std::chrono::milliseconds operationPeriodRequirement); auto makeStream(Source &source, Sink &sink) -> std::unique_ptr; auto makeStream(Source &source, Sink &sink, AudioFormat streamFormat) -> std::unique_ptr; auto makeInputTranscodingStream(Source &source, Sink &sink, AudioFormat streamFormat, std::shared_ptr transform) -> std::unique_ptr; private: using Traits = audio::Endpoint::Traits; static constexpr auto defaultBuffering = 24U; auto makeStream(Traits sourceTraits, Traits sinkTraits, AudioFormat streamFormat) -> std::unique_ptr; auto getBlockSizeConstraint(std::initializer_list traitsList) const -> std::optional; auto getTimingConstraints(std::initializer_list> timingConstraints) const -> std::chrono::milliseconds; auto negotiateAllocator(std::initializer_list traitsList) noexcept -> Stream::Allocator &; std::optional periodRequirement = std::nullopt; StandardStreamAllocator stdAlloc; NonCacheableStreamAllocator nonCacheableAlloc; }; } // namespace audio