aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Robinson <[email protected]>2011-08-31 02:18:16 -0700
committerChris Robinson <[email protected]>2011-08-31 02:18:16 -0700
commitb28f48c1bdf343ecc0a3e1dbed958b13fbba32e7 (patch)
tree36949865561b5f06b0d39569e47b807d94e9931d
parent49e2fa428fced4d2ab1e390ad3397dd9e11df960 (diff)
Store the filter gains directly in the source instead of duplicate filter objects
-rw-r--r--Alc/ALc.c4
-rw-r--r--Alc/ALu.c44
-rw-r--r--OpenAL32/Include/alSource.h6
-rw-r--r--OpenAL32/alSource.c32
4 files changed, 38 insertions, 48 deletions
diff --git a/Alc/ALc.c b/Alc/ALc.c
index 886a38b0..deeab0dd 100644
--- a/Alc/ALc.c
+++ b/Alc/ALc.c
@@ -1267,8 +1267,8 @@ static ALCboolean UpdateDeviceParams(ALCdevice *device, const ALCint *attrList)
if(source->Send[s].Slot)
DecrementRef(&source->Send[s].Slot->ref);
source->Send[s].Slot = NULL;
- source->Send[s].WetFilter.type = 0;
- source->Send[s].WetFilter.filter = 0;
+ source->Send[s].WetGain = 1.0f;
+ source->Send[s].WetGainHF = 1.0f;
s++;
}
source->NeedsUpdate = AL_FALSE;
diff --git a/Alc/ALu.c b/Alc/ALu.c
index f2658da7..1819c80e 100644
--- a/Alc/ALu.c
+++ b/Alc/ALu.c
@@ -182,26 +182,14 @@ ALvoid CalcNonAttnSourceParams(ALsource *ALSource, const ALCcontext *ALContext)
}
/* Calculate gains */
- DryGain = clampf(SourceVolume, MinVolume, MaxVolume);
- DryGainHF = 1.0f;
- switch(ALSource->DirectFilter.type)
- {
- case AL_FILTER_LOWPASS:
- DryGain *= ALSource->DirectFilter.Gain;
- DryGainHF *= ALSource->DirectFilter.GainHF;
- break;
- }
+ DryGain = clampf(SourceVolume, MinVolume, MaxVolume);
+ DryGain *= ALSource->DirectGain;
+ DryGainHF = ALSource->DirectGainHF;
for(i = 0;i < NumSends;i++)
{
- WetGain[i] = clampf(SourceVolume, MinVolume, MaxVolume);
- 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;
- }
+ WetGain[i] = clampf(SourceVolume, MinVolume, MaxVolume);
+ WetGain[i] *= ALSource->Send[i].WetGain;
+ WetGainHF[i] = WetGainHF[i] *= ALSource->Send[i].WetGainHF;
}
SrcMatrix = ALSource->Params.DryGains;
@@ -610,24 +598,12 @@ ALvoid CalcSourceParams(ALsource *ALSource, const ALCcontext *ALContext)
WetGain[i] = clampf(WetGain[i], MinVolume, MaxVolume);
// Apply filter gains and filters
- switch(ALSource->DirectFilter.type)
- {
- case AL_FILTER_LOWPASS:
- DryGain *= ALSource->DirectFilter.Gain;
- DryGainHF *= ALSource->DirectFilter.GainHF;
- break;
- }
- DryGain *= ListenerGain;
+ DryGain *= ALSource->DirectGain * ListenerGain;
+ DryGainHF *= ALSource->DirectGainHF;
for(i = 0;i < NumSends;i++)
{
- 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;
- }
- WetGain[i] *= ListenerGain;
+ WetGain[i] *= ALSource->Send[i].WetGain * ListenerGain;
+ WetGainHF[i] *= ALSource->Send[i].WetGainHF;
}
if(WetGainAuto)
diff --git a/OpenAL32/Include/alSource.h b/OpenAL32/Include/alSource.h
index 5f2ba610..920de683 100644
--- a/OpenAL32/Include/alSource.h
+++ b/OpenAL32/Include/alSource.h
@@ -59,11 +59,13 @@ typedef struct ALsource
ALuint BuffersInQueue; // Number of buffers in queue
ALuint BuffersPlayed; // Number of buffers played on this loop
- ALfilter DirectFilter;
+ ALfloat DirectGain;
+ ALfloat DirectGainHF;
struct {
struct ALeffectslot *Slot;
- ALfilter WetFilter;
+ ALfloat WetGain;
+ ALfloat WetGainHF;
} Send[MAX_SENDS];
ALboolean DryGainHFAuto;
diff --git a/OpenAL32/alSource.c b/OpenAL32/alSource.c
index 93000472..271d7e44 100644
--- a/OpenAL32/alSource.c
+++ b/OpenAL32/alSource.c
@@ -653,11 +653,14 @@ AL_API ALvoid AL_APIENTRY alSourcei(ALuint source,ALenum eParam,ALint lValue)
{
if(!filter)
{
- Source->DirectFilter.type = AL_FILTER_NULL;
- Source->DirectFilter.filter = 0;
+ Source->DirectGain = 1.0f;
+ Source->DirectGainHF = 1.0f;
}
else
- memcpy(&Source->DirectFilter, filter, sizeof(*filter));
+ {
+ Source->DirectGain = filter->Gain;
+ Source->DirectGainHF = filter->GainHF;
+ }
Source->NeedsUpdate = AL_TRUE;
}
else
@@ -777,11 +780,14 @@ AL_API void AL_APIENTRY alSource3i(ALuint source, ALenum eParam, ALint lValue1,
if(!ALFilter)
{
/* Disable filter */
- Source->Send[lValue2].WetFilter.type = 0;
- Source->Send[lValue2].WetFilter.filter = 0;
+ Source->Send[lValue2].WetGain = 1.0f;
+ Source->Send[lValue2].WetGainHF = 1.0f;
}
else
- memcpy(&Source->Send[lValue2].WetFilter, ALFilter, sizeof(*ALFilter));
+ {
+ Source->Send[lValue2].WetGain = ALFilter->Gain;
+ Source->Send[lValue2].WetGainHF = ALFilter->GainHF;
+ }
Source->NeedsUpdate = AL_TRUE;
}
else
@@ -1166,10 +1172,6 @@ AL_API ALvoid AL_APIENTRY alGetSourcei(ALuint source, ALenum eParam, ALint *plVa
*plValue = (ALint)Offsets[0];
break;
- case AL_DIRECT_FILTER:
- *plValue = Source->DirectFilter.filter;
- break;
-
case AL_DIRECT_FILTER_GAINHF_AUTO:
*plValue = Source->DryGainHFAuto;
break;
@@ -1741,6 +1743,8 @@ done:
static ALvoid InitSourceParams(ALsource *Source)
{
+ ALuint i;
+
Source->flInnerAngle = 360.0f;
Source->flOuterAngle = 360.0f;
Source->flPitch = 1.0f;
@@ -1780,6 +1784,14 @@ static ALvoid InitSourceParams(ALsource *Source)
Source->lSourceType = AL_UNDETERMINED;
Source->lOffset = -1;
+ Source->DirectGain = 1.0f;
+ Source->DirectGainHF = 1.0f;
+ for(i = 0;i < MAX_SENDS;i++)
+ {
+ Source->Send[i].WetGain = 1.0f;
+ Source->Send[i].WetGainHF = 1.0f;
+ }
+
Source->NeedsUpdate = AL_TRUE;
Source->HrtfMoving = AL_FALSE;