From 8003278a5589c6300650710be924d596791946ac Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Sat, 7 Aug 2010 06:57:31 -0700 Subject: [PATCH] Combine non-attenuated source calculation functions --- Alc/ALu.c | 218 ++++++++++++++----------------------------------- OpenAL32/Include/alu.h | 1 - OpenAL32/alSource.c | 4 - 3 files changed, 62 insertions(+), 161 deletions(-) diff --git a/Alc/ALu.c b/Alc/ALu.c index b14d40bc..0cccf0f0 100644 --- a/Alc/ALu.c +++ b/Alc/ALu.c @@ -84,112 +84,8 @@ ALvoid CalcNonAttnSourceParams(ALsource *ALSource, const ALCcontext *ALContext) ALfloat WetGain[MAX_SENDS]; ALfloat WetGainHF[MAX_SENDS]; ALint NumSends, Frequency; - ALfloat Pitch; - ALfloat cw; - ALint i; - - //Get context properties - NumSends = ALContext->Device->NumAuxSends; - Frequency = ALContext->Device->Frequency; - - //Get listener properties - ListenerGain = ALContext->Listener.Gain; - - //Get source properties - SourceVolume = ALSource->flGain; - MinVolume = ALSource->flMinGain; - MaxVolume = ALSource->flMaxGain; - - //1. Multi-channel buffers always play "normal" - Pitch = ALSource->flPitch; - BufferListItem = ALSource->queue; - while(BufferListItem != NULL) - { - ALbuffer *ALBuffer; - if((ALBuffer=BufferListItem->buffer) != NULL) - { - Pitch = Pitch * ALBuffer->frequency / Frequency; - break; - } - BufferListItem = BufferListItem->next; - } - - if(Pitch > (float)MAX_PITCH) - ALSource->Params.Step = MAX_PITCH< 0.0f)) - ALSource->Params.Step = 1<Params.Step = Pitch*(1<Params.Step == 0) - ALSource->Params.Step = 1; - } - - DryGain = SourceVolume; - DryGain = __min(DryGain,MaxVolume); - DryGain = __max(DryGain,MinVolume); - DryGainHF = 1.0f; - - switch(ALSource->DirectFilter.type) - { - case AL_FILTER_LOWPASS: - DryGain *= ALSource->DirectFilter.Gain; - DryGainHF *= ALSource->DirectFilter.GainHF; - break; - } - - for(i = 0;i < OUTPUTCHANNELS;i++) - ALSource->Params.DryGains[i] = DryGain * ListenerGain; - - for(i = 0;i < NumSends;i++) - { - WetGain[i] = SourceVolume; - WetGain[i] = __min(WetGain[i],MaxVolume); - WetGain[i] = __max(WetGain[i],MinVolume); - WetGainHF[i] = 1.0f; - - switch(ALSource->Send[i].WetFilter.type) - { - case AL_FILTER_LOWPASS: - WetGain[i] *= ALSource->Send[i].WetFilter.Gain; - WetGainHF[i] *= ALSource->Send[i].WetFilter.GainHF; - break; - } - - ALSource->Params.WetGains[i] = WetGain[i] * ListenerGain; - } - for(i = NumSends;i < MAX_SENDS;i++) - { - ALSource->Params.WetGains[i] = 0.0f; - WetGainHF[i] = 1.0f; - } - - /* Update filter coefficients. Calculations based on the I3DL2 - * spec. */ - cw = cos(2.0*M_PI * LOWPASSFREQCUTOFF / Frequency); - - /* We use two chained one-pole filters, so we need to take the - * square root of the squared gain, which is the same as the base - * gain. */ - ALSource->Params.iirFilter.coeff = lpCoeffCalc(DryGainHF, cw); - - for(i = 0;i < NumSends;i++) - { - /* We use a one-pole filter, so we need to take the squared gain */ - ALfloat a = lpCoeffCalc(WetGainHF[i]*WetGainHF[i], cw); - ALSource->Params.Send[i].iirFilter.coeff = a; - } -} - -ALvoid CalcNonAttnStereoSourceParams(ALsource *ALSource, const ALCcontext *ALContext) -{ - ALfloat SourceVolume,ListenerGain,MinVolume,MaxVolume; - ALbufferlistitem *BufferListItem; - ALfloat DryGain, DryGainHF; - ALfloat WetGain[MAX_SENDS]; - ALfloat WetGainHF[MAX_SENDS]; - ALint NumSends, Frequency; ALboolean DupStereo; + ALint Channels; ALfloat Pitch; ALenum Format; ALfloat cw; @@ -210,6 +106,7 @@ ALvoid CalcNonAttnStereoSourceParams(ALsource *ALSource, const ALCcontext *ALCon MaxVolume = ALSource->flMaxGain; //1. Multi-channel buffers always play "normal" + Channels = 0; Pitch = ALSource->flPitch; BufferListItem = ALSource->queue; while(BufferListItem != NULL) @@ -217,6 +114,7 @@ ALvoid CalcNonAttnStereoSourceParams(ALsource *ALSource, const ALCcontext *ALCon ALbuffer *ALBuffer; if((ALBuffer=BufferListItem->buffer) != NULL) { + Channels = aluChannelsFromFormat(ALBuffer->format); Pitch = Pitch * ALBuffer->frequency / Frequency; break; } @@ -247,67 +145,75 @@ ALvoid CalcNonAttnStereoSourceParams(ALsource *ALSource, const ALCcontext *ALCon break; } - for(i = 0;i < OUTPUTCHANNELS;i++) - ALSource->Params.DryGains[i] = 0.0f; - - if(DupStereo == AL_FALSE) + if(Channels == 2) { - ALSource->Params.DryGains[FRONT_LEFT] = DryGain * ListenerGain; - ALSource->Params.DryGains[FRONT_RIGHT] = DryGain * ListenerGain; - } - else - { - switch(Format) + for(i = 0;i < OUTPUTCHANNELS;i++) + ALSource->Params.DryGains[i] = 0.0f; + + if(DupStereo == AL_FALSE) { - case AL_FORMAT_MONO8: - case AL_FORMAT_MONO16: - case AL_FORMAT_MONO_FLOAT32: - case AL_FORMAT_STEREO8: - case AL_FORMAT_STEREO16: - case AL_FORMAT_STEREO_FLOAT32: ALSource->Params.DryGains[FRONT_LEFT] = DryGain * ListenerGain; ALSource->Params.DryGains[FRONT_RIGHT] = DryGain * ListenerGain; - break; + } + else + { + switch(Format) + { + case AL_FORMAT_MONO8: + case AL_FORMAT_MONO16: + case AL_FORMAT_MONO_FLOAT32: + case AL_FORMAT_STEREO8: + case AL_FORMAT_STEREO16: + case AL_FORMAT_STEREO_FLOAT32: + ALSource->Params.DryGains[FRONT_LEFT] = DryGain * ListenerGain; + ALSource->Params.DryGains[FRONT_RIGHT] = DryGain * ListenerGain; + break; - case AL_FORMAT_QUAD8: - case AL_FORMAT_QUAD16: - case AL_FORMAT_QUAD32: - case AL_FORMAT_51CHN8: - case AL_FORMAT_51CHN16: - case AL_FORMAT_51CHN32: - DryGain *= aluSqrt(2.0f/4.0f); - ALSource->Params.DryGains[FRONT_LEFT] = DryGain * ListenerGain; - ALSource->Params.DryGains[FRONT_RIGHT] = DryGain * ListenerGain; - ALSource->Params.DryGains[BACK_LEFT] = DryGain * ListenerGain; - ALSource->Params.DryGains[BACK_RIGHT] = DryGain * ListenerGain; - break; + case AL_FORMAT_QUAD8: + case AL_FORMAT_QUAD16: + case AL_FORMAT_QUAD32: + case AL_FORMAT_51CHN8: + case AL_FORMAT_51CHN16: + case AL_FORMAT_51CHN32: + DryGain *= aluSqrt(2.0f/4.0f); + ALSource->Params.DryGains[FRONT_LEFT] = DryGain * ListenerGain; + ALSource->Params.DryGains[FRONT_RIGHT] = DryGain * ListenerGain; + ALSource->Params.DryGains[BACK_LEFT] = DryGain * ListenerGain; + ALSource->Params.DryGains[BACK_RIGHT] = DryGain * ListenerGain; + break; - case AL_FORMAT_61CHN8: - case AL_FORMAT_61CHN16: - case AL_FORMAT_61CHN32: - DryGain *= aluSqrt(2.0f/4.0f); - ALSource->Params.DryGains[FRONT_LEFT] = DryGain * ListenerGain; - ALSource->Params.DryGains[FRONT_RIGHT] = DryGain * ListenerGain; - ALSource->Params.DryGains[SIDE_LEFT] = DryGain * ListenerGain; - ALSource->Params.DryGains[SIDE_RIGHT] = DryGain * ListenerGain; - break; + case AL_FORMAT_61CHN8: + case AL_FORMAT_61CHN16: + case AL_FORMAT_61CHN32: + DryGain *= aluSqrt(2.0f/4.0f); + ALSource->Params.DryGains[FRONT_LEFT] = DryGain * ListenerGain; + ALSource->Params.DryGains[FRONT_RIGHT] = DryGain * ListenerGain; + ALSource->Params.DryGains[SIDE_LEFT] = DryGain * ListenerGain; + ALSource->Params.DryGains[SIDE_RIGHT] = DryGain * ListenerGain; + break; - case AL_FORMAT_71CHN8: - case AL_FORMAT_71CHN16: - case AL_FORMAT_71CHN32: - DryGain *= aluSqrt(2.0f/6.0f); - ALSource->Params.DryGains[FRONT_LEFT] = DryGain * ListenerGain; - ALSource->Params.DryGains[FRONT_RIGHT] = DryGain * ListenerGain; - ALSource->Params.DryGains[BACK_LEFT] = DryGain * ListenerGain; - ALSource->Params.DryGains[BACK_RIGHT] = DryGain * ListenerGain; - ALSource->Params.DryGains[SIDE_LEFT] = DryGain * ListenerGain; - ALSource->Params.DryGains[SIDE_RIGHT] = DryGain * ListenerGain; - break; + case AL_FORMAT_71CHN8: + case AL_FORMAT_71CHN16: + case AL_FORMAT_71CHN32: + DryGain *= aluSqrt(2.0f/6.0f); + ALSource->Params.DryGains[FRONT_LEFT] = DryGain * ListenerGain; + ALSource->Params.DryGains[FRONT_RIGHT] = DryGain * ListenerGain; + ALSource->Params.DryGains[BACK_LEFT] = DryGain * ListenerGain; + ALSource->Params.DryGains[BACK_RIGHT] = DryGain * ListenerGain; + ALSource->Params.DryGains[SIDE_LEFT] = DryGain * ListenerGain; + ALSource->Params.DryGains[SIDE_RIGHT] = DryGain * ListenerGain; + break; - default: - break; + default: + break; + } } } + else + { + for(i = 0;i < OUTPUTCHANNELS;i++) + ALSource->Params.DryGains[i] = DryGain * ListenerGain; + } for(i = 0;i < NumSends;i++) { diff --git a/OpenAL32/Include/alu.h b/OpenAL32/Include/alu.h index fe2f42ba..c77a0129 100644 --- a/OpenAL32/Include/alu.h +++ b/OpenAL32/Include/alu.h @@ -188,7 +188,6 @@ ALvoid aluInitPanning(ALCdevice *Device); ALvoid CalcSourceParams(struct ALsource *ALSource, const ALCcontext *ALContext); ALvoid CalcNonAttnSourceParams(struct ALsource *ALSource, const ALCcontext *ALContext); -ALvoid CalcNonAttnStereoSourceParams(struct ALsource *ALSource, const ALCcontext *ALContext); ALvoid aluMixData(ALCdevice *device, ALvoid *buffer, ALsizei size); ALvoid aluHandleDisconnect(ALCdevice *device); diff --git a/OpenAL32/alSource.c b/OpenAL32/alSource.c index 7bd92842..1e320e19 100644 --- a/OpenAL32/alSource.c +++ b/OpenAL32/alSource.c @@ -576,8 +576,6 @@ AL_API ALvoid AL_APIENTRY alSourcei(ALuint source,ALenum eParam,ALint lValue) if(aluChannelsFromFormat(buffer->format) == 1) Source->Update = CalcSourceParams; - else if(aluChannelsFromFormat(buffer->format) == 2) - Source->Update = CalcNonAttnStereoSourceParams; else Source->Update = CalcNonAttnSourceParams; @@ -1604,8 +1602,6 @@ AL_API ALvoid AL_APIENTRY alSourceQueueBuffers(ALuint source, ALsizei n, const A Format = buffer->eOriginalFormat; if(aluChannelsFromFormat(buffer->format) == 1) Source->Update = CalcSourceParams; - else if(aluChannelsFromFormat(buffer->format) == 2) - Source->Update = CalcNonAttnStereoSourceParams; else Source->Update = CalcNonAttnSourceParams; Source->NeedsUpdate = AL_TRUE; -- 2.11.4.GIT