aboutsummaryrefslogtreecommitdiffstats
path: root/Alc
diff options
context:
space:
mode:
Diffstat (limited to 'Alc')
-rw-r--r--Alc/ALc.c40
-rw-r--r--Alc/ALu.c72
2 files changed, 47 insertions, 65 deletions
diff --git a/Alc/ALc.c b/Alc/ALc.c
index 9b802b3b..d43b587c 100644
--- a/Alc/ALc.c
+++ b/Alc/ALc.c
@@ -1620,42 +1620,16 @@ void ALCcontext_DeferUpdates(ALCcontext *context)
V0(device->Backend,lock)();
if(!context->DeferUpdates)
{
- ALboolean UpdateSources;
- ALvoice *voice, *voice_end;
- ALeffectslot **slot, **slot_end;
-
context->DeferUpdates = AL_TRUE;
/* Make sure all pending updates are performed */
- UpdateSources = ATOMIC_EXCHANGE(ALenum, &context->UpdateSources, AL_FALSE);
-
- voice = context->Voices;
- voice_end = voice + context->VoiceCount;
- while(voice != voice_end)
- {
- ALsource *source = voice->Source;
- if(!source) goto next;
-
- if(source->state != AL_PLAYING && source->state != AL_PAUSED)
- {
- voice->Source = NULL;
- goto next;
- }
-
- if(ATOMIC_EXCHANGE(ALenum, &source->NeedsUpdate, AL_FALSE) || UpdateSources)
- voice->Update(voice, source, context);
- next:
- voice++;
- }
-
- slot = VECTOR_ITER_BEGIN(context->ActiveAuxSlots);
- slot_end = VECTOR_ITER_END(context->ActiveAuxSlots);
- while(slot != slot_end)
- {
- if(ATOMIC_EXCHANGE(ALenum, &(*slot)->NeedsUpdate, AL_FALSE))
- V((*slot)->EffectState,update)(context->Device, *slot);
- slot++;
- }
+ UpdateContextSources(context);
+#define UPDATE_SLOT(iter) do { \
+ if(ATOMIC_EXCHANGE(ALenum, &(*iter)->NeedsUpdate, AL_FALSE)) \
+ V((*iter)->EffectState,update)(device, *iter); \
+} while(0)
+ VECTOR_FOR_EACH(ALeffectslot*, context->ActiveAuxSlots, UPDATE_SLOT);
+#undef UPDATE_SLOT
}
V0(device->Backend,unlock)();
diff --git a/Alc/ALu.c b/Alc/ALu.c
index 6bfaca6f..cab48d98 100644
--- a/Alc/ALu.c
+++ b/Alc/ALu.c
@@ -1153,6 +1153,45 @@ ALvoid CalcSourceParams(ALvoice *voice, const ALsource *ALSource, const ALCconte
}
+void UpdateContextSources(ALCcontext *ctx)
+{
+ ALvoice *voice, *voice_end;
+ ALsource *source;
+
+ if(ATOMIC_EXCHANGE(ALenum, &ctx->UpdateSources, AL_FALSE))
+ {
+ CalcListenerParams(ctx->Listener);
+
+ voice = ctx->Voices;
+ voice_end = voice + ctx->VoiceCount;
+ for(;voice != voice_end;++voice)
+ {
+ if(!(source=voice->Source)) continue;
+ if(source->state != AL_PLAYING && source->state != AL_PAUSED)
+ voice->Source = NULL;
+ else
+ {
+ ATOMIC_STORE(&source->NeedsUpdate, AL_FALSE);
+ voice->Update(voice, source, ctx);
+ }
+ }
+ }
+ else
+ {
+ voice = ctx->Voices;
+ voice_end = voice + ctx->VoiceCount;
+ for(;voice != voice_end;++voice)
+ {
+ if(!(source=voice->Source)) continue;
+ if(source->state != AL_PLAYING && source->state != AL_PAUSED)
+ voice->Source = NULL;
+ else if(ATOMIC_EXCHANGE(ALenum, &source->NeedsUpdate, AL_FALSE))
+ voice->Update(voice, source, ctx);
+ }
+ }
+}
+
+
/* Specialized function to clamp to [-1, +1] with only one branch. This also
* converts NaN to 0. */
static inline ALfloat aluClampf(ALfloat val)
@@ -1258,38 +1297,7 @@ ALvoid aluMixData(ALCdevice *device, ALvoid *buffer, ALsizei size)
{
if(!ctx->DeferUpdates)
{
- if(ATOMIC_EXCHANGE(ALenum, &ctx->UpdateSources, AL_FALSE))
- {
- CalcListenerParams(ctx->Listener);
-
- voice = ctx->Voices;
- voice_end = voice + ctx->VoiceCount;
- for(;voice != voice_end;++voice)
- {
- if(!(source=voice->Source)) continue;
- if(source->state != AL_PLAYING && source->state != AL_PAUSED)
- voice->Source = NULL;
- else
- {
- ATOMIC_STORE(&source->NeedsUpdate, AL_FALSE);
- voice->Update(voice, source, ctx);
- }
- }
- }
- else
- {
- voice = ctx->Voices;
- voice_end = voice + ctx->VoiceCount;
- for(;voice != voice_end;++voice)
- {
- if(!(source=voice->Source)) continue;
- if(source->state != AL_PLAYING && source->state != AL_PAUSED)
- voice->Source = NULL;
- else if(ATOMIC_EXCHANGE(ALenum, &source->NeedsUpdate, AL_FALSE))
- voice->Update(voice, source, ctx);
- }
- }
-
+ UpdateContextSources(ctx);
#define UPDATE_SLOT(iter) do { \
if(ATOMIC_EXCHANGE(ALenum, &(*iter)->NeedsUpdate, AL_FALSE)) \
V((*iter)->EffectState,update)(device, *iter); \