From 5b0834f097896019b9938cd98d0693253ad0ca9b Mon Sep 17 00:00:00 2001 From: lisyarus Date: Sat, 8 Oct 2022 14:35:45 +0300 Subject: [PATCH] Support non-owning audio::recorder --- libs/audio/include/psemek/audio/recorder.hpp | 1 + libs/audio/source/recorder.cpp | 36 ++++++++++++++------ 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/libs/audio/include/psemek/audio/recorder.hpp b/libs/audio/include/psemek/audio/recorder.hpp index d8f8fe33..f25b20e9 100644 --- a/libs/audio/include/psemek/audio/recorder.hpp +++ b/libs/audio/include/psemek/audio/recorder.hpp @@ -21,5 +21,6 @@ namespace psemek::audio std::shared_ptr make_recorder(stream_ptr stream); std::shared_ptr make_recorder(std::vector samples); + std::shared_ptr make_recorder(util::span samples); } diff --git a/libs/audio/source/recorder.cpp b/libs/audio/source/recorder.cpp index 18dbd25a..6300c914 100644 --- a/libs/audio/source/recorder.cpp +++ b/libs/audio/source/recorder.cpp @@ -16,13 +16,17 @@ namespace psemek::audio {} recorder_impl(std::vector samples) - : buffer_(std::move(samples)) - , length_(buffer_.size()) + : storage_(std::move(samples)) + , samples_(storage_) + {} + + recorder_impl(util::span samples) + : samples_(samples) {} std::optional length() const override { - return stream_ ? stream_->length() : buffer_.size(); + return stream_ ? stream_->length() : storage_.size(); } std::size_t request(std::size_t samples) override @@ -30,23 +34,26 @@ namespace psemek::audio if (!stream_) return 0; - if (buffer_.size() < length_ + samples) - buffer_.resize(std::max(samples, buffer_.size() * 2)); + if (storage_.size() < samples_.size() + samples) + { + storage_.resize(std::max(samples, storage_.size() * 2)); + samples_ = {storage_.data(), storage_.data() + samples_.size()}; + } - auto result = stream_->read(buffer_.data() + length_, samples); - length_ += result; + auto result = stream_->read(storage_.data() + samples_.size(), samples); + samples_ = {storage_.data(), storage_.data() + samples_.size() + result}; return result; } util::span buffer() const override { - return {buffer_.data(), buffer_.data() + length_}; + return samples_; } private: stream_ptr stream_; - std::vector buffer_; - std::size_t length_{0}; + std::vector storage_; + util::span samples_; }; } @@ -58,7 +65,16 @@ namespace psemek::audio std::shared_ptr make_recorder(std::vector samples) { + if ((samples.size() % 2) != 0) + throw std::runtime_error("bad sample count"); return std::make_shared(std::move(samples)); } + std::shared_ptr make_recorder(util::span samples) + { + if ((samples.size() % 2) != 0) + throw std::runtime_error("bad sample count"); + return std::make_shared(samples); + } + }