diff options
author | Chris Robinson <[email protected]> | 2009-07-06 03:09:01 -0700 |
---|---|---|
committer | Chris Robinson <[email protected]> | 2009-07-06 03:09:01 -0700 |
commit | 0ac9e57d28cd0216d3b5cf8fe520a62235006a3a (patch) | |
tree | be9a6ed693175c4eb66b682f53bd03d8779d7275 /Alc/ALc.c | |
parent | 5460e85c40b1883b91ca763b88dc014f0d64b705 (diff) |
Store the requested mono/stereo source count and sends in the device
Although the properties are set as context attributes, they are queried from
the device. If multiple contexts per device are ever supported, it would not
be straight forward about where to read the values from. This way, the
attributes can be treated as device-specific attributes that are updated when
a new context is created.
Diffstat (limited to 'Alc/ALc.c')
-rw-r--r-- | Alc/ALc.c | 63 |
1 files changed, 33 insertions, 30 deletions
@@ -472,13 +472,6 @@ static ALvoid InitContext(ALCcontext *pContext) pContext->DopplerVelocity = 1.0f; pContext->flSpeedOfSound = SPEEDOFSOUNDMETRESPERSEC; - pContext->lNumStereoSources = 1; - pContext->lNumMonoSources = pContext->Device->MaxNoOfSources - pContext->lNumStereoSources; - - pContext->NumSends = GetConfigValueInt(NULL, "sends", MAX_SENDS); - if(pContext->NumSends > MAX_SENDS) - pContext->NumSends = MAX_SENDS; - pContext->ExtensionList = "AL_EXTX_buffer_sub_data AL_EXT_EXPONENT_DISTANCE AL_EXT_FLOAT32 AL_EXT_IMA4 AL_EXT_LINEAR_DISTANCE AL_EXT_MCFORMATS AL_EXT_OFFSET AL_EXTX_source_distance_model AL_LOKI_quadriphonic"; level = GetConfigValueInt(NULL, "cf_level", 0); @@ -816,10 +809,8 @@ ALCAPI ALCvoid ALCAPIENTRY alcGetIntegerv(ALCdevice *device,ALCenum param,ALsize case ALC_MAX_AUXILIARY_SENDS: if(!size) SetALCError(ALC_INVALID_VALUE); - else if(device && device->Context) - *data = device->Context->NumSends; else - *data = MAX_SENDS; + *data = (device?device->NumAuxSends:MAX_SENDS); break; case ALC_ATTRIBUTES_SIZE: @@ -828,18 +819,19 @@ ALCAPI ALCvoid ALCAPIENTRY alcGetIntegerv(ALCdevice *device,ALCenum param,ALsize else if(!size) SetALCError(ALC_INVALID_VALUE); else - *data = 12; + *data = 13; break; case ALC_ALL_ATTRIBUTES: if(!device) SetALCError(ALC_INVALID_DEVICE); - else if (size < 7) + else if (size < 13) SetALCError(ALC_INVALID_VALUE); else { int i = 0; + SuspendContext(NULL); data[i++] = ALC_FREQUENCY; data[i++] = device->Frequency; @@ -849,21 +841,17 @@ ALCAPI ALCvoid ALCAPIENTRY alcGetIntegerv(ALCdevice *device,ALCenum param,ALsize data[i++] = ALC_SYNC; data[i++] = ALC_FALSE; - SuspendContext(NULL); - if(device->Context && size >= 12) - { - data[i++] = ALC_MONO_SOURCES; - data[i++] = device->Context->lNumMonoSources; + data[i++] = ALC_MONO_SOURCES; + data[i++] = device->lNumMonoSources; - data[i++] = ALC_STEREO_SOURCES; - data[i++] = device->Context->lNumStereoSources; + data[i++] = ALC_STEREO_SOURCES; + data[i++] = device->lNumStereoSources; - data[i++] = ALC_MAX_AUXILIARY_SENDS; - data[i++] = device->Context->NumSends; - } - ProcessContext(NULL); + data[i++] = ALC_MAX_AUXILIARY_SENDS; + data[i++] = device->NumAuxSends; data[i++] = 0; + ProcessContext(NULL); } break; @@ -900,7 +888,7 @@ ALCAPI ALCvoid ALCAPIENTRY alcGetIntegerv(ALCdevice *device,ALCenum param,ALsize else if (size != 1) SetALCError(ALC_INVALID_VALUE); else - *data = device->Context->lNumMonoSources; + *data = device->lNumMonoSources; break; case ALC_STEREO_SOURCES: @@ -909,7 +897,7 @@ ALCAPI ALCvoid ALCAPIENTRY alcGetIntegerv(ALCdevice *device,ALCenum param,ALsize else if (size != 1) SetALCError(ALC_INVALID_VALUE); else - *data = device->Context->lNumStereoSources; + *data = device->lNumStereoSources; break; default: @@ -1057,6 +1045,10 @@ ALCAPI ALCcontext* ALCAPIENTRY alcCreateContext(ALCdevice *device, const ALCint // Check for attributes if (attrList) { + ALCint numMono = ALContext->Device->lNumMonoSources; + ALCint numStereo = ALContext->Device->lNumStereoSources; + ALCuint numSends = ALContext->Device->NumAuxSends; + ulAttributeIndex = 0; while ((ulAttributeIndex < 10) && (attrList[ulAttributeIndex])) { @@ -1067,22 +1059,26 @@ ALCAPI ALCcontext* ALCAPIENTRY alcCreateContext(ALCdevice *device, const ALCint if (ulRequestedStereoSources > ALContext->Device->MaxNoOfSources) ulRequestedStereoSources = ALContext->Device->MaxNoOfSources; - ALContext->lNumStereoSources = ulRequestedStereoSources; - ALContext->lNumMonoSources = ALContext->Device->MaxNoOfSources - ALContext->lNumStereoSources; + numStereo = ulRequestedStereoSources; + numMono = ALContext->Device->MaxNoOfSources - numStereo; } if(attrList[ulAttributeIndex] == ALC_MAX_AUXILIARY_SENDS) { RequestedSends = attrList[ulAttributeIndex + 1]; - if(RequestedSends > ALContext->NumSends) - RequestedSends = ALContext->NumSends; + if(RequestedSends > ALContext->Device->NumAuxSends) + RequestedSends = ALContext->Device->NumAuxSends; - ALContext->NumSends = RequestedSends; + numSends = RequestedSends; } ulAttributeIndex += 2; } + + ALContext->Device->lNumMonoSources = numMono; + ALContext->Device->lNumStereoSources = numStereo; + ALContext->Device->NumAuxSends = numSends; } } else @@ -1284,6 +1280,13 @@ ALCAPI ALCdevice* ALCAPIENTRY alcOpenDevice(const ALCchar *deviceName) if((ALint)device->AuxiliaryEffectSlotMax <= 0) device->AuxiliaryEffectSlotMax = 4; + device->lNumStereoSources = 1; + device->lNumMonoSources = device->MaxNoOfSources - device->lNumStereoSources; + + device->NumAuxSends = GetConfigValueInt(NULL, "sends", MAX_SENDS); + if(device->NumAuxSends > MAX_SENDS) + device->NumAuxSends = MAX_SENDS; + // Find a playback device to open SuspendContext(NULL); for(i = 0;BackendList[i].Init;i++) |