aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Robinson <[email protected]>2011-07-16 02:41:02 -0700
committerChris Robinson <[email protected]>2011-07-16 02:41:02 -0700
commitda2429a1d0ad184abe24f61aa7e064b81026651c (patch)
tree0f11fd679964b02b318a9e556e3051c9c91b5aad
parent54b5f35125d1b85c3e16c292a9829e9d652d2e38 (diff)
Allow effect slots to be updated asynchronously
Updates when the slot changes effect type is still sychronous, however, to ensure a proper state for the Process method call. Fixing this would essentially require all effects to work from the same state.
-rw-r--r--Alc/ALc.c5
-rw-r--r--Alc/ALu.c6
-rw-r--r--OpenAL32/Include/alAuxEffectSlot.h1
-rw-r--r--OpenAL32/alAuxEffectSlot.c23
4 files changed, 29 insertions, 6 deletions
diff --git a/Alc/ALc.c b/Alc/ALc.c
index 0a025bf6..5af83f70 100644
--- a/Alc/ALc.c
+++ b/Alc/ALc.c
@@ -1414,6 +1414,7 @@ static ALCboolean UpdateDeviceParams(ALCdevice *device, const ALCint *attrList)
ALCcontext *context = device->Contexts[i];
ALsizei pos;
+ context->UpdateSources = AL_FALSE;
for(pos = 0;pos < context->EffectSlotMap.size;pos++)
{
ALeffectslot *slot = context->EffectSlotMap.array[pos].value;
@@ -1425,6 +1426,7 @@ static ALCboolean UpdateDeviceParams(ALCdevice *device, const ALCint *attrList)
device->Flags &= ~DEVICE_RUNNING;
return ALC_FALSE;
}
+ slot->NeedsUpdate = AL_FALSE;
ALEffect_Update(slot->EffectState, context, &slot->effect);
}
@@ -1441,10 +1443,9 @@ static ALCboolean UpdateDeviceParams(ALCdevice *device, const ALCint *attrList)
source->Send[s].WetFilter.filter = 0;
s++;
}
- ALsource_Update(source, context);
source->NeedsUpdate = AL_FALSE;
+ ALsource_Update(source, context);
}
- context->UpdateSources = AL_FALSE;
}
UnlockDevice(device);
diff --git a/Alc/ALu.c b/Alc/ALu.c
index 04d894e1..dff205dd 100644
--- a/Alc/ALu.c
+++ b/Alc/ALu.c
@@ -1031,6 +1031,12 @@ ALvoid aluMixData(ALCdevice *device, ALvoid *buffer, ALsizei size)
ALEffectSlot->PendingClicks[i] = 0.0f;
}
+ if(ALEffectSlot->NeedsUpdate)
+ {
+ ALEffectSlot->NeedsUpdate = AL_FALSE;
+ ALEffect_Update(ALEffectSlot->EffectState, *ctx, &ALEffectSlot->effect);
+ }
+
ALEffect_Process(ALEffectSlot->EffectState, ALEffectSlot,
SamplesToDo, ALEffectSlot->WetBuffer,
device->DryBuffer);
diff --git a/OpenAL32/Include/alAuxEffectSlot.h b/OpenAL32/Include/alAuxEffectSlot.h
index 09bc363e..eced4872 100644
--- a/OpenAL32/Include/alAuxEffectSlot.h
+++ b/OpenAL32/Include/alAuxEffectSlot.h
@@ -18,6 +18,7 @@ typedef struct ALeffectslot
ALfloat Gain;
ALboolean AuxSendAuto;
+ ALboolean NeedsUpdate;
ALeffectState *EffectState;
ALfloat WetBuffer[BUFFERSIZE];
diff --git a/OpenAL32/alAuxEffectSlot.c b/OpenAL32/alAuxEffectSlot.c
index 09e29f1e..b4046c71 100644
--- a/OpenAL32/alAuxEffectSlot.c
+++ b/OpenAL32/alAuxEffectSlot.c
@@ -86,6 +86,7 @@ AL_API ALvoid AL_APIENTRY alGenAuxiliaryEffectSlots(ALsizei n, ALuint *effectslo
slot->Gain = 1.0;
slot->AuxSendAuto = AL_TRUE;
+ slot->NeedsUpdate = AL_FALSE;
for(j = 0;j < BUFFERSIZE;j++)
slot->WetBuffer[j] = 0.0f;
for(j = 0;j < 1;j++)
@@ -495,12 +496,26 @@ static ALvoid InitializeEffect(ALCcontext *Context, ALeffectslot *EffectSlot, AL
if(EffectSlot->EffectState)
ALEffect_Destroy(EffectSlot->EffectState);
EffectSlot->EffectState = NewState;
+
+ if(!effect)
+ memset(&EffectSlot->effect, 0, sizeof(EffectSlot->effect));
+ else
+ memcpy(&EffectSlot->effect, effect, sizeof(*effect));
+ /* FIXME: This should be done asychronously, but since the EfefctState
+ * object was changed, it needs an update before its Process method can
+ * be called (coming changes may not guarantee an update when the
+ * NeedsUpdate flag is set). */
+ EffectSlot->NeedsUpdate = AL_FALSE;
+ ALEffect_Update(EffectSlot->EffectState, Context, &EffectSlot->effect);
}
- if(!effect)
- memset(&EffectSlot->effect, 0, sizeof(EffectSlot->effect));
else
- memcpy(&EffectSlot->effect, effect, sizeof(*effect));
- ALEffect_Update(EffectSlot->EffectState, Context, &EffectSlot->effect);
+ {
+ if(!effect)
+ memset(&EffectSlot->effect, 0, sizeof(EffectSlot->effect));
+ else
+ memcpy(&EffectSlot->effect, effect, sizeof(*effect));
+ EffectSlot->NeedsUpdate = AL_TRUE;
+ }
}