#include #include namespace psemek::audio { namespace { struct recorder_impl : recorder { recorder_impl(stream_ptr stream) : stream_(std::move(stream)) {} stream_ptr stream() const override { return stream_; } std::size_t request(std::size_t samples) override { 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)); } }