Constify some variables
[openal-soft.git] / OpenAL32 / Include / alFilter.h
blobef852d13822411ccfbcadc89082f34266f4e4007
1 #ifndef _AL_FILTER_H_
2 #define _AL_FILTER_H_
4 #include "AL/al.h"
5 #include "alu.h"
7 #ifdef __cplusplus
8 extern "C" {
9 #endif
11 typedef struct {
12 ALfloat coeff;
13 #ifndef _MSC_VER
14 ALfloat history[0];
15 #else
16 ALfloat history[1];
17 #endif
18 } FILTER;
20 static __inline ALfloat lpFilter4P(FILTER *iir, ALuint offset, ALfloat input)
22 ALfloat *history = &iir->history[offset];
23 ALfloat a = iir->coeff;
24 ALfloat output = input;
26 output = output + (history[0]-output)*a;
27 history[0] = output;
28 output = output + (history[1]-output)*a;
29 history[1] = output;
30 output = output + (history[2]-output)*a;
31 history[2] = output;
32 output = output + (history[3]-output)*a;
33 history[3] = output;
35 return output;
38 static __inline ALfloat lpFilter2P(FILTER *iir, ALuint offset, ALfloat input)
40 ALfloat *history = &iir->history[offset];
41 ALfloat a = iir->coeff;
42 ALfloat output = input;
44 output = output + (history[0]-output)*a;
45 history[0] = output;
46 output = output + (history[1]-output)*a;
47 history[1] = output;
49 return output;
52 static __inline ALfloat lpFilter1P(FILTER *iir, ALuint offset, ALfloat input)
54 ALfloat *history = &iir->history[offset];
55 ALfloat a = iir->coeff;
56 ALfloat output = input;
58 output = output + (history[0]-output)*a;
59 history[0] = output;
61 return output;
64 static __inline ALfloat lpFilter4PC(const FILTER *iir, ALuint offset, ALfloat input)
66 const ALfloat *history = &iir->history[offset];
67 ALfloat a = iir->coeff;
68 ALfloat output = input;
70 output = output + (history[0]-output)*a;
71 output = output + (history[1]-output)*a;
72 output = output + (history[2]-output)*a;
73 output = output + (history[3]-output)*a;
75 return output;
78 static __inline ALfloat lpFilter2PC(const FILTER *iir, ALuint offset, ALfloat input)
80 const ALfloat *history = &iir->history[offset];
81 ALfloat a = iir->coeff;
82 ALfloat output = input;
84 output = output + (history[0]-output)*a;
85 output = output + (history[1]-output)*a;
87 return output;
90 static __inline ALfloat lpFilter1PC(FILTER *iir, ALuint offset, ALfloat input)
92 const ALfloat *history = &iir->history[offset];
93 ALfloat a = iir->coeff;
94 ALfloat output = input;
96 output = output + (history[0]-output)*a;
98 return output;
101 /* Calculates the low-pass filter coefficient given the pre-scaled gain and
102 * cos(w) value. Note that g should be pre-scaled (sqr(gain) for one-pole,
103 * sqrt(gain) for four-pole, etc) */
104 static __inline ALfloat lpCoeffCalc(ALfloat g, ALfloat cw)
106 ALfloat a = 0.0f;
108 /* Be careful with gains < 0.01, as that causes the coefficient
109 * head towards 1, which will flatten the signal */
110 g = __max(g, 0.01f);
111 if(g < 0.9999f) /* 1-epsilon */
112 a = (1 - g*cw - aluSqrt(2*g*(1-cw) - g*g*(1 - cw*cw))) /
113 (1 - g);
115 return a;
119 typedef struct ALfilter
121 // Filter type (AL_FILTER_NULL, ...)
122 ALenum type;
124 ALfloat Gain;
125 ALfloat GainHF;
127 // Index to itself
128 ALuint filter;
129 } ALfilter;
132 ALvoid ReleaseALFilters(ALCdevice *device);
134 #ifdef __cplusplus
136 #endif
138 #endif