diff options
author | Chris Robinson <[email protected]> | 2016-08-23 19:37:26 -0700 |
---|---|---|
committer | Chris Robinson <[email protected]> | 2016-08-23 19:37:26 -0700 |
commit | ea2fb38627a0549c17f2a875dd9a2481712efbe3 (patch) | |
tree | 3b5904a5cb13ebdcf2c22099a7eba70e8baaf4bd /Alc/ALc.c | |
parent | c7eb0b7393231a137c31f75e0654214a08bc51a9 (diff) |
Hold updates for both listener and source updates
Diffstat (limited to 'Alc/ALc.c')
-rw-r--r-- | Alc/ALc.c | 16 |
1 files changed, 15 insertions, 1 deletions
@@ -1601,6 +1601,16 @@ void ALCcontext_ProcessUpdates(ALCcontext *context) if(ATOMIC_EXCHANGE(ALenum, &context->DeferUpdates, AL_FALSE)) { ALsizei pos; + uint updates; + + /* Tell the mixer to stop applying updates, then wait for any active + * updating to finish, before providing updates. + */ + ATOMIC_STORE(&context->HoldUpdates, AL_TRUE); + while(((updates=ReadRef(&context->UpdateCount))&1) != 0) + althrd_yield(); + + UpdateListenerProps(context); LockUIntMapRead(&context->SourceMap); V0(device->Backend,lock)(); @@ -1625,8 +1635,12 @@ void ALCcontext_ProcessUpdates(ALCcontext *context) V0(device->Backend,unlock)(); UnlockUIntMapRead(&context->SourceMap); - UpdateListenerProps(context); UpdateAllSourceProps(context); + + /* Now with all updates declared, let the mixer continue applying them + * so they all happen at once. + */ + ATOMIC_STORE(&context->HoldUpdates, AL_FALSE); } ReadUnlock(&context->PropLock); } |