// 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 using std::shared_ptr; using std::size_t; using srb2::audio::Mixer; using srb2::audio::Sample; using srb2::audio::Source; namespace { template void default_init_sample_buffer(Sample* buffer, size_t size) { std::for_each(buffer, buffer + size, [](auto& i) { i = Sample {}; }); } template void mix_sample_buffers(Sample* dst, size_t size, Sample* src, size_t src_size) { for (size_t i = 0; i < size && i < src_size; i++) { dst[i] += src[i]; } } } // namespace template size_t Mixer::generate(tcb::span> buffer) { buffer_.resize(buffer.size()); default_init_sample_buffer(buffer.data(), buffer.size()); for (auto& source : sources_) { size_t read = source->generate(buffer_); mix_sample_buffers(buffer.data(), buffer.size(), buffer_.data(), read); } // because we initialized the out-buffer, we always generate size samples return buffer.size(); } template void Mixer::add_source(const shared_ptr>& source) { sources_.push_back(source); } template Mixer::~Mixer() = default; template class srb2::audio::Mixer<1>; template class srb2::audio::Mixer<2>;