From f46b080a698f26534357bcb1d0d3b3c4daa2de6e Mon Sep 17 00:00:00 2001 From: lisyarus Date: Sat, 8 Oct 2022 14:05:13 +0300 Subject: [PATCH] Support creating audio::recorder directly from samples --- libs/audio/include/psemek/audio/recorder.hpp | 5 ++++- libs/audio/source/duplicate.cpp | 2 +- libs/audio/source/recorder.cpp | 17 +++++++++++++++-- 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/libs/audio/include/psemek/audio/recorder.hpp b/libs/audio/include/psemek/audio/recorder.hpp index c011d0e3..d8f8fe33 100644 --- a/libs/audio/include/psemek/audio/recorder.hpp +++ b/libs/audio/include/psemek/audio/recorder.hpp @@ -3,12 +3,14 @@ #include #include +#include + namespace psemek::audio { struct recorder { - virtual stream_ptr stream() const = 0; + virtual std::optional length() const = 0; virtual std::size_t request(std::size_t samples) = 0; @@ -18,5 +20,6 @@ namespace psemek::audio }; std::shared_ptr make_recorder(stream_ptr stream); + std::shared_ptr make_recorder(std::vector samples); } diff --git a/libs/audio/source/duplicate.cpp b/libs/audio/source/duplicate.cpp index e0bd5eb8..ade8d165 100644 --- a/libs/audio/source/duplicate.cpp +++ b/libs/audio/source/duplicate.cpp @@ -18,7 +18,7 @@ namespace psemek::audio std::optional length() const override { - return recorder_->stream()->length(); + return recorder_->length(); } std::size_t played() const override diff --git a/libs/audio/source/recorder.cpp b/libs/audio/source/recorder.cpp index 1739f95d..18dbd25a 100644 --- a/libs/audio/source/recorder.cpp +++ b/libs/audio/source/recorder.cpp @@ -15,13 +15,21 @@ namespace psemek::audio : stream_(std::move(stream)) {} - stream_ptr stream() const override + recorder_impl(std::vector samples) + : buffer_(std::move(samples)) + , length_(buffer_.size()) + {} + + std::optional length() const override { - return stream_; + 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)); @@ -48,4 +56,9 @@ namespace psemek::audio return std::make_shared(std::move(stream)); } + std::shared_ptr make_recorder(std::vector samples) + { + return std::make_shared(std::move(samples)); + } + }