Update device parameters using a separate function

This commit is contained in:
Chris Robinson
2010-08-09 00:28:48 -07:00
parent f1924fa7ea
commit 2ed929eadc
+159 -157
View File
@@ -815,6 +815,153 @@ ALCvoid alcSetError(ALCdevice *device, ALenum errorCode)
}
/* UpdateDeviceParams:
*
* Updates device parameters according to the attribute list.
*/
static ALCboolean UpdateDeviceParams(ALCdevice *device, const ALCint *attrList)
{
ALCuint freq, numMono, numStereo, numSends;
ALboolean running;
ALuint oldRate;
ALuint attrIdx;
ALuint i;
// Check for attributes
if(!attrList || !attrList[0])
return ALC_TRUE;
running = ((device->NumContexts > 0) ? AL_TRUE : AL_FALSE);
oldRate = device->Frequency;
// If a context is already running on the device, stop playback so the
// device attributes can be updated
if(running)
{
ProcessContext(NULL);
ALCdevice_StopPlayback(device);
SuspendContext(NULL);
running = AL_FALSE;
}
freq = device->Frequency;
numMono = device->NumMonoSources;
numStereo = device->NumStereoSources;
numSends = device->NumAuxSends;
attrIdx = 0;
while(attrList[attrIdx])
{
if(attrList[attrIdx] == ALC_FREQUENCY &&
!ConfigValueExists(NULL, "frequency"))
{
freq = attrList[attrIdx + 1];
if(freq < 8000)
freq = 8000;
}
if(attrList[attrIdx] == ALC_STEREO_SOURCES)
{
numStereo = attrList[attrIdx + 1];
if(numStereo > device->MaxNoOfSources)
numStereo = device->MaxNoOfSources;
numMono = device->MaxNoOfSources - numStereo;
}
if(attrList[attrIdx] == ALC_MAX_AUXILIARY_SENDS &&
!ConfigValueExists(NULL, "sends"))
{
numSends = attrList[attrIdx + 1];
if(numSends > MAX_SENDS)
numSends = MAX_SENDS;
}
attrIdx += 2;
}
device->UpdateSize = (ALuint64)device->UpdateSize * freq /
device->Frequency;
device->Frequency = freq;
device->NumMonoSources = numMono;
device->NumStereoSources = numStereo;
device->NumAuxSends = numSends;
if(ALCdevice_ResetPlayback(device) == ALC_FALSE)
return ALC_FALSE;
aluInitPanning(device);
// Scale the number of samples played according to the new sample rate
device->SamplesPlayed *= device->Frequency;
device->SamplesPlayed += oldRate-1;
device->SamplesPlayed /= oldRate;
for(i = 0;i < device->NumContexts;i++)
{
ALCcontext *context = device->Contexts[i];
ALsizei pos;
SuspendContext(context);
for(pos = 0;pos < context->EffectSlotMap.size;pos++)
{
ALeffectslot *slot = context->EffectSlotMap.array[pos].value;
if(ALEffect_DeviceUpdate(slot->EffectState, device) == AL_FALSE)
{
ProcessContext(context);
return ALC_FALSE;
}
ALEffect_Update(slot->EffectState, context, &slot->effect);
}
for(pos = 0;pos < context->SourceMap.size;pos++)
{
ALsource *source = context->SourceMap.array[pos].value;
ALuint s = device->NumAuxSends;
while(s < MAX_SENDS)
{
if(source->Send[s].Slot)
source->Send[s].Slot->refcount--;
source->Send[s].Slot = NULL;
source->Send[s].WetFilter.type = 0;
source->Send[s].WetFilter.filter = 0;
s++;
}
source->NeedsUpdate = AL_TRUE;
}
ProcessContext(context);
}
if(device->Bs2bLevel > 0 && device->Bs2bLevel <= 6)
{
if(!device->Bs2b)
{
device->Bs2b = calloc(1, sizeof(*device->Bs2b));
bs2b_clear(device->Bs2b);
}
bs2b_set_srate(device->Bs2b, device->Frequency);
bs2b_set_level(device->Bs2b, device->Bs2bLevel);
}
else
{
free(device->Bs2b);
device->Bs2b = NULL;
}
if(aluChannelsFromFormat(device->Format) <= 2)
{
device->HeadDampen = GetConfigValueFloat(NULL, "head_dampen", DEFAULT_HEAD_DAMPEN);
device->HeadDampen = __min(device->HeadDampen, 1.0f);
device->HeadDampen = __max(device->HeadDampen, 0.0f);
}
else
device->HeadDampen = 0.0f;
return ALC_TRUE;
}
/*
SuspendContext
@@ -1478,11 +1625,7 @@ ALC_API ALCenum ALC_APIENTRY alcGetEnumValue(ALCdevice *device, const ALCchar *e
ALC_API ALCcontext* ALC_APIENTRY alcCreateContext(ALCdevice *device, const ALCint *attrList)
{
ALCcontext *ALContext;
ALboolean running;
ALuint oldRate;
ALuint attrIdx;
void *temp;
ALuint i;
SuspendContext(NULL);
@@ -1493,172 +1636,31 @@ ALC_API ALCcontext* ALC_APIENTRY alcCreateContext(ALCdevice *device, const ALCin
return NULL;
}
running = ((device->NumContexts > 0) ? AL_TRUE : AL_FALSE);
oldRate = device->Frequency;
// Reset Context Last Error code
device->LastError = ALC_NO_ERROR;
// Check for attributes
if(attrList && attrList[0])
{
ALCuint freq, numMono, numStereo, numSends;
// If a context is already running on the device, stop playback so the
// device attributes can be updated
if(running)
{
ProcessContext(NULL);
ALCdevice_StopPlayback(device);
SuspendContext(NULL);
running = AL_FALSE;
}
freq = device->Frequency;
numMono = device->NumMonoSources;
numStereo = device->NumStereoSources;
numSends = device->NumAuxSends;
attrIdx = 0;
while(attrList[attrIdx])
{
if(attrList[attrIdx] == ALC_FREQUENCY &&
!ConfigValueExists(NULL, "frequency"))
{
freq = attrList[attrIdx + 1];
if(freq < 8000)
freq = 8000;
}
if(attrList[attrIdx] == ALC_STEREO_SOURCES)
{
numStereo = attrList[attrIdx + 1];
if(numStereo > device->MaxNoOfSources)
numStereo = device->MaxNoOfSources;
numMono = device->MaxNoOfSources - numStereo;
}
if(attrList[attrIdx] == ALC_MAX_AUXILIARY_SENDS &&
!ConfigValueExists(NULL, "sends"))
{
numSends = attrList[attrIdx + 1];
if(numSends > MAX_SENDS)
numSends = MAX_SENDS;
}
attrIdx += 2;
}
device->UpdateSize = (ALuint64)device->UpdateSize * freq /
device->Frequency;
device->Frequency = freq;
device->NumMonoSources = numMono;
device->NumStereoSources = numStereo;
device->NumAuxSends = numSends;
}
if(running != AL_FALSE)
goto make_context;
if(ALCdevice_ResetPlayback(device) == ALC_FALSE)
if(UpdateDeviceParams(device, attrList) == ALC_FALSE)
{
alcSetError(device, ALC_INVALID_DEVICE);
aluHandleDisconnect(device);
ProcessContext(NULL);
ALCdevice_StopPlayback(device);
return NULL;
}
aluInitPanning(device);
// Scale the number of samples played according to the new sample rate
device->SamplesPlayed *= device->Frequency;
device->SamplesPlayed += oldRate-1;
device->SamplesPlayed /= oldRate;
for(i = 0;i < device->NumContexts;i++)
{
ALCcontext *context = device->Contexts[i];
ALsizei pos;
SuspendContext(context);
for(pos = 0;pos < context->EffectSlotMap.size;pos++)
{
ALeffectslot *slot = context->EffectSlotMap.array[pos].value;
if(ALEffect_DeviceUpdate(slot->EffectState, device) == AL_FALSE)
{
alcSetError(device, ALC_INVALID_DEVICE);
aluHandleDisconnect(device);
ProcessContext(context);
ProcessContext(NULL);
ALCdevice_StopPlayback(device);
return NULL;
}
ALEffect_Update(slot->EffectState, context, &slot->effect);
}
for(pos = 0;pos < context->SourceMap.size;pos++)
{
ALsource *source = context->SourceMap.array[pos].value;
ALuint s = device->NumAuxSends;
while(s < MAX_SENDS)
{
if(source->Send[s].Slot)
source->Send[s].Slot->refcount--;
source->Send[s].Slot = NULL;
source->Send[s].WetFilter.type = 0;
source->Send[s].WetFilter.filter = 0;
s++;
}
source->NeedsUpdate = AL_TRUE;
}
ProcessContext(context);
}
if(device->Bs2bLevel > 0 && device->Bs2bLevel <= 6)
{
if(!device->Bs2b)
{
device->Bs2b = calloc(1, sizeof(*device->Bs2b));
bs2b_clear(device->Bs2b);
}
bs2b_set_srate(device->Bs2b, device->Frequency);
bs2b_set_level(device->Bs2b, device->Bs2bLevel);
}
else
{
free(device->Bs2b);
device->Bs2b = NULL;
}
if(aluChannelsFromFormat(device->Format) <= 2)
{
device->HeadDampen = GetConfigValueFloat(NULL, "head_dampen", DEFAULT_HEAD_DAMPEN);
device->HeadDampen = __min(device->HeadDampen, 1.0f);
device->HeadDampen = __max(device->HeadDampen, 0.0f);
}
else
device->HeadDampen = 0.0f;
make_context:
ALContext = NULL;
temp = realloc(device->Contexts, (device->NumContexts+1) * sizeof(*device->Contexts));
if(!temp)
if(temp)
{
alcSetError(device, ALC_OUT_OF_MEMORY);
ProcessContext(NULL);
if(device->NumContexts == 0)
ALCdevice_StopPlayback(device);
return NULL;
}
device->Contexts = temp;
device->Contexts = temp;
ALContext = calloc(1, sizeof(ALCcontext));
if(ALContext)
{
ALContext->MaxActiveSources = 256;
ALContext->ActiveSources = malloc(sizeof(*ALContext->ActiveSources) *
ALContext->MaxActiveSources);
ALContext = calloc(1, sizeof(ALCcontext));
if(ALContext)
{
ALContext->MaxActiveSources = 256;
ALContext->ActiveSources = malloc(sizeof(ALContext->ActiveSources[0]) *
ALContext->MaxActiveSources);
}
}
if(!ALContext || !ALContext->ActiveSources)
{