aboutsummaryrefslogtreecommitdiffstats
path: root/OpenAL32/alSource.c
diff options
context:
space:
mode:
Diffstat (limited to 'OpenAL32/alSource.c')
-rw-r--r--OpenAL32/alSource.c13
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);
}