Added "force mono" option to Music and SoundBuffer

Former-commit-id: 1f46d1461a8289a590a71e368f282a955d7d8234
This commit is contained in:
Lynix
2014-01-10 20:09:13 +01:00
parent faed82426f
commit d902eea49e
5 changed files with 87 additions and 8 deletions

View File

@@ -0,0 +1,16 @@
// Copyright (C) 2013 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
#pragma once
#ifndef NAZARA_ALGORITHM_AUDIO_HPP
#define NAZARA_ALGORITHM_AUDIO_HPP
#include <Nazara/Prerequesites.hpp>
template<typename T> void NzMixToMono(T* input, T* output, unsigned int channelCount, unsigned int frameCount);
#include <Nazara/Audio/Algorithm.inl>
#endif // NAZARA_ALGORITHM_AUDIO_HPP

View File

@@ -0,0 +1,25 @@
// Copyright (C) 2013 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 <Nazara/Core/Error.hpp>
#include <Nazara/Audio/Debug.hpp>
template<typename T>
void NzMixToMono(T* input, T* output, unsigned int channelCount, unsigned int frameCount)
{
// Pour éviter l'overflow, on utilise comme accumulateur un type assez grand, (u)int 64 bits pour les entiers, double pour les flottants
typedef typename std::conditional<std::is_unsigned<T>::value, nzUInt64, nzInt64>::type BiggestInt;
typedef typename std::conditional<std::is_integral<T>::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] = acc/channelCount;
}
}
#include <Nazara/Audio/DebugOff.hpp>

View File

@@ -14,6 +14,8 @@
struct NzMusicParams
{
bool forceMono = false;
bool IsValid() const;
};

View File

@@ -17,6 +17,8 @@
struct NzSoundBufferParams
{
bool forceMono = false;
bool IsValid() const;
};