#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)}; } }