Use an array of objects for active sources instead of pointers

This commit is contained in:
Chris Robinson
2014-08-21 02:27:56 -07:00
parent b92e643e97
commit 65d2e0eb8d
5 changed files with 48 additions and 66 deletions
+3 -10
View File
@@ -1924,7 +1924,7 @@ static ALCenum UpdateDeviceParams(ALCdevice *device, const ALCint *attrList)
for(pos = 0;pos < context->ActiveSourceCount;pos++)
{
ALactivesource *src = context->ActiveSources[pos];
ALactivesource *src = &context->ActiveSources[pos];
ALsource *source = src->Source;
ALuint s = device->NumAuxSends;
@@ -1937,8 +1937,8 @@ static ALCenum UpdateDeviceParams(ALCdevice *device, const ALCint *attrList)
if(source)
{
src->Update(src, source, context);
ATOMIC_STORE(&source->NeedsUpdate, AL_FALSE);
src->Update(src, source, context);
}
}
@@ -2141,10 +2141,8 @@ static ALvoid InitContext(ALCcontext *Context)
* Cleans up the context, and destroys any remaining objects the app failed to
* delete. Called once there's no more references on the context.
*/
static ALCvoid FreeContext(ALCcontext *context)
static void FreeContext(ALCcontext *context)
{
ALsizei i;
TRACE("%p\n", context);
if(context->SourceMap.size > 0)
@@ -2161,11 +2159,6 @@ static ALCvoid FreeContext(ALCcontext *context)
}
ResetUIntMap(&context->EffectSlotMap);
for(i = 0;i < context->MaxActiveSources;i++)
{
al_free(context->ActiveSources[i]);
context->ActiveSources[i] = NULL;
}
free(context->ActiveSources);
context->ActiveSources = NULL;
context->ActiveSourceCount = 0;
+8 -8
View File
@@ -1140,7 +1140,7 @@ ALvoid aluMixData(ALCdevice *device, ALvoid *buffer, ALsizei size)
{
ALuint SamplesToDo;
ALeffectslot **slot, **slot_end;
ALactivesource **src, **src_end;
ALactivesource *src, *src_end;
ALCcontext *ctx;
FPUCtl oldMode;
ALuint i, c;
@@ -1175,21 +1175,21 @@ ALvoid aluMixData(ALCdevice *device, ALvoid *buffer, ALsizei size)
src_end = src + ctx->ActiveSourceCount;
while(src != src_end)
{
ALsource *source = (*src)->Source;
ALsource *source = src->Source;
if(!source) goto next;
if(source->state != AL_PLAYING && source->state != AL_PAUSED)
{
(*src)->Source = NULL;
src->Source = NULL;
goto next;
}
if(!DeferUpdates && (ATOMIC_EXCHANGE(ALenum, &source->NeedsUpdate, AL_FALSE) ||
UpdateSources))
(*src)->Update(*src, source, ctx);
src->Update(src, source, ctx);
if(source->state != AL_PAUSED)
MixSource(*src, source, device, SamplesToDo);
MixSource(src, source, device, SamplesToDo);
next:
src++;
}
@@ -1295,14 +1295,14 @@ ALvoid aluHandleDisconnect(ALCdevice *device)
Context = ATOMIC_LOAD(&device->ContextList);
while(Context)
{
ALactivesource **src, **src_end;
ALactivesource *src, *src_end;
src = Context->ActiveSources;
src_end = src + Context->ActiveSourceCount;
while(src != src_end)
{
ALsource *source = (*src)->Source;
(*src)->Source = NULL;
ALsource *source = src->Source;
src->Source = NULL;
if(source && source->state == AL_PLAYING)
{
+1 -1
View File
@@ -748,7 +748,7 @@ struct ALCcontext_struct
volatile ALfloat SpeedOfSound;
volatile ALenum DeferUpdates;
struct ALactivesource **ActiveSources;
struct ALactivesource *ActiveSources;
ALsizei ActiveSourceCount;
ALsizei MaxActiveSources;
+32 -43
View File
@@ -1389,7 +1389,7 @@ AL_API ALvoid AL_APIENTRY alDeleteSources(ALsizei n, const ALuint *sources)
}
for(i = 0;i < n;i++)
{
ALactivesource **srclist, **srclistend;
ALactivesource *srclist, *srclistend;
if((Source=RemoveSource(context, sources[i])) == NULL)
continue;
@@ -1401,7 +1401,7 @@ AL_API ALvoid AL_APIENTRY alDeleteSources(ALsizei n, const ALuint *sources)
while(srclist != srclistend)
{
ALsource *old = Source;
if(COMPARE_EXCHANGE(&(*srclist)->Source, &old, NULL))
if(COMPARE_EXCHANGE(&srclist->Source, &old, NULL))
break;
srclist++;
}
@@ -2017,7 +2017,7 @@ AL_API ALvoid AL_APIENTRY alSourcePlayv(ALsizei n, const ALuint *sources)
LockContext(context);
while(n > context->MaxActiveSources-context->ActiveSourceCount)
{
ALactivesource **temp = NULL;
ALactivesource *temp = NULL;
ALsizei newcount;
newcount = context->MaxActiveSources << 1;
@@ -2029,8 +2029,7 @@ AL_API ALvoid AL_APIENTRY alSourcePlayv(ALsizei n, const ALuint *sources)
UnlockContext(context);
SET_ERROR_AND_GOTO(context, AL_OUT_OF_MEMORY, done);
}
for(i = context->MaxActiveSources;i < newcount;i++)
temp[i] = NULL;
memset(&temp[context->MaxActiveSources], 0, (newcount-context->MaxActiveSources) * sizeof(temp[0]));
context->ActiveSources = temp;
context->MaxActiveSources = newcount;
@@ -2483,58 +2482,48 @@ ALvoid SetSourceState(ALsource *Source, ALCcontext *Context, ALenum state)
if(!BufferList || !device->Connected)
goto do_stop;
/* Make sure this source isn't already active, while looking for an
* unused active source slot to put it in. */
for(i = 0;i < Context->ActiveSourceCount;i++)
{
if(Context->ActiveSources[i]->Source == Source)
ALsource *old = Source;
if(COMPARE_EXCHANGE(&Context->ActiveSources[i].Source, &old, NULL))
{
src = Context->ActiveSources[i];
if(src == NULL)
{
src = &Context->ActiveSources[i];
src->Source = Source;
}
break;
}
old = NULL;
if(src == NULL && COMPARE_EXCHANGE(&Context->ActiveSources[i].Source, &old, Source))
src = &Context->ActiveSources[i];
}
if(src == NULL)
{
for(i = 0;i < Context->ActiveSourceCount;i++)
{
ALsource *old = NULL;
src = Context->ActiveSources[i];
if(COMPARE_EXCHANGE(&src->Source, &old, Source))
break;
}
if(i == Context->ActiveSourceCount)
{
src = Context->ActiveSources[Context->ActiveSourceCount];
if(src == NULL)
{
src = al_malloc(16, sizeof(src[0]));
Context->ActiveSources[Context->ActiveSourceCount] = src;
}
Context->ActiveSourceCount++;
}
memset(src, 0, sizeof(*src));
src = &Context->ActiveSources[Context->ActiveSourceCount++];
src->Source = Source;
}
else
src->Direct.Moving = AL_FALSE;
src->Direct.Counter = 0;
for(i = 0;i < MAX_INPUT_CHANNELS;i++)
{
src->Direct.Moving = AL_FALSE;
src->Direct.Counter = 0;
for(i = 0;i < MAX_INPUT_CHANNELS;i++)
ALsizei j;
for(j = 0;j < SRC_HISTORY_LENGTH;j++)
src->Direct.Mix.Hrtf.State[i].History[j] = 0.0f;
for(j = 0;j < HRIR_LENGTH;j++)
{
ALsizei j;
for(j = 0;j < SRC_HISTORY_LENGTH;j++)
src->Direct.Mix.Hrtf.State[i].History[j] = 0.0f;
for(j = 0;j < HRIR_LENGTH;j++)
{
src->Direct.Mix.Hrtf.State[i].Values[j][0] = 0.0f;
src->Direct.Mix.Hrtf.State[i].Values[j][1] = 0.0f;
}
}
for(i = 0;i < (ALsizei)device->NumAuxSends;i++)
{
src->Send[i].Counter = 0;
src->Send[i].Moving = AL_FALSE;
src->Direct.Mix.Hrtf.State[i].Values[j][0] = 0.0f;
src->Direct.Mix.Hrtf.State[i].Values[j][1] = 0.0f;
}
}
for(i = 0;i < (ALsizei)device->NumAuxSends;i++)
{
src->Send[i].Counter = 0;
src->Send[i].Moving = AL_FALSE;
}
if(BufferList->buffer->FmtChannels == FmtMono)
src->Update = CalcSourceParams;
+4 -4
View File
@@ -715,7 +715,7 @@ AL_API ALvoid AL_APIENTRY alDeferUpdatesSOFT(void)
if(!context->DeferUpdates)
{
ALboolean UpdateSources;
ALactivesource **src, **src_end;
ALactivesource *src, *src_end;
ALeffectslot **slot, **slot_end;
FPUCtl oldMode;
@@ -731,17 +731,17 @@ AL_API ALvoid AL_APIENTRY alDeferUpdatesSOFT(void)
src_end = src + context->ActiveSourceCount;
while(src != src_end)
{
ALsource *source = (*src)->Source;
ALsource *source = src->Source;
if(!source) goto next;
if(source->state != AL_PLAYING && source->state != AL_PAUSED)
{
(*src)->Source = NULL;
src->Source = NULL;
continue;
}
if(ATOMIC_EXCHANGE(ALenum, &source->NeedsUpdate, AL_FALSE) || UpdateSources)
(*src)->Update(*src, source, context);
src->Update(src, source, context);
next:
src++;
}