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++) {