Add audio stereo aggregator

This commit is contained in:
Nikita Lisitsa 2022-10-05 20:57:27 +03:00
parent d346f7b50d
commit 6c213f9c45
2 changed files with 63 additions and 0 deletions

View file

@ -0,0 +1,12 @@
#pragma once
#include <psemek/audio/stream.hpp>
#include <memory>
namespace psemek::audio
{
stream_ptr stereo(stream_ptr left, stream_ptr right);
}

View file

@ -0,0 +1,51 @@
#include <psemek/audio/stereo.hpp>
#include <vector>
namespace psemek::audio
{
namespace
{
struct stereo_impl
: stream
{
stereo_impl(stream_ptr left, stream_ptr right)
: left_(std::move(left))
, right_(std::move(right))
{}
std::size_t read(float * data, std::size_t sample_count) override
{
if (buffer_.size() < sample_count)
buffer_.resize(sample_count);
auto right_result = right_->read(data, sample_count);
auto left_result = left_->read(buffer_.data(), sample_count);
auto result = std::min(right_result, left_result);
{
auto begin = buffer_.data();
auto end = buffer_.data() + result;
auto dst = data;
for (; begin < end; begin += 2, dst += 2)
*dst = *begin;
}
return result;
}
private:
stream_ptr left_, right_;
std::vector<float> buffer_;
};
}
stream_ptr stereo(stream_ptr left, stream_ptr right)
{
return std::make_shared<stereo_impl>(std::move(left), std::move(right));
}
}