2 * OpenAL cross platform audio library
3 * Copyright (C) 1999-2007 by authors.
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Library General Public License for more details.
14 * You should have received a copy of the GNU Library General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 * Boston, MA 02111-1307, USA.
18 * Or go to http://www.gnu.org/copyleft/lgpl.html
33 static void InitFilterParams(ALfilter
*filter
, ALenum type
);
35 #define LookupFilter(m, k) ((ALfilter*)LookupUIntMapKey(&(m), (k)))
37 AL_API ALvoid AL_APIENTRY
alGenFilters(ALsizei n
, ALuint
*filters
)
42 Context
= GetContextSuspended();
45 if(n
< 0 || IsBadWritePtr((void*)filters
, n
* sizeof(ALuint
)))
46 alSetError(Context
, AL_INVALID_VALUE
);
49 ALCdevice
*device
= Context
->Device
;
54 ALfilter
*filter
= calloc(1, sizeof(ALfilter
));
57 alSetError(Context
, AL_OUT_OF_MEMORY
);
58 alDeleteFilters(i
, filters
);
62 filter
->filter
= ALTHUNK_ADDENTRY(filter
);
63 err
= InsertUIntMapEntry(&device
->FilterMap
, filter
->filter
, filter
);
64 if(err
!= AL_NO_ERROR
)
66 ALTHUNK_REMOVEENTRY(filter
->filter
);
67 memset(filter
, 0, sizeof(ALfilter
));
70 alSetError(Context
, err
);
71 alDeleteFilters(i
, filters
);
75 filters
[i
++] = filter
->filter
;
76 InitFilterParams(filter
, AL_FILTER_NULL
);
80 ProcessContext(Context
);
83 AL_API ALvoid AL_APIENTRY
alDeleteFilters(ALsizei n
, ALuint
*filters
)
91 Context
= GetContextSuspended();
95 device
= Context
->Device
;
97 alSetError(Context
, AL_INVALID_VALUE
);
101 // Check that all filters are valid
107 if(LookupFilter(device
->FilterMap
, filters
[i
]) == NULL
)
109 alSetError(Context
, AL_INVALID_NAME
);
118 // All filters are valid
121 // Recheck that the filter is valid, because there could be duplicated names
122 if((ALFilter
=LookupFilter(device
->FilterMap
, filters
[i
])) == NULL
)
125 RemoveUIntMapKey(&device
->FilterMap
, ALFilter
->filter
);
126 ALTHUNK_REMOVEENTRY(ALFilter
->filter
);
128 memset(ALFilter
, 0, sizeof(ALfilter
));
133 ProcessContext(Context
);
136 AL_API ALboolean AL_APIENTRY
alIsFilter(ALuint filter
)
141 Context
= GetContextSuspended();
142 if(!Context
) return AL_FALSE
;
144 result
= ((!filter
|| LookupFilter(Context
->Device
->FilterMap
, filter
)) ?
147 ProcessContext(Context
);
152 AL_API ALvoid AL_APIENTRY
alFilteri(ALuint filter
, ALenum param
, ALint iValue
)
158 Context
= GetContextSuspended();
161 Device
= Context
->Device
;
162 if((ALFilter
=LookupFilter(Device
->FilterMap
, filter
)) != NULL
)
167 if(iValue
== AL_FILTER_NULL
||
168 iValue
== AL_FILTER_LOWPASS
)
169 InitFilterParams(ALFilter
, iValue
);
171 alSetError(Context
, AL_INVALID_VALUE
);
175 alSetError(Context
, AL_INVALID_ENUM
);
180 alSetError(Context
, AL_INVALID_NAME
);
182 ProcessContext(Context
);
185 AL_API ALvoid AL_APIENTRY
alFilteriv(ALuint filter
, ALenum param
, ALint
*piValues
)
190 Context
= GetContextSuspended();
193 Device
= Context
->Device
;
194 if(LookupFilter(Device
->FilterMap
, filter
) != NULL
)
199 alFilteri(filter
, param
, piValues
[0]);
203 alSetError(Context
, AL_INVALID_ENUM
);
208 alSetError(Context
, AL_INVALID_NAME
);
210 ProcessContext(Context
);
213 AL_API ALvoid AL_APIENTRY
alFilterf(ALuint filter
, ALenum param
, ALfloat flValue
)
219 Context
= GetContextSuspended();
222 Device
= Context
->Device
;
223 if((ALFilter
=LookupFilter(Device
->FilterMap
, filter
)) != NULL
)
225 switch(ALFilter
->type
)
227 case AL_FILTER_LOWPASS
:
230 case AL_LOWPASS_GAIN
:
231 if(flValue
>= 0.0f
&& flValue
<= 1.0f
)
232 ALFilter
->Gain
= flValue
;
234 alSetError(Context
, AL_INVALID_VALUE
);
237 case AL_LOWPASS_GAINHF
:
238 if(flValue
>= 0.0f
&& flValue
<= 1.0f
)
239 ALFilter
->GainHF
= flValue
;
241 alSetError(Context
, AL_INVALID_VALUE
);
245 alSetError(Context
, AL_INVALID_ENUM
);
251 alSetError(Context
, AL_INVALID_ENUM
);
256 alSetError(Context
, AL_INVALID_NAME
);
258 ProcessContext(Context
);
261 AL_API ALvoid AL_APIENTRY
alFilterfv(ALuint filter
, ALenum param
, ALfloat
*pflValues
)
266 Context
= GetContextSuspended();
269 Device
= Context
->Device
;
270 if(LookupFilter(Device
->FilterMap
, filter
) != NULL
)
275 alFilterf(filter
, param
, pflValues
[0]);
280 alSetError(Context
, AL_INVALID_NAME
);
282 ProcessContext(Context
);
285 AL_API ALvoid AL_APIENTRY
alGetFilteri(ALuint filter
, ALenum param
, ALint
*piValue
)
291 Context
= GetContextSuspended();
294 Device
= Context
->Device
;
295 if((ALFilter
=LookupFilter(Device
->FilterMap
, filter
)) != NULL
)
300 *piValue
= ALFilter
->type
;
304 alSetError(Context
, AL_INVALID_ENUM
);
309 alSetError(Context
, AL_INVALID_NAME
);
311 ProcessContext(Context
);
314 AL_API ALvoid AL_APIENTRY
alGetFilteriv(ALuint filter
, ALenum param
, ALint
*piValues
)
319 Context
= GetContextSuspended();
322 Device
= Context
->Device
;
323 if(LookupFilter(Device
->FilterMap
, filter
) != NULL
)
328 alGetFilteri(filter
, param
, piValues
);
332 alSetError(Context
, AL_INVALID_ENUM
);
337 alSetError(Context
, AL_INVALID_NAME
);
339 ProcessContext(Context
);
342 AL_API ALvoid AL_APIENTRY
alGetFilterf(ALuint filter
, ALenum param
, ALfloat
*pflValue
)
348 Context
= GetContextSuspended();
351 Device
= Context
->Device
;
352 if((ALFilter
=LookupFilter(Device
->FilterMap
, filter
)) != NULL
)
354 switch(ALFilter
->type
)
356 case AL_FILTER_LOWPASS
:
359 case AL_LOWPASS_GAIN
:
360 *pflValue
= ALFilter
->Gain
;
363 case AL_LOWPASS_GAINHF
:
364 *pflValue
= ALFilter
->GainHF
;
368 alSetError(Context
, AL_INVALID_ENUM
);
374 alSetError(Context
, AL_INVALID_ENUM
);
379 alSetError(Context
, AL_INVALID_NAME
);
381 ProcessContext(Context
);
384 AL_API ALvoid AL_APIENTRY
alGetFilterfv(ALuint filter
, ALenum param
, ALfloat
*pflValues
)
389 Context
= GetContextSuspended();
392 Device
= Context
->Device
;
393 if(LookupFilter(Device
->FilterMap
, filter
) != NULL
)
398 alGetFilterf(filter
, param
, pflValues
);
403 alSetError(Context
, AL_INVALID_NAME
);
405 ProcessContext(Context
);
409 ALvoid
ReleaseALFilters(ALCdevice
*device
)
412 for(i
= 0;i
< device
->FilterMap
.size
;i
++)
414 ALfilter
*temp
= device
->FilterMap
.array
[i
].value
;
415 device
->FilterMap
.array
[i
].value
= NULL
;
417 // Release filter structure
418 ALTHUNK_REMOVEENTRY(temp
->filter
);
419 memset(temp
, 0, sizeof(ALfilter
));
425 static void InitFilterParams(ALfilter
*filter
, ALenum type
)
430 filter
->GainHF
= 1.0;