diff options
-rw-r--r-- | Alc/mixer.c | 4 | ||||
-rw-r--r-- | OpenAL32/Include/alFilter.h | 2 | ||||
-rw-r--r-- | OpenAL32/alFilter.c | 18 |
3 files changed, 24 insertions, 0 deletions
diff --git a/Alc/mixer.c b/Alc/mixer.c index e8b94b17..4917477a 100644 --- a/Alc/mixer.c +++ b/Alc/mixer.c @@ -260,12 +260,16 @@ static const ALfloat *DoFilters(ALfilterState *lpfilter, ALfilterState *hpfilter switch(type) { case AF_None: + ALfilterState_processPassthru(lpfilter, src, numsamples); + ALfilterState_processPassthru(hpfilter, src, numsamples); break; case AF_LowPass: ALfilterState_process(lpfilter, dst, src, numsamples); + ALfilterState_processPassthru(hpfilter, dst, numsamples); return dst; case AF_HighPass: + ALfilterState_processPassthru(lpfilter, src, numsamples); ALfilterState_process(hpfilter, dst, src, numsamples); return dst; diff --git a/OpenAL32/Include/alFilter.h b/OpenAL32/Include/alFilter.h index 62b5fda8..9772f432 100644 --- a/OpenAL32/Include/alFilter.h +++ b/OpenAL32/Include/alFilter.h @@ -63,6 +63,8 @@ inline ALfloat ALfilterState_processSingle(ALfilterState *filter, ALfloat sample void ALfilterState_processC(ALfilterState *filter, ALfloat *restrict dst, const ALfloat *src, ALuint numsamples); +void ALfilterState_processPassthru(ALfilterState *filter, const ALfloat *src, ALuint numsamples); + typedef struct ALfilter { // Filter type (AL_FILTER_NULL, ...) diff --git a/OpenAL32/alFilter.c b/OpenAL32/alFilter.c index f2538818..bced3a7f 100644 --- a/OpenAL32/alFilter.c +++ b/OpenAL32/alFilter.c @@ -420,6 +420,24 @@ void ALfilterState_setParams(ALfilterState *filter, ALfilterType type, ALfloat g filter->process = ALfilterState_processC; } +void ALfilterState_processPassthru(ALfilterState *filter, const ALfloat *src, ALuint numsamples) +{ + if(numsamples >= 2) + { + filter->x[1] = src[numsamples-2]; + filter->x[0] = src[numsamples-1]; + filter->y[1] = src[numsamples-2]; + filter->y[0] = src[numsamples-1]; + } + else if(numsamples == 1) + { + filter->x[1] = filter->x[0]; + filter->x[0] = src[0]; + filter->y[1] = filter->y[0]; + filter->y[0] = src[0]; + } +} + static void lp_SetParami(ALfilter *UNUSED(filter), ALCcontext *context, ALenum UNUSED(param), ALint UNUSED(val)) { SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); } |