aboutsummaryrefslogtreecommitdiffstats
path: root/Alc/ALu.c
diff options
context:
space:
mode:
authorChris Robinson <[email protected]>2016-05-12 19:05:06 -0700
committerChris Robinson <[email protected]>2016-05-12 19:05:06 -0700
commit210e150601d9b458d446483f5f16e1e67cc6e3ba (patch)
treec7230d482b5628b334845a1f735ef3d1a42d5a98 /Alc/ALu.c
parentef0d4f8210fe6aa65b9df96f3b64bf6f355e845a (diff)
Avoid updating the effect state object if it's not changed
Diffstat (limited to 'Alc/ALu.c')
-rw-r--r--Alc/ALu.c15
1 files changed, 7 insertions, 8 deletions
diff --git a/Alc/ALu.c b/Alc/ALu.c
index 3b873aa5..a555b834 100644
--- a/Alc/ALu.c
+++ b/Alc/ALu.c
@@ -342,14 +342,6 @@ static ALboolean CalcEffectSlotParams(ALeffectslot *slot, ALCdevice *device)
slot->Params.AuxSendAuto = ATOMIC_LOAD(&props->AuxSendAuto, almemory_order_relaxed);
slot->Params.EffectType = ATOMIC_LOAD(&props->Type, almemory_order_relaxed);
memcpy(&slot->Params.EffectProps, &props->Props, sizeof(props->Props));
- /* If the existing state object is different from the one being set,
- * exchange it so it remains in the freelist and isn't leaked.
- */
- if(slot->Params.EffectState == ATOMIC_LOAD(&props->State, almemory_order_relaxed))
- slot->Params.EffectState = NULL;
- slot->Params.EffectState = ATOMIC_EXCHANGE(ALeffectState*,
- &props->State, slot->Params.EffectState, almemory_order_relaxed
- );
if(IsReverbEffect(slot->Params.EffectType))
{
slot->Params.RoomRolloff = slot->Params.EffectProps.Reverb.RoomRolloffFactor;
@@ -362,6 +354,13 @@ static ALboolean CalcEffectSlotParams(ALeffectslot *slot, ALCdevice *device)
slot->Params.DecayTime = 0.0f;
slot->Params.AirAbsorptionGainHF = 1.0f;
}
+ /* If the state object is changed, exchange it with the current one so it
+ * remains in the freelist and isn't leaked.
+ */
+ if(ATOMIC_LOAD(&props->UpdateState, almemory_order_relaxed))
+ slot->Params.EffectState = ATOMIC_EXCHANGE(ALeffectState*,
+ &props->State, slot->Params.EffectState, almemory_order_relaxed
+ );
V(slot->Params.EffectState,update)(device, slot);