mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2025-10-30 08:01:28 +00:00
70 lines
1.6 KiB
C++
70 lines
1.6 KiB
C++
// DR. ROBOTNIK'S RING RACERS
|
|
//-----------------------------------------------------------------------------
|
|
// Copyright (C) 2024 by Ronald "Eidolon" Kinard
|
|
// Copyright (C) 2024 by Kart Krew
|
|
//
|
|
// This program is free software distributed under the
|
|
// terms of the GNU General Public License, version 2.
|
|
// See the 'LICENSE' file for more details.
|
|
//-----------------------------------------------------------------------------
|
|
|
|
#include "mixer.hpp"
|
|
|
|
#include <algorithm>
|
|
|
|
using std::shared_ptr;
|
|
using std::size_t;
|
|
|
|
using srb2::audio::Mixer;
|
|
using srb2::audio::Sample;
|
|
using srb2::audio::Source;
|
|
|
|
namespace
|
|
{
|
|
|
|
template <size_t C>
|
|
void default_init_sample_buffer(Sample<C>* buffer, size_t size)
|
|
{
|
|
std::for_each(buffer, buffer + size, [](auto& i) { i = Sample<C> {}; });
|
|
}
|
|
|
|
template <size_t C>
|
|
void mix_sample_buffers(Sample<C>* dst, size_t size, Sample<C>* src, size_t src_size)
|
|
{
|
|
for (size_t i = 0; i < size && i < src_size; i++)
|
|
{
|
|
dst[i] += src[i];
|
|
}
|
|
}
|
|
|
|
} // namespace
|
|
|
|
template <size_t C>
|
|
size_t Mixer<C>::generate(tcb::span<Sample<C>> buffer)
|
|
{
|
|
buffer_.resize(buffer.size());
|
|
|
|
default_init_sample_buffer<C>(buffer.data(), buffer.size());
|
|
|
|
for (auto& source : sources_)
|
|
{
|
|
size_t read = source->generate(buffer_);
|
|
|
|
mix_sample_buffers<C>(buffer.data(), buffer.size(), buffer_.data(), read);
|
|
}
|
|
|
|
// because we initialized the out-buffer, we always generate size samples
|
|
return buffer.size();
|
|
}
|
|
|
|
template <size_t C>
|
|
void Mixer<C>::add_source(const shared_ptr<Source<C>>& source)
|
|
{
|
|
sources_.push_back(source);
|
|
}
|
|
|
|
template <size_t C>
|
|
Mixer<C>::~Mixer() = default;
|
|
|
|
template class srb2::audio::Mixer<1>;
|
|
template class srb2::audio::Mixer<2>;
|