diff options
Diffstat (limited to 'OpenAL32/alSource.c')
-rw-r--r-- | OpenAL32/alSource.c | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/OpenAL32/alSource.c b/OpenAL32/alSource.c index e2d6ca4f..1124c9c3 100644 --- a/OpenAL32/alSource.c +++ b/OpenAL32/alSource.c @@ -2848,7 +2848,15 @@ void UpdateSourceProps(ALsource *source, ALuint num_sends) void UpdateAllSourceProps(ALCcontext *context) { ALuint num_sends = context->Device->NumAuxSends; + uint updates; ALsizei pos; + + /* Tell the mixer to stop applying updates, then wait for any active + * updating to finish, before providing source updates. + */ + ATOMIC_STORE(&context->HoldUpdates, AL_TRUE); + while(((updates=ReadRef(&context->UpdateCount))&1) != 0) + althrd_yield(); for(pos = 0;pos < context->VoiceCount;pos++) { ALvoice *voice = &context->Voices[pos]; @@ -2857,7 +2865,10 @@ void UpdateAllSourceProps(ALCcontext *context) source->state == AL_PAUSED)) UpdateSourceProps(source, num_sends); } - + /* Now with all updates declared, let the mixer continue applying them so + * they all happen at once. + */ + ATOMIC_STORE(&context->HoldUpdates, AL_FALSE); } |