From e4871da0c5bba593adf3624174f6cca62f6657ba Mon Sep 17 00:00:00 2001 From: lisyarus Date: Thu, 6 Oct 2022 15:45:23 +0300 Subject: [PATCH] Add audio::recorder --- libs/audio/include/psemek/audio/recorder.hpp | 22 +++++++++ libs/audio/source/recorder.cpp | 51 ++++++++++++++++++++ 2 files changed, 73 insertions(+) create mode 100644 libs/audio/include/psemek/audio/recorder.hpp create mode 100644 libs/audio/source/recorder.cpp diff --git a/libs/audio/include/psemek/audio/recorder.hpp b/libs/audio/include/psemek/audio/recorder.hpp new file mode 100644 index 00000000..c011d0e3 --- /dev/null +++ b/libs/audio/include/psemek/audio/recorder.hpp @@ -0,0 +1,22 @@ +#pragma once + +#include +#include + +namespace psemek::audio +{ + + struct recorder + { + virtual stream_ptr stream() const = 0; + + virtual std::size_t request(std::size_t samples) = 0; + + virtual util::span buffer() const = 0; + + virtual ~recorder() {} + }; + + std::shared_ptr make_recorder(stream_ptr stream); + +} diff --git a/libs/audio/source/recorder.cpp b/libs/audio/source/recorder.cpp new file mode 100644 index 00000000..1739f95d --- /dev/null +++ b/libs/audio/source/recorder.cpp @@ -0,0 +1,51 @@ +#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)); + } + +}