From 80da138d7f78ddb5a91b5644001d2aa1da4f7a61 Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Thu, 16 Jun 2016 18:22:01 -0700 Subject: Ensure voices has been updated once before mixing them Sometimes the mixer is temporarily prevented from applying updates, when multiple sources need to be updated simultaneously for example, but does not prevent mixing. If the mixer runs during that time and a voice was just started, it would've mixed the voice without any internal properties being set for it. --- Alc/ALu.c | 3 ++- OpenAL32/alSource.c | 9 ++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/Alc/ALu.c b/Alc/ALu.c index 3ba068a2..77852805 100644 --- a/Alc/ALu.c +++ b/Alc/ALu.c @@ -1460,8 +1460,9 @@ ALvoid aluMixData(ALCdevice *device, ALvoid *buffer, ALsizei size) voice_end = voice + ctx->VoiceCount; for(;voice != voice_end;++voice) { + ALboolean IsVoiceInit = (voice->Step > 0); source = voice->Source; - if(source && source->state == AL_PLAYING) + if(source && source->state == AL_PLAYING && IsVoiceInit) MixSource(voice, source, device, SamplesToDo); } diff --git a/OpenAL32/alSource.c b/OpenAL32/alSource.c index 5cc6c34b..e79f0fc3 100644 --- a/OpenAL32/alSource.c +++ b/OpenAL32/alSource.c @@ -2986,10 +2986,17 @@ ALvoid SetSourceState(ALsource *Source, ALCcontext *Context, ALenum state) voice->Source = Source; } - /* Clear previous samples if playback is discontinuous. */ if(discontinuity) + { + /* Clear previous samples if playback is discontinuous. */ memset(voice->PrevSamples, 0, sizeof(voice->PrevSamples)); + /* Clear the stepping value so the mixer knows not to mix this + * until the update gets applied. + */ + voice->Step = 0; + } + voice->Moving = AL_FALSE; for(i = 0;i < MAX_INPUT_CHANNELS;i++) { -- cgit v1.2.3