rlm@0: #ifndef _AL_FILTER_H_ rlm@0: #define _AL_FILTER_H_ rlm@0: rlm@0: #include "AL/al.h" rlm@0: #include "alu.h" rlm@0: rlm@0: #ifdef __cplusplus rlm@0: extern "C" { rlm@0: #endif rlm@0: rlm@0: typedef struct { rlm@0: ALfloat coeff; rlm@0: #ifndef _MSC_VER rlm@0: ALfloat history[0]; rlm@0: #else rlm@0: ALfloat history[1]; rlm@0: #endif rlm@0: } FILTER; rlm@0: rlm@0: static __inline ALfloat lpFilter2P(FILTER *iir, ALuint offset, ALfloat input) rlm@0: { rlm@0: ALfloat *history = &iir->history[offset*2]; rlm@0: ALfloat a = iir->coeff; rlm@0: ALfloat output = input; rlm@0: rlm@0: output = output + (history[0]-output)*a; rlm@0: history[0] = output; rlm@0: output = output + (history[1]-output)*a; rlm@0: history[1] = output; rlm@0: rlm@0: return output; rlm@0: } rlm@0: static __inline ALfloat lpFilter1P(FILTER *iir, ALuint offset, ALfloat input) rlm@0: { rlm@0: ALfloat *history = &iir->history[offset]; rlm@0: ALfloat a = iir->coeff; rlm@0: ALfloat output = input; rlm@0: rlm@0: output = output + (history[0]-output)*a; rlm@0: history[0] = output; rlm@0: rlm@0: return output; rlm@0: } rlm@0: rlm@0: static __inline ALfloat lpFilter2PC(const FILTER *iir, ALuint offset, ALfloat input) rlm@0: { rlm@0: const ALfloat *history = &iir->history[offset*2]; rlm@0: ALfloat a = iir->coeff; rlm@0: ALfloat output = input; rlm@0: rlm@0: output = output + (history[0]-output)*a; rlm@0: output = output + (history[1]-output)*a; rlm@0: rlm@0: return output; rlm@0: } rlm@0: static __inline ALfloat lpFilter1PC(FILTER *iir, ALuint offset, ALfloat input) rlm@0: { rlm@0: const ALfloat *history = &iir->history[offset]; rlm@0: ALfloat a = iir->coeff; rlm@0: ALfloat output = input; rlm@0: rlm@0: output = output + (history[0]-output)*a; rlm@0: rlm@0: return output; rlm@0: } rlm@0: rlm@0: /* Calculates the low-pass filter coefficient given the pre-scaled gain and rlm@0: * cos(w) value. Note that g should be pre-scaled (sqr(gain) for one-pole, rlm@0: * sqrt(gain) for four-pole, etc) */ rlm@0: ALfloat lpCoeffCalc(ALfloat g, ALfloat cw); rlm@0: rlm@0: rlm@0: typedef struct ALfilter rlm@0: { rlm@0: // Filter type (AL_FILTER_NULL, ...) rlm@0: ALenum type; rlm@0: rlm@0: ALfloat Gain; rlm@0: ALfloat GainHF; rlm@0: rlm@0: // Index to itself rlm@0: ALuint filter; rlm@0: } ALfilter; rlm@0: rlm@0: rlm@0: ALvoid ReleaseALFilters(ALCdevice *device); rlm@0: rlm@0: #ifdef __cplusplus rlm@0: } rlm@0: #endif rlm@0: rlm@0: #endif