85 lines
1.9 KiB
C++
85 lines
1.9 KiB
C++
|
|
#include <XCEngine/Audio/AudioMixer.h>
|
||
|
|
#include <algorithm>
|
||
|
|
#include <cmath>
|
||
|
|
|
||
|
|
namespace XCEngine {
|
||
|
|
namespace Audio {
|
||
|
|
|
||
|
|
AudioMixer::AudioMixer()
|
||
|
|
{
|
||
|
|
for (int i = 0; i < static_cast<int>(AudioChannel::SideRight) + 1; ++i) {
|
||
|
|
m_channelVolumes[static_cast<AudioChannel>(i)] = ChannelVolume{1.0f, false};
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
AudioMixer::~AudioMixer() {
|
||
|
|
}
|
||
|
|
|
||
|
|
void AudioMixer::SetVolume(float volume) {
|
||
|
|
m_volume = std::max(0.0f, std::min(1.0f, volume));
|
||
|
|
}
|
||
|
|
|
||
|
|
void AudioMixer::SetMute(bool mute) {
|
||
|
|
m_mute = mute;
|
||
|
|
}
|
||
|
|
|
||
|
|
void AudioMixer::AddEffect(IAudioEffect* effect) {
|
||
|
|
if (effect) {
|
||
|
|
m_effects.push_back(effect);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
void AudioMixer::RemoveEffect(IAudioEffect* effect) {
|
||
|
|
if (!effect) return;
|
||
|
|
auto it = std::find(m_effects.begin(), m_effects.end(), effect);
|
||
|
|
if (it != m_effects.end()) {
|
||
|
|
m_effects.erase(it);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
void AudioMixer::ClearEffects() {
|
||
|
|
m_effects.clear();
|
||
|
|
}
|
||
|
|
|
||
|
|
void AudioMixer::ProcessAudio(float* buffer, uint32 sampleCount, uint32 channels) {
|
||
|
|
if (!buffer || sampleCount == 0) {
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
float effectiveVolume = m_mute ? 0.0f : m_volume;
|
||
|
|
|
||
|
|
if (effectiveVolume < 0.001f) {
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
for (size_t i = 0; i < sampleCount * channels; ++i) {
|
||
|
|
buffer[i] *= effectiveVolume;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
void AudioMixer::SetOutputMixer(AudioMixer* mixer) {
|
||
|
|
m_outputMixer = mixer;
|
||
|
|
}
|
||
|
|
|
||
|
|
void AudioMixer::Set3DParams(const Audio3DParams& params) {
|
||
|
|
m_3DParams = params;
|
||
|
|
}
|
||
|
|
|
||
|
|
void AudioMixer::SetChannelVolume(AudioChannel channel, float volume) {
|
||
|
|
auto it = m_channelVolumes.find(channel);
|
||
|
|
if (it != m_channelVolumes.end()) {
|
||
|
|
it->second.volume = std::max(0.0f, std::min(1.0f, volume));
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
float AudioMixer::GetChannelVolume(AudioChannel channel) const {
|
||
|
|
auto it = m_channelVolumes.find(channel);
|
||
|
|
if (it != m_channelVolumes.end()) {
|
||
|
|
return it->second.volume;
|
||
|
|
}
|
||
|
|
return 1.0f;
|
||
|
|
}
|
||
|
|
|
||
|
|
} // namespace Audio
|
||
|
|
} // namespace XCEngine
|