diff options
author | Chris Robinson <[email protected]> | 2010-06-06 00:17:50 -0700 |
---|---|---|
committer | Chris Robinson <[email protected]> | 2010-06-06 00:17:50 -0700 |
commit | 7f6df7695c9c8cd957339f85e57233f5d3308e49 (patch) | |
tree | 19d67ce16718276dceb3509c30d192c6dc518826 /Alc | |
parent | ed585710790c35a2624586d9f387c261cf1bff48 (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.c | 15 | ||||
-rw-r--r-- | Alc/ALu.c | 32 |
2 files changed, 33 insertions, 14 deletions
@@ -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; @@ -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; } |