From d346f7b50d77b6a2dbc75d787b26834a92fe44c8 Mon Sep 17 00:00:00 2001 From: lisyarus Date: Wed, 5 Oct 2022 20:57:09 +0300 Subject: [PATCH] Add audio stream duplication --- libs/audio/include/psemek/audio/duplicate.hpp | 12 ++++ libs/audio/source/duplicate.cpp | 58 +++++++++++++++++++ 2 files changed, 70 insertions(+) create mode 100644 libs/audio/include/psemek/audio/duplicate.hpp create mode 100644 libs/audio/source/duplicate.cpp diff --git a/libs/audio/include/psemek/audio/duplicate.hpp b/libs/audio/include/psemek/audio/duplicate.hpp new file mode 100644 index 00000000..1b42bc5f --- /dev/null +++ b/libs/audio/include/psemek/audio/duplicate.hpp @@ -0,0 +1,12 @@ +#pragma once + +#include + +#include + +namespace psemek::audio +{ + + std::pair duplicate(stream_ptr stream); + +} diff --git a/libs/audio/source/duplicate.cpp b/libs/audio/source/duplicate.cpp new file mode 100644 index 00000000..79da6586 --- /dev/null +++ b/libs/audio/source/duplicate.cpp @@ -0,0 +1,58 @@ +#include + +#include + +namespace psemek::audio +{ + + namespace + { + + struct duplicate_common + { + duplicate_common(stream_ptr stream) + : stream(std::move(stream)) + {} + + stream_ptr stream; + std::vector buffer; + std::size_t counter = 0; + std::size_t read = 0; + }; + + struct duplicate_impl + : stream + { + duplicate_impl(std::shared_ptr common) + : common_(std::move(common)) + {} + + std::size_t read(float * data, std::size_t sample_count) override + { + if (counter_ == common_->counter) + { + ++common_->counter; + if (common_->buffer.size() < sample_count) + common_->buffer.resize(sample_count); + common_->read = common_->stream->read(common_->buffer.data(), sample_count); + } + + std::copy(common_->buffer.data(), common_->buffer.data() + common_->read, data); + ++counter_; + return common_->read; + } + + private: + std::shared_ptr common_; + std::size_t counter_ = 0; + }; + + } + + std::pair duplicate(stream_ptr stream) + { + auto common = std::make_shared(std::move(stream)); + return {std::make_shared(common), std::make_shared(common)}; + } + +}