diff options
author | Chris Robinson <[email protected]> | 2016-05-15 17:14:58 -0700 |
---|---|---|
committer | Chris Robinson <[email protected]> | 2016-05-15 22:16:27 -0700 |
commit | 945fd022d6c9d612a5fae944d8cbef68927d8a92 (patch) | |
tree | 88a1fdfd2890c0f9f0ee4d3a541571177609f2bc /OpenAL32/alSource.c | |
parent | 63e98481eef0eb02dac14b889be80836a300eecc (diff) |
Avoid separate updates to sources that should apply together
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); } |