#include #include namespace psemek::audio { namespace { struct recorder_impl : recorder { recorder_impl(stream_ptr stream) : stream_(std::move(stream)) {} recorder_impl(std::vector samples) : buffer_(std::move(samples)) , length_(buffer_.size()) {} std::optional length() const override { return stream_ ? stream_->length() : buffer_.size(); } std::size_t request(std::size_t samples) override { if (!stream_) return 0; if (buffer_.size() < length_ + samples) buffer_.resize(std::max(samples, buffer_.size() * 2)); auto result = stream_->read(buffer_.data() + length_, samples); length_ += result; return result; } util::span buffer() const override { return {buffer_.data(), buffer_.data() + length_}; } private: stream_ptr stream_; std::vector buffer_; std::size_t length_{0}; }; } std::shared_ptr make_recorder(stream_ptr stream) { return std::make_shared(std::move(stream)); } std::shared_ptr make_recorder(std::vector samples) { return std::make_shared(std::move(samples)); } }