aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Alc/ALc.c5
-rw-r--r--OpenAL32/Include/alFilter.h3
-rw-r--r--OpenAL32/alFilter.c76
3 files changed, 82 insertions, 2 deletions
diff --git a/Alc/ALc.c b/Alc/ALc.c
index 974ba6fa..99be73f8 100644
--- a/Alc/ALc.c
+++ b/Alc/ALc.c
@@ -565,14 +565,17 @@ static const ALCenums enumeration[] = {
DECL(AL_FILTER_TYPE),
DECL(AL_FILTER_NULL),
DECL(AL_FILTER_LOWPASS),
-#if 0
DECL(AL_FILTER_HIGHPASS),
+#if 0
DECL(AL_FILTER_BANDPASS),
#endif
DECL(AL_LOWPASS_GAIN),
DECL(AL_LOWPASS_GAINHF),
+ DECL(AL_HIGHPASS_GAIN),
+ DECL(AL_HIGHPASS_GAINLF),
+
DECL(AL_EFFECT_TYPE),
DECL(AL_EFFECT_NULL),
DECL(AL_EFFECT_REVERB),
diff --git a/OpenAL32/Include/alFilter.h b/OpenAL32/Include/alFilter.h
index 86547182..0b3ab844 100644
--- a/OpenAL32/Include/alFilter.h
+++ b/OpenAL32/Include/alFilter.h
@@ -8,6 +8,7 @@ extern "C" {
#endif
#define LOWPASSFREQREF (5000.0f)
+#define HIGHPASSFREQREF (250.0f)
/* Filters implementation is based on the "Cookbook formulae for audio *
@@ -65,6 +66,8 @@ typedef struct ALfilter {
ALfloat Gain;
ALfloat GainHF;
ALfloat HFReference;
+ ALfloat GainLF;
+ ALfloat LFReference;
void (*SetParami)(struct ALfilter *filter, ALCcontext *context, ALenum param, ALint val);
void (*SetParamiv)(struct ALfilter *filter, ALCcontext *context, ALenum param, const ALint *vals);
diff --git a/OpenAL32/alFilter.c b/OpenAL32/alFilter.c
index ade41f4c..154c167e 100644
--- a/OpenAL32/alFilter.c
+++ b/OpenAL32/alFilter.c
@@ -145,7 +145,7 @@ AL_API ALvoid AL_APIENTRY alFilteri(ALuint filter, ALenum param, ALint value)
{
if(param == AL_FILTER_TYPE)
{
- if(value == AL_FILTER_NULL || value == AL_FILTER_LOWPASS)
+ if(value == AL_FILTER_NULL || value == AL_FILTER_LOWPASS || value == AL_FILTER_HIGHPASS)
InitFilterParams(ALFilter, value);
else
alSetError(Context, AL_INVALID_VALUE);
@@ -469,6 +469,61 @@ static void lp_GetParamfv(ALfilter *filter, ALCcontext *context, ALenum param, A
}
+static void hp_SetParami(ALfilter *UNUSED(filter), ALCcontext *context, ALenum UNUSED(param), ALint UNUSED(val))
+{ SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); }
+static void hp_SetParamiv(ALfilter *UNUSED(filter), ALCcontext *context, ALenum UNUSED(param), const ALint *UNUSED(vals))
+{ SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); }
+static void hp_SetParamf(ALfilter *filter, ALCcontext *context, ALenum param, ALfloat val)
+{
+ switch(param)
+ {
+ case AL_HIGHPASS_GAIN:
+ if(!(val >= AL_HIGHPASS_MIN_GAIN && val <= AL_HIGHPASS_MAX_GAIN))
+ SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+ filter->Gain = val;
+ break;
+
+ case AL_HIGHPASS_GAINLF:
+ if(!(val >= AL_HIGHPASS_MIN_GAINLF && val <= AL_HIGHPASS_MAX_GAINLF))
+ SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+ filter->GainLF = val;
+ break;
+
+ default:
+ SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM);
+ }
+}
+static void hp_SetParamfv(ALfilter *filter, ALCcontext *context, ALenum param, const ALfloat *vals)
+{
+ hp_SetParamf(filter, context, param, vals[0]);
+}
+
+static void hp_GetParami(ALfilter *UNUSED(filter), ALCcontext *context, ALenum UNUSED(param), ALint *UNUSED(val))
+{ SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); }
+static void hp_GetParamiv(ALfilter *UNUSED(filter), ALCcontext *context, ALenum UNUSED(param), ALint *UNUSED(vals))
+{ SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); }
+static void hp_GetParamf(ALfilter *filter, ALCcontext *context, ALenum param, ALfloat *val)
+{
+ switch(param)
+ {
+ case AL_HIGHPASS_GAIN:
+ *val = filter->Gain;
+ break;
+
+ case AL_HIGHPASS_GAINLF:
+ *val = filter->GainLF;
+ break;
+
+ default:
+ SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM);
+ }
+}
+static void hp_GetParamfv(ALfilter *filter, ALCcontext *context, ALenum param, ALfloat *vals)
+{
+ hp_GetParamf(filter, context, param, vals);
+}
+
+
static void null_SetParami(ALfilter *UNUSED(filter), ALCcontext *context, ALenum UNUSED(param), ALint UNUSED(val))
{ SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); }
static void null_SetParamiv(ALfilter *UNUSED(filter), ALCcontext *context, ALenum UNUSED(param), const ALint *UNUSED(vals))
@@ -511,6 +566,8 @@ static void InitFilterParams(ALfilter *filter, ALenum type)
filter->Gain = AL_LOWPASS_DEFAULT_GAIN;
filter->GainHF = AL_LOWPASS_DEFAULT_GAINHF;
filter->HFReference = LOWPASSFREQREF;
+ filter->GainLF = 1.0f;
+ filter->LFReference = HIGHPASSFREQREF;
filter->SetParami = lp_SetParami;
filter->SetParamiv = lp_SetParamiv;
@@ -521,6 +578,23 @@ static void InitFilterParams(ALfilter *filter, ALenum type)
filter->GetParamf = lp_GetParamf;
filter->GetParamfv = lp_GetParamfv;
}
+ else if(type == AL_FILTER_HIGHPASS)
+ {
+ filter->Gain = AL_HIGHPASS_DEFAULT_GAIN;
+ filter->GainHF = 1.0f;
+ filter->HFReference = LOWPASSFREQREF;
+ filter->GainLF = AL_HIGHPASS_DEFAULT_GAINLF;
+ filter->LFReference = HIGHPASSFREQREF;
+
+ filter->SetParami = hp_SetParami;
+ filter->SetParamiv = hp_SetParamiv;
+ filter->SetParamf = hp_SetParamf;
+ filter->SetParamfv = hp_SetParamfv;
+ filter->GetParami = hp_GetParami;
+ filter->GetParamiv = hp_GetParamiv;
+ filter->GetParamf = hp_GetParamf;
+ filter->GetParamfv = hp_GetParamfv;
+ }
else
{
filter->SetParami = null_SetParami;