aboutsummaryrefslogtreecommitdiffstats
path: root/Alc
diff options
context:
space:
mode:
authorChris Robinson <[email protected]>2010-06-06 00:17:50 -0700
committerChris Robinson <[email protected]>2010-06-06 00:17:50 -0700
commit7f6df7695c9c8cd957339f85e57233f5d3308e49 (patch)
tree19d67ce16718276dceb3509c30d192c6dc518826 /Alc
parented585710790c35a2624586d9f387c261cf1bff48 (diff)
Use an array of active sources when mixing
Prevents iterating over all allocated sources during mixing updates
Diffstat (limited to 'Alc')
-rw-r--r--Alc/ALc.c15
-rw-r--r--Alc/ALu.c32
2 files changed, 33 insertions, 14 deletions
diff --git a/Alc/ALc.c b/Alc/ALc.c
index 8156b272..3c4880bd 100644
--- a/Alc/ALc.c
+++ b/Alc/ALc.c
@@ -892,6 +892,7 @@ static ALvoid InitContext(ALCcontext *pContext)
//Validate pContext
pContext->LastError = AL_NO_ERROR;
pContext->Suspended = AL_FALSE;
+ pContext->ActiveSourceCount = 0;
InitUIntMap(&pContext->SourceMap);
//Set globals
@@ -1613,8 +1614,15 @@ ALC_API ALCcontext* ALC_APIENTRY alcCreateContext(ALCdevice *device, const ALCin
device->Contexts = temp;
ALContext = calloc(1, sizeof(ALCcontext));
- if(!ALContext)
+ if(ALContext)
{
+ ALContext->MaxActiveSources = 256;
+ ALContext->ActiveSources = malloc(sizeof(*ALContext->ActiveSources) *
+ ALContext->MaxActiveSources);
+ }
+ if(!ALContext || !ALContext->ActiveSources)
+ {
+ free(ALContext);
alcSetError(device, ALC_OUT_OF_MEMORY);
ProcessContext(NULL);
return NULL;
@@ -1693,6 +1701,11 @@ ALC_API ALCvoid ALC_APIENTRY alcDestroyContext(ALCcontext *context)
}
ResetUIntMap(&context->EffectSlotMap);
+ free(context->ActiveSources);
+ context->ActiveSources = NULL;
+ context->MaxActiveSources = 0;
+ context->ActiveSourceCount = 0;
+
list = &g_pContextList;
while(*list != context)
list = &(*list)->next;
diff --git a/Alc/ALu.c b/Alc/ALu.c
index 817e7d6e..15de0abe 100644
--- a/Alc/ALu.c
+++ b/Alc/ALu.c
@@ -939,23 +939,27 @@ static void MixSomeSources(ALCcontext *ALContext, float (*DryBuffer)[OUTPUTCHANN
ALenum State;
ALsizei pos;
- if(ALContext->SourceMap.size <= 0)
- return;
-
DuplicateStereo = ALContext->Device->DuplicateStereo;
DeviceFreq = ALContext->Device->Frequency;
rampLength = DeviceFreq * MIN_RAMP_LENGTH / 1000;
rampLength = max(rampLength, SamplesToDo);
- pos = ALContext->SourceMap.size;
+ pos = 0;
next_source:
- do {
- if(pos-- <= 0)
- return;
- ALSource = ALContext->SourceMap.array[pos].value;
- } while(ALSource->state != AL_PLAYING);
- j = 0;
+ while(ALContext->ActiveSourceCount > pos)
+ {
+ ALsizei end;
+
+ ALSource = ALContext->ActiveSources[pos];
+ if(ALSource->state == AL_PLAYING)
+ break;
+
+ end = --(ALContext->ActiveSourceCount);
+ ALContext->ActiveSources[pos] = ALContext->ActiveSources[end];
+ }
+ if(pos >= ALContext->ActiveSourceCount)
+ return;
/* Find buffer format */
Frequency = 0;
@@ -1028,8 +1032,8 @@ next_source:
for(i = 0;i < BuffersPlayed && BufferListItem;i++)
BufferListItem = BufferListItem->next;
- while(State == AL_PLAYING && j < SamplesToDo)
- {
+ j = 0;
+ do {
ALfloat *Data = NULL;
ALuint LoopStart = 0;
ALuint LoopEnd = 0;
@@ -1397,7 +1401,7 @@ next_source:
DataPosFrac = 0;
}
}
- }
+ } while(State == AL_PLAYING && j < SamplesToDo);
/* Update source info */
ALSource->state = State;
@@ -1413,6 +1417,8 @@ next_source:
ALSource->FirstStart = AL_FALSE;
+ if(ALSource->state == AL_PLAYING)
+ pos++;
goto next_source;
}