text: #ifndef _AL_FILTER_H_
  #define _AL_FILTER_H_
  
  #include "AL/al.h"
  #include "alu.h"
  
  #ifdef __cplusplus
  extern "C" {
  #endif
  
  typedef struct {
      ALfloat coeff;
  #ifndef _MSC_VER
      ALfloat history[0];
  #else
      ALfloat history[1];
  #endif
  } FILTER;
  
  static __inline ALfloat lpFilter4P(FILTER *iir, ALuint offset, ALfloat input)
  {
      ALfloat *history = &iir->history[offset];
      ALfloat a = iir->coeff;
      ALfloat output = input;
  
      output = output + (history[0]-output)*a;
      history[0] = output;
      output = output + (history[1]-output)*a;
      history[1] = output;
      output = output + (history[2]-output)*a;
      history[2] = output;
      output = output + (history[3]-output)*a;
      history[3] = output;
  
      return output;
  }
  
  static __inline ALfloat lpFilter2P(FILTER *iir, ALuint offset, ALfloat input)
  {
      ALfloat *history = &iir->history[offset];
      ALfloat a = iir->coeff;
      ALfloat output = input;
  
      output = output + (history[0]-output)*a;
      history[0] = output;
      output = output + (history[1]-output)*a;
      history[1] = output;
  
      return output;
  }
  
  
  #define AL_FILTER_TYPE                                     0x8001
  
  #define AL_FILTER_NULL                                     0x0000
  #define AL_FILTER_LOWPASS                                  0x0001
  #define AL_FILTER_HIGHPASS                                 0x0002
  #define AL_FILTER_BANDPASS                                 0x0003
  
  #define AL_LOWPASS_GAIN                                    0x0001
  #define AL_LOWPASS_GAINHF                                  0x0002
  
  
  typedef struct ALfilter_struct
  {
      // Filter type (AL_FILTER_NULL, ...)
      ALenum type;
  
      ALfloat Gain;
      ALfloat GainHF;
  
      // Index to itself
      ALuint filter;
  
      struct ALfilter_struct *next;
  } ALfilter;
  
  ALvoid AL_APIENTRY alGenFilters(ALsizei n, ALuint *filters);
  ALvoid AL_APIENTRY alDeleteFilters(ALsizei n, ALuint *filters);
  ALboolean AL_APIENTRY alIsFilter(ALuint filter);
  
  ALvoid AL_APIENTRY alFilteri(ALuint filter, ALenum param, ALint iValue);
  ALvoid AL_APIENTRY alFilteriv(ALuint filter, ALenum param, ALint *piValues);
  ALvoid AL_APIENTRY alFilterf(ALuint filter, ALenum param, ALfloat flValue);
  ALvoid AL_APIENTRY alFilterfv(ALuint filter, ALenum param, ALfloat *pflValues);
  
  ALvoid AL_APIENTRY alGetFilteri(ALuint filter, ALenum param, ALint *piValue);
  ALvoid AL_APIENTRY alGetFilteriv(ALuint filter, ALenum param, ALint *piValues);
  ALvoid AL_APIENTRY alGetFilterf(ALuint filter, ALenum param, ALfloat *pflValue);
  ALvoid AL_APIENTRY alGetFilterfv(ALuint filter, ALenum param, ALfloat *pflValues);
  
  ALvoid ReleaseALFilters(ALvoid);
  
  #ifdef __cplusplus
  }
  #endif
  
  #endif
  