diff options
author | Chris Robinson <[email protected]> | 2017-03-23 19:16:32 -0700 |
---|---|---|
committer | Chris Robinson <[email protected]> | 2017-03-23 19:16:32 -0700 |
commit | 1c49d0542d53133c1e023fc22ff5537ea3ca41aa (patch) | |
tree | 212c7e8107ec5ea82f700341467b251e4f1a2048 | |
parent | 5404b2225aca57407f2f3704e2e2616a281d85ae (diff) |
Use an atomic flag to mark auxiliary effect slot updates
-rw-r--r-- | OpenAL32/Include/alAuxEffectSlot.h | 5 | ||||
-rw-r--r-- | OpenAL32/alAuxEffectSlot.c | 7 |
2 files changed, 6 insertions, 6 deletions
diff --git a/OpenAL32/Include/alAuxEffectSlot.h b/OpenAL32/Include/alAuxEffectSlot.h index 3c24f80c..c6e40a55 100644 --- a/OpenAL32/Include/alAuxEffectSlot.h +++ b/OpenAL32/Include/alAuxEffectSlot.h @@ -4,6 +4,7 @@ #include "alMain.h" #include "alEffect.h" +#include "atomic.h" #include "align.h" #ifdef __cplusplus @@ -88,8 +89,6 @@ struct ALeffectslotProps { typedef struct ALeffectslot { - ALboolean NeedsUpdate; - ALfloat Gain; ALboolean AuxSendAuto; @@ -100,6 +99,8 @@ typedef struct ALeffectslot { ALeffectState *State; } Effect; + ATOMIC_FLAG PropsClean; + RefCount ref; ATOMIC(struct ALeffectslotProps*) Update; diff --git a/OpenAL32/alAuxEffectSlot.c b/OpenAL32/alAuxEffectSlot.c index 37316549..8fc62bde 100644 --- a/OpenAL32/alAuxEffectSlot.c +++ b/OpenAL32/alAuxEffectSlot.c @@ -60,7 +60,7 @@ static void ALeffectState_DecRef(ALeffectState *state); if(!ATOMIC_LOAD(&context->DeferUpdates, almemory_order_acquire)) \ UpdateEffectSlotProps(slot); \ else \ - slot->NeedsUpdate = AL_TRUE; \ + ATOMIC_FLAG_CLEAR(&slot->PropsClean, almemory_order_release); \ } while(0) @@ -579,9 +579,9 @@ ALenum InitEffectSlot(ALeffectslot *slot) if(!(slot->Effect.State=V0(factory,create)())) return AL_OUT_OF_MEMORY; - slot->NeedsUpdate = AL_FALSE; slot->Gain = 1.0; slot->AuxSendAuto = AL_TRUE; + ATOMIC_FLAG_TEST_AND_SET(&slot->PropsClean, almemory_order_relaxed); InitRef(&slot->ref, 0); ATOMIC_INIT(&slot->Update, NULL); @@ -683,9 +683,8 @@ void UpdateAllEffectSlotProps(ALCcontext *context) slot = ATOMIC_LOAD_SEQ(&context->ActiveAuxSlotList); while(slot) { - if(slot->NeedsUpdate) + if(ATOMIC_FLAG_TEST_AND_SET(&slot->PropsClean, almemory_order_acq_rel)) UpdateEffectSlotProps(slot); - slot->NeedsUpdate = AL_FALSE; slot = ATOMIC_LOAD(&slot->next, almemory_order_relaxed); } UnlockEffectSlotsRead(context); |