// Copyright (C) 2015 Jérôme Leclercq // This file is part of the "Nazara Engine - Audio module" // For conditions of distribution and use, see copyright notice in Config.hpp #include #include namespace Nz { /*! * \ingroup audio * \brief Mixes channels in mono * * \param input Input buffer with multiples channels * \param output Output butter for mono * \param channelCount Number of channels * \param frameCount Number of frames * * \remark The input buffer may be the same as the output one */ template void MixToMono(T* input, T* output, unsigned int channelCount, unsigned int frameCount) { // To avoid overflow, we use, as an accumulator, a type which is large enough: (u)int 64 bits for integers, double for floatings typedef typename std::conditional::value, UInt64, Int64>::type BiggestInt; typedef typename std::conditional::value, BiggestInt, double>::type Biggest; for (unsigned int i = 0; i < frameCount; ++i) { Biggest acc = Biggest(0); for (unsigned int j = 0; j < channelCount; ++j) acc += input[i * channelCount + j]; output[i] = static_cast(acc / channelCount); } } } #include