zenilib  0.5.3.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
alFilter.c
Go to the documentation of this file.
1 
21 #include "config.h"
22 
23 #include <stdlib.h>
24 
25 #include "alMain.h"
26 #include "alu.h"
27 #include "alFilter.h"
28 #include "alThunk.h"
29 #include "alError.h"
30 
31 
33 
34 
36 {
37  ALCcontext *Context;
38  ALsizei cur = 0;
39 
40  Context = GetContextRef();
41  if(!Context) return;
42 
43  al_try
44  {
45  ALCdevice *device = Context->Device;
46  ALenum err;
47 
48  CHECK_VALUE(Context, n >= 0);
49  for(cur = 0;cur < n;cur++)
50  {
51  ALfilter *filter = calloc(1, sizeof(ALfilter));
52  if(!filter)
53  al_throwerr(Context, AL_OUT_OF_MEMORY);
55 
56  err = NewThunkEntry(&filter->id);
57  if(err == AL_NO_ERROR)
58  err = InsertUIntMapEntry(&device->FilterMap, filter->id, filter);
59  if(err != AL_NO_ERROR)
60  {
61  FreeThunkEntry(filter->id);
62  memset(filter, 0, sizeof(ALfilter));
63  free(filter);
64 
65  al_throwerr(Context, err);
66  }
67 
68  filters[cur] = filter->id;
69  }
70  }
71  al_catchany()
72  {
73  if(cur > 0)
74  alDeleteFilters(cur, filters);
75  }
76  al_endtry;
77 
78  ALCcontext_DecRef(Context);
79 }
80 
82 {
83  ALCcontext *Context;
84  ALfilter *Filter;
85  ALsizei i;
86 
87  Context = GetContextRef();
88  if(!Context) return;
89 
90  al_try
91  {
92  ALCdevice *device = Context->Device;
93  CHECK_VALUE(Context, n >= 0);
94  for(i = 0;i < n;i++)
95  {
96  if(filters[i] && LookupFilter(device, filters[i]) == NULL)
97  al_throwerr(Context, AL_INVALID_NAME);
98  }
99 
100  for(i = 0;i < n;i++)
101  {
102  if((Filter=RemoveFilter(device, filters[i])) == NULL)
103  continue;
104  FreeThunkEntry(Filter->id);
105 
106  memset(Filter, 0, sizeof(*Filter));
107  free(Filter);
108  }
109  }
110  al_endtry;
111 
112  ALCcontext_DecRef(Context);
113 }
114 
116 {
117  ALCcontext *Context;
119 
120  Context = GetContextRef();
121  if(!Context) return AL_FALSE;
122 
123  result = ((!filter || LookupFilter(Context->Device, filter)) ?
124  AL_TRUE : AL_FALSE);
125 
126  ALCcontext_DecRef(Context);
127 
128  return result;
129 }
130 
132 {
133  ALCcontext *Context;
134  ALCdevice *Device;
135  ALfilter *ALFilter;
136 
137  Context = GetContextRef();
138  if(!Context) return;
139 
140  Device = Context->Device;
141  if((ALFilter=LookupFilter(Device, filter)) == NULL)
142  alSetError(Context, AL_INVALID_NAME);
143  else
144  {
145  if(param == AL_FILTER_TYPE)
146  {
147  if(value == AL_FILTER_NULL || value == AL_FILTER_LOWPASS)
148  InitFilterParams(ALFilter, value);
149  else
150  alSetError(Context, AL_INVALID_VALUE);
151  }
152  else
153  {
154  /* Call the appropriate handler */
155  ALfilter_SetParami(ALFilter, Context, param, value);
156  }
157  }
158 
159  ALCcontext_DecRef(Context);
160 }
161 
163 {
164  ALCcontext *Context;
165  ALCdevice *Device;
166  ALfilter *ALFilter;
167 
168  switch(param)
169  {
170  case AL_FILTER_TYPE:
171  alFilteri(filter, param, values[0]);
172  return;
173  }
174 
175  Context = GetContextRef();
176  if(!Context) return;
177 
178  Device = Context->Device;
179  if((ALFilter=LookupFilter(Device, filter)) == NULL)
180  alSetError(Context, AL_INVALID_NAME);
181  else
182  {
183  /* Call the appropriate handler */
184  ALfilter_SetParamiv(ALFilter, Context, param, values);
185  }
186 
187  ALCcontext_DecRef(Context);
188 }
189 
191 {
192  ALCcontext *Context;
193  ALCdevice *Device;
194  ALfilter *ALFilter;
195 
196  Context = GetContextRef();
197  if(!Context) return;
198 
199  Device = Context->Device;
200  if((ALFilter=LookupFilter(Device, filter)) == NULL)
201  alSetError(Context, AL_INVALID_NAME);
202  else
203  {
204  /* Call the appropriate handler */
205  ALfilter_SetParamf(ALFilter, Context, param, value);
206  }
207 
208  ALCcontext_DecRef(Context);
209 }
210 
212 {
213  ALCcontext *Context;
214  ALCdevice *Device;
215  ALfilter *ALFilter;
216 
217  Context = GetContextRef();
218  if(!Context) return;
219 
220  Device = Context->Device;
221  if((ALFilter=LookupFilter(Device, filter)) == NULL)
222  alSetError(Context, AL_INVALID_NAME);
223  else
224  {
225  /* Call the appropriate handler */
226  ALfilter_SetParamfv(ALFilter, Context, param, values);
227  }
228 
229  ALCcontext_DecRef(Context);
230 }
231 
233 {
234  ALCcontext *Context;
235  ALCdevice *Device;
236  ALfilter *ALFilter;
237 
238  Context = GetContextRef();
239  if(!Context) return;
240 
241  Device = Context->Device;
242  if((ALFilter=LookupFilter(Device, filter)) == NULL)
243  alSetError(Context, AL_INVALID_NAME);
244  else
245  {
246  if(param == AL_FILTER_TYPE)
247  *value = ALFilter->type;
248  else
249  {
250  /* Call the appropriate handler */
251  ALfilter_GetParami(ALFilter, Context, param, value);
252  }
253  }
254 
255  ALCcontext_DecRef(Context);
256 }
257 
259 {
260  ALCcontext *Context;
261  ALCdevice *Device;
262  ALfilter *ALFilter;
263 
264  switch(param)
265  {
266  case AL_FILTER_TYPE:
267  alGetFilteri(filter, param, values);
268  return;
269  }
270 
271  Context = GetContextRef();
272  if(!Context) return;
273 
274  Device = Context->Device;
275  if((ALFilter=LookupFilter(Device, filter)) == NULL)
276  alSetError(Context, AL_INVALID_NAME);
277  else
278  {
279  /* Call the appropriate handler */
280  ALfilter_GetParamiv(ALFilter, Context, param, values);
281  }
282 
283  ALCcontext_DecRef(Context);
284 }
285 
287 {
288  ALCcontext *Context;
289  ALCdevice *Device;
290  ALfilter *ALFilter;
291 
292  Context = GetContextRef();
293  if(!Context) return;
294 
295  Device = Context->Device;
296  if((ALFilter=LookupFilter(Device, filter)) == NULL)
297  alSetError(Context, AL_INVALID_NAME);
298  else
299  {
300  /* Call the appropriate handler */
301  ALfilter_GetParamf(ALFilter, Context, param, value);
302  }
303 
304  ALCcontext_DecRef(Context);
305 }
306 
308 {
309  ALCcontext *Context;
310  ALCdevice *Device;
311  ALfilter *ALFilter;
312 
313  Context = GetContextRef();
314  if(!Context) return;
315 
316  Device = Context->Device;
317  if((ALFilter=LookupFilter(Device, filter)) == NULL)
318  alSetError(Context, AL_INVALID_NAME);
319  else
320  {
321  /* Call the appropriate handler */
322  ALfilter_GetParamfv(ALFilter, Context, param, values);
323  }
324 
325  ALCcontext_DecRef(Context);
326 }
327 
328 
330 {
331  ALfloat a = 0.0f;
332 
333  if(g < 0.9999f) /* 1-epsilon */
334  {
335  /* Be careful with gains < 0.001, as that causes the coefficient head
336  * towards 1, which will flatten the signal */
337  g = maxf(g, 0.001f);
338  a = (1 - g*cw - sqrtf(2*g*(1-cw) - g*g*(1 - cw*cw))) /
339  (1 - g);
340  }
341 
342  return a;
343 }
344 
345 
347 { (void)filter;(void)param;(void)val; alSetError(context, AL_INVALID_ENUM); }
349 { (void)filter;(void)param;(void)vals; alSetError(context, AL_INVALID_ENUM); }
351 {
352  switch(param)
353  {
354  case AL_LOWPASS_GAIN:
355  if(val >= AL_LOWPASS_MIN_GAIN && val <= AL_LOWPASS_MAX_GAIN)
356  filter->Gain = val;
357  else
358  alSetError(context, AL_INVALID_VALUE);
359  break;
360 
361  case AL_LOWPASS_GAINHF:
362  if(val >= AL_LOWPASS_MIN_GAINHF && val <= AL_LOWPASS_MAX_GAINHF)
363  filter->GainHF = val;
364  else
365  alSetError(context, AL_INVALID_VALUE);
366  break;
367 
368  default:
369  alSetError(context, AL_INVALID_ENUM);
370  break;
371  }
372 }
374 {
375  lp_SetParamf(filter, context, param, vals[0]);
376 }
377 
379 { (void)filter;(void)param;(void)val; alSetError(context, AL_INVALID_ENUM); }
381 { (void)filter;(void)param;(void)vals; alSetError(context, AL_INVALID_ENUM); }
383 {
384  switch(param)
385  {
386  case AL_LOWPASS_GAIN:
387  *val = filter->Gain;
388  break;
389 
390  case AL_LOWPASS_GAINHF:
391  *val = filter->GainHF;
392  break;
393 
394  default:
395  alSetError(context, AL_INVALID_ENUM);
396  break;
397  }
398 }
400 {
401  lp_GetParamf(filter, context, param, vals);
402 }
403 
404 
406 { (void)filter;(void)param;(void)val; alSetError(context, AL_INVALID_ENUM); }
408 { (void)filter;(void)param;(void)vals; alSetError(context, AL_INVALID_ENUM); }
410 { (void)filter;(void)param;(void)val; alSetError(context, AL_INVALID_ENUM); }
412 { (void)filter;(void)param;(void)vals; alSetError(context, AL_INVALID_ENUM); }
413 
415 { (void)filter;(void)param;(void)val; alSetError(context, AL_INVALID_ENUM); }
417 { (void)filter;(void)param;(void)vals; alSetError(context, AL_INVALID_ENUM); }
419 { (void)filter;(void)param;(void)val; alSetError(context, AL_INVALID_ENUM); }
421 { (void)filter;(void)param;(void)vals; alSetError(context, AL_INVALID_ENUM); }
422 
423 
425 {
426  ALsizei i;
427  for(i = 0;i < device->FilterMap.size;i++)
428  {
429  ALfilter *temp = device->FilterMap.array[i].value;
430  device->FilterMap.array[i].value = NULL;
431 
432  // Release filter structure
433  FreeThunkEntry(temp->id);
434  memset(temp, 0, sizeof(ALfilter));
435  free(temp);
436  }
437 }
438 
439 
441 {
442  if(type == AL_FILTER_LOWPASS)
443  {
444  filter->Gain = AL_LOWPASS_DEFAULT_GAIN;
446 
447  filter->SetParami = lp_SetParami;
448  filter->SetParamiv = lp_SetParamiv;
449  filter->SetParamf = lp_SetParamf;
450  filter->SetParamfv = lp_SetParamfv;
451  filter->GetParami = lp_GetParami;
452  filter->GetParamiv = lp_GetParamiv;
453  filter->GetParamf = lp_GetParamf;
454  filter->GetParamfv = lp_GetParamfv;
455  }
456  else
457  {
458  filter->SetParami = null_SetParami;
459  filter->SetParamiv = null_SetParamiv;
460  filter->SetParamf = null_SetParamf;
461  filter->SetParamfv = null_SetParamfv;
462  filter->GetParami = null_GetParami;
463  filter->GetParamiv = null_GetParamiv;
464  filter->GetParamf = null_GetParamf;
465  filter->GetParamfv = null_GetParamfv;
466  }
467  filter->type = type;
468 }
static void null_SetParamiv(ALfilter *filter, ALCcontext *context, ALenum param, const ALint *vals)
Definition: alFilter.c:407
#define AL_APIENTRY
Definition: al.h:21
#define LookupFilter(m, k)
Definition: alMain.h:669
UIntMap FilterMap
Definition: alMain.h:595
void FreeThunkEntry(ALuint index)
Definition: alThunk.c:83
GLuint const GLfloat * val
Definition: glew.h:2715
AL_API ALboolean AL_APIENTRY alIsFilter(ALuint filter)
Definition: alFilter.c:115
AL_API ALvoid AL_APIENTRY alFilteri(ALuint filter, ALenum param, ALint value)
Definition: alFilter.c:131
void ALvoid
Definition: al.h:74
GLenum GLint param
Definition: gl2ext.h:1491
#define ALfilter_SetParamf(x, c, p, v)
Definition: alFilter.h:76
#define AL_LOWPASS_MIN_GAINHF
Definition: efx.h:289
#define AL_LOWPASS_DEFAULT_GAINHF
Definition: efx.h:291
static void lp_SetParamfv(ALfilter *filter, ALCcontext *context, ALenum param, const ALfloat *vals)
Definition: alFilter.c:373
AL_API ALvoid AL_APIENTRY alGetFilteriv(ALuint filter, ALenum param, ALint *values)
Definition: alFilter.c:258
GLint GLenum GLsizei GLsizei GLsizei GLint GLenum GLenum type
Definition: gl2ext.h:845
GLvoid **typedef void(GLAPIENTRY *PFNGLGETVERTEXATTRIBDVPROC)(GLuint
Definition: glew.h:1824
#define CHECK_VALUE(ctx, cond)
Definition: alMain.h:875
#define AL_FILTER_LOWPASS
Definition: efx.h:200
#define AL_TRUE
Definition: al.h:86
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter
Definition: gl2ext.h:961
void(* SetParamfv)(struct ALfilter *filter, ALCcontext *context, ALenum param, const ALfloat *vals)
Definition: alFilter.h:63
GLboolean GLboolean g
Definition: glew.h:8736
#define NULL
Definition: ftobjs.h:61
static void lp_GetParamf(ALfilter *filter, ALCcontext *context, ALenum param, ALfloat *val)
Definition: alFilter.c:382
GLclampf f
Definition: glew.h:3390
struct UIntMap::@59 * array
static void lp_SetParamiv(ALfilter *filter, ALCcontext *context, ALenum param, const ALint *vals)
Definition: alFilter.c:348
ALuint id
Definition: alFilter.h:71
ALfloat lpCoeffCalc(ALfloat g, ALfloat cw)
Definition: alFilter.c:329
#define al_throwerr(ctx, err)
Definition: alMain.h:866
GLclampd n
Definition: glew.h:7287
#define AL_INVALID_VALUE
Definition: al.h:373
int ALsizei
Definition: al.h:62
SDL_EventEntry * free
Definition: SDL_events.c:80
#define al_try
Definition: alMain.h:838
AL_API ALvoid AL_APIENTRY alGetFilteri(ALuint filter, ALenum param, ALint *value)
Definition: alFilter.c:232
void(* SetParamiv)(struct ALfilter *filter, ALCcontext *context, ALenum param, const ALint *vals)
Definition: alFilter.h:61
int ALint
Definition: al.h:56
#define memset
Definition: SDL_malloc.c:633
#define AL_FALSE
Definition: al.h:83
GLboolean GLboolean GLboolean GLboolean a
Definition: glew.h:8736
#define AL_LOWPASS_MAX_GAINHF
Definition: efx.h:290
static void null_SetParamf(ALfilter *filter, ALCcontext *context, ALenum param, ALfloat val)
Definition: alFilter.c:409
#define al_endtry
Definition: alMain.h:853
static void null_SetParamfv(ALfilter *filter, ALCcontext *context, ALenum param, const ALfloat *vals)
Definition: alFilter.c:411
ALCcontext * GetContextRef(void)
Definition: ALc.c:1999
static void lp_SetParamf(ALfilter *filter, ALCcontext *context, ALenum param, ALfloat val)
Definition: alFilter.c:350
static __inline ALfloat maxf(ALfloat a, ALfloat b)
Definition: alu.h:56
float ALfloat
Definition: al.h:68
#define calloc
Definition: SDL_malloc.c:636
static void lp_GetParamiv(ALfilter *filter, ALCcontext *context, ALenum param, ALint *vals)
Definition: alFilter.c:380
#define AL_LOWPASS_MIN_GAIN
Definition: efx.h:285
static void lp_SetParami(ALfilter *filter, ALCcontext *context, ALenum param, ALint val)
Definition: alFilter.c:346
static void lp_GetParamfv(ALfilter *filter, ALCcontext *context, ALenum param, ALfloat *vals)
Definition: alFilter.c:399
#define AL_FILTER_TYPE
Definition: efx.h:196
ALvoid * value
Definition: alMain.h:310
AL_API ALvoid AL_APIENTRY alFilterfv(ALuint filter, ALenum param, const ALfloat *values)
Definition: alFilter.c:211
ALenum type
Definition: alFilter.h:55
static void InitFilterParams(ALfilter *filter, ALenum type)
Definition: alFilter.c:440
AL_API ALvoid AL_APIENTRY alDeleteFilters(ALsizei n, const ALuint *filters)
Definition: alFilter.c:81
AL_API ALvoid AL_APIENTRY alGetFilterf(ALuint filter, ALenum param, ALfloat *value)
Definition: alFilter.c:286
static void null_GetParamf(ALfilter *filter, ALCcontext *context, ALenum param, ALfloat *val)
Definition: alFilter.c:418
static void null_GetParamfv(ALfilter *filter, ALCcontext *context, ALenum param, ALfloat *vals)
Definition: alFilter.c:420
#define AL_FILTER_NULL
Definition: efx.h:199
GLuint64EXT * result
Definition: glew.h:12708
AL_API ALvoid AL_APIENTRY alFilteriv(ALuint filter, ALenum param, const ALint *values)
Definition: alFilter.c:162
#define AL_LOWPASS_GAIN
Definition: efx.h:181
void(* SetParamf)(struct ALfilter *filter, ALCcontext *context, ALenum param, ALfloat val)
Definition: alFilter.h:62
#define al_catchany()
Definition: alMain.h:851
void(* SetParami)(struct ALfilter *filter, ALCcontext *context, ALenum param, ALint val)
Definition: alFilter.h:60
#define AL_INVALID_NAME
Definition: al.h:367
ALfloat Gain
Definition: alFilter.h:57
#define AL_LOWPASS_GAINHF
Definition: efx.h:182
ALsizei size
Definition: alMain.h:312
ALfloat GainHF
Definition: alFilter.h:58
int ALenum
Definition: al.h:65
#define ALfilter_GetParamfv(x, c, p, v)
Definition: alFilter.h:82
void(* GetParamf)(struct ALfilter *filter, ALCcontext *context, ALenum param, ALfloat *val)
Definition: alFilter.h:67
ALenum NewThunkEntry(ALuint *index)
Definition: alThunk.c:47
unsigned int ALuint
Definition: al.h:59
#define AL_API
Definition: al.h:14
#define RemoveFilter(m, k)
Definition: alMain.h:672
#define ALfilter_GetParami(x, c, p, v)
Definition: alFilter.h:79
static void null_GetParami(ALfilter *filter, ALCcontext *context, ALenum param, ALint *val)
Definition: alFilter.c:414
void ALCcontext_DecRef(ALCcontext *context)
Definition: ALc.c:1949
EGLSurface EGLint void ** value
Definition: eglext.h:301
void(* GetParamfv)(struct ALfilter *filter, ALCcontext *context, ALenum param, ALfloat *vals)
Definition: alFilter.h:68
void(* GetParamiv)(struct ALfilter *filter, ALCcontext *context, ALenum param, ALint *vals)
Definition: alFilter.h:66
#define AL_OUT_OF_MEMORY
Definition: al.h:379
AL_API ALvoid AL_APIENTRY alGetFilterfv(ALuint filter, ALenum param, ALfloat *values)
Definition: alFilter.c:307
char ALboolean
Definition: al.h:38
ALCdevice * Device
Definition: alMain.h:704
TParseContext * context
#define ALfilter_SetParamfv(x, c, p, v)
Definition: alFilter.h:77
int i
Definition: pngrutil.c:1377
static void null_SetParami(ALfilter *filter, ALCcontext *context, ALenum param, ALint val)
Definition: alFilter.c:405
ALvoid alSetError(ALCcontext *Context, ALenum errorCode)
Definition: alError.c:31
#define ALfilter_GetParamf(x, c, p, v)
Definition: alFilter.h:81
#define AL_LOWPASS_MAX_GAIN
Definition: efx.h:286
#define ALfilter_SetParamiv(x, c, p, v)
Definition: alFilter.h:75
ALenum InsertUIntMapEntry(UIntMap *map, ALuint key, ALvoid *value)
Definition: helpers.c:565
static void null_GetParamiv(ALfilter *filter, ALCcontext *context, ALenum param, ALint *vals)
Definition: alFilter.c:416
static void lp_GetParami(ALfilter *filter, ALCcontext *context, ALenum param, ALint *val)
Definition: alFilter.c:378
AL_API ALvoid AL_APIENTRY alFilterf(ALuint filter, ALenum param, ALfloat value)
Definition: alFilter.c:190
AL_API ALvoid AL_APIENTRY alGenFilters(ALsizei n, ALuint *filters)
Definition: alFilter.c:35
#define AL_INVALID_ENUM
Definition: al.h:370
#define ALfilter_SetParami(x, c, p, v)
Definition: alFilter.h:74
ALvoid ReleaseALFilters(ALCdevice *device)
Definition: alFilter.c:424
#define AL_NO_ERROR
Definition: al.h:364
GLint GLsizei const GLuint64 * values
Definition: glew.h:3473
void(* GetParami)(struct ALfilter *filter, ALCcontext *context, ALenum param, ALint *val)
Definition: alFilter.h:65
#define AL_LOWPASS_DEFAULT_GAIN
Definition: efx.h:287
#define ALfilter_GetParamiv(x, c, p, v)
Definition: alFilter.h:80