63 lines
1.3 KiB
C++
63 lines
1.3 KiB
C++
#include <psemek/audio/duplicate.hpp>
|
|
|
|
#include <vector>
|
|
|
|
namespace psemek::audio
|
|
{
|
|
|
|
namespace
|
|
{
|
|
|
|
struct duplicate_common
|
|
{
|
|
duplicate_common(stream_ptr stream)
|
|
: stream(std::move(stream))
|
|
{}
|
|
|
|
stream_ptr stream;
|
|
std::vector<float> buffer;
|
|
std::size_t counter = 0;
|
|
std::size_t read = 0;
|
|
};
|
|
|
|
struct duplicate_impl
|
|
: stream
|
|
{
|
|
duplicate_impl(std::shared_ptr<duplicate_common> common)
|
|
: common_(std::move(common))
|
|
{}
|
|
|
|
std::optional<std::size_t> length() const override
|
|
{
|
|
return common_->stream->length();
|
|
}
|
|
|
|
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<duplicate_common> common_;
|
|
std::size_t counter_ = 0;
|
|
};
|
|
|
|
}
|
|
|
|
std::pair<stream_ptr, stream_ptr> duplicate(stream_ptr stream)
|
|
{
|
|
auto common = std::make_shared<duplicate_common>(std::move(stream));
|
|
return {std::make_shared<duplicate_impl>(common), std::make_shared<duplicate_impl>(common)};
|
|
}
|
|
|
|
}
|