aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Alc/ALu.c3
-rw-r--r--OpenAL32/alSource.c9
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++)
{