Returned pa_operations can be NULL
[openal-soft.git] / OpenAL32 / alEffect.c
blob335b51c4000706866525480085b1ccace89789a0
1 /**
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
21 #include "config.h"
23 #include <stdlib.h>
24 #include <math.h>
26 #include "AL/al.h"
27 #include "AL/alc.h"
28 #include "alMain.h"
29 #include "alEffect.h"
30 #include "alThunk.h"
31 #include "alError.h"
34 ALboolean DisabledEffects[MAX_EFFECTS];
37 static void InitEffectParams(ALeffect *effect, ALenum type);
40 AL_API ALvoid AL_APIENTRY alGenEffects(ALsizei n, ALuint *effects)
42 ALCcontext *Context;
43 ALsizei i;
45 Context = GetContextRef();
46 if(!Context) return;
48 if(n < 0 || IsBadWritePtr((void*)effects, n * sizeof(ALuint)))
49 alSetError(Context, AL_INVALID_VALUE);
50 else
52 ALCdevice *device = Context->Device;
53 ALenum err;
55 for(i = 0;i < n;i++)
57 ALeffect *effect = calloc(1, sizeof(ALeffect));
58 if(!effect || InitEffect(effect) != AL_NO_ERROR)
60 free(effect);
61 alSetError(Context, AL_OUT_OF_MEMORY);
62 alDeleteEffects(i, effects);
63 break;
66 err = NewThunkEntry(&effect->effect);
67 if(err == AL_NO_ERROR)
68 err = InsertUIntMapEntry(&device->EffectMap, effect->effect, effect);
69 if(err != AL_NO_ERROR)
71 FreeThunkEntry(effect->effect);
72 memset(effect, 0, sizeof(ALeffect));
73 free(effect);
75 alSetError(Context, err);
76 alDeleteEffects(i, effects);
77 break;
80 effects[i] = effect->effect;
84 ALCcontext_DecRef(Context);
87 AL_API ALvoid AL_APIENTRY alDeleteEffects(ALsizei n, const ALuint *effects)
89 ALCcontext *Context;
90 ALCdevice *device;
91 ALeffect *ALEffect;
92 ALsizei i;
94 Context = GetContextRef();
95 if(!Context) return;
97 device = Context->Device;
98 if(n < 0)
99 alSetError(Context, AL_INVALID_VALUE);
100 else
102 // Check that all effects are valid
103 for(i = 0;i < n;i++)
105 if(!effects[i])
106 continue;
108 if(LookupEffect(device, effects[i]) == NULL)
110 alSetError(Context, AL_INVALID_NAME);
111 n = 0;
112 break;
116 for(i = 0;i < n;i++)
118 // Recheck that the effect is valid, because there could be duplicated names
119 if((ALEffect=RemoveEffect(device, effects[i])) == NULL)
120 continue;
121 FreeThunkEntry(ALEffect->effect);
123 memset(ALEffect, 0, sizeof(ALeffect));
124 free(ALEffect);
128 ALCcontext_DecRef(Context);
131 AL_API ALboolean AL_APIENTRY alIsEffect(ALuint effect)
133 ALCcontext *Context;
134 ALboolean result;
136 Context = GetContextRef();
137 if(!Context) return AL_FALSE;
139 result = ((!effect || LookupEffect(Context->Device, effect)) ?
140 AL_TRUE : AL_FALSE);
142 ALCcontext_DecRef(Context);
144 return result;
147 AL_API ALvoid AL_APIENTRY alEffecti(ALuint effect, ALenum param, ALint iValue)
149 ALCcontext *Context;
150 ALCdevice *Device;
151 ALeffect *ALEffect;
153 Context = GetContextRef();
154 if(!Context) return;
156 Device = Context->Device;
157 if((ALEffect=LookupEffect(Device, effect)) != NULL)
159 if(param == AL_EFFECT_TYPE)
161 ALboolean isOk = (iValue == AL_EFFECT_NULL);
162 ALint i;
163 for(i = 0;!isOk && EffectList[i].val;i++)
165 if(iValue == EffectList[i].val &&
166 !DisabledEffects[EffectList[i].type])
167 isOk = AL_TRUE;
170 if(isOk)
171 InitEffectParams(ALEffect, iValue);
172 else
173 alSetError(Context, AL_INVALID_VALUE);
175 else
177 /* Call the appropriate handler */
178 ALeffect_SetParami(ALEffect, Context, param, iValue);
181 else
182 alSetError(Context, AL_INVALID_NAME);
184 ALCcontext_DecRef(Context);
187 AL_API ALvoid AL_APIENTRY alEffectiv(ALuint effect, ALenum param, const ALint *piValues)
189 ALCcontext *Context;
190 ALCdevice *Device;
191 ALeffect *ALEffect;
193 Context = GetContextRef();
194 if(!Context) return;
196 Device = Context->Device;
197 if((ALEffect=LookupEffect(Device, effect)) != NULL)
199 /* Call the appropriate handler */
200 ALeffect_SetParamiv(ALEffect, Context, param, piValues);
202 else
203 alSetError(Context, AL_INVALID_NAME);
205 ALCcontext_DecRef(Context);
208 AL_API ALvoid AL_APIENTRY alEffectf(ALuint effect, ALenum param, ALfloat flValue)
210 ALCcontext *Context;
211 ALCdevice *Device;
212 ALeffect *ALEffect;
214 Context = GetContextRef();
215 if(!Context) return;
217 Device = Context->Device;
218 if((ALEffect=LookupEffect(Device, effect)) != NULL)
220 /* Call the appropriate handler */
221 ALeffect_SetParamf(ALEffect, Context, param, flValue);
223 else
224 alSetError(Context, AL_INVALID_NAME);
226 ALCcontext_DecRef(Context);
229 AL_API ALvoid AL_APIENTRY alEffectfv(ALuint effect, ALenum param, const ALfloat *pflValues)
231 ALCcontext *Context;
232 ALCdevice *Device;
233 ALeffect *ALEffect;
235 Context = GetContextRef();
236 if(!Context) return;
238 Device = Context->Device;
239 if((ALEffect=LookupEffect(Device, effect)) != NULL)
241 /* Call the appropriate handler */
242 ALeffect_SetParamfv(ALEffect, Context, param, pflValues);
244 else
245 alSetError(Context, AL_INVALID_NAME);
247 ALCcontext_DecRef(Context);
250 AL_API ALvoid AL_APIENTRY alGetEffecti(ALuint effect, ALenum param, ALint *piValue)
252 ALCcontext *Context;
253 ALCdevice *Device;
254 ALeffect *ALEffect;
256 Context = GetContextRef();
257 if(!Context) return;
259 Device = Context->Device;
260 if((ALEffect=LookupEffect(Device, effect)) != NULL)
262 if(param == AL_EFFECT_TYPE)
264 *piValue = ALEffect->type;
266 else
268 /* Call the appropriate handler */
269 ALeffect_GetParamiv(ALEffect, Context, param, piValue);
272 else
273 alSetError(Context, AL_INVALID_NAME);
275 ALCcontext_DecRef(Context);
278 AL_API ALvoid AL_APIENTRY alGetEffectiv(ALuint effect, ALenum param, ALint *piValues)
280 ALCcontext *Context;
281 ALCdevice *Device;
282 ALeffect *ALEffect;
284 Context = GetContextRef();
285 if(!Context) return;
287 Device = Context->Device;
288 if((ALEffect=LookupEffect(Device, effect)) != NULL)
290 /* Call the appropriate handler */
291 ALeffect_GetParamiv(ALEffect, Context, param, piValues);
293 else
294 alSetError(Context, AL_INVALID_NAME);
296 ALCcontext_DecRef(Context);
299 AL_API ALvoid AL_APIENTRY alGetEffectf(ALuint effect, ALenum param, ALfloat *pflValue)
301 ALCcontext *Context;
302 ALCdevice *Device;
303 ALeffect *ALEffect;
305 Context = GetContextRef();
306 if(!Context) return;
308 Device = Context->Device;
309 if((ALEffect=LookupEffect(Device, effect)) != NULL)
311 /* Call the appropriate handler */
312 ALeffect_GetParamf(ALEffect, Context, param, pflValue);
314 else
315 alSetError(Context, AL_INVALID_NAME);
317 ALCcontext_DecRef(Context);
320 AL_API ALvoid AL_APIENTRY alGetEffectfv(ALuint effect, ALenum param, ALfloat *pflValues)
322 ALCcontext *Context;
323 ALCdevice *Device;
324 ALeffect *ALEffect;
326 Context = GetContextRef();
327 if(!Context) return;
329 Device = Context->Device;
330 if((ALEffect=LookupEffect(Device, effect)) != NULL)
332 /* Call the appropriate handler */
333 ALeffect_GetParamfv(ALEffect, Context, param, pflValues);
335 else
336 alSetError(Context, AL_INVALID_NAME);
338 ALCcontext_DecRef(Context);
342 static void eaxreverb_SetParami(ALeffect *effect, ALCcontext *context, ALenum param, ALint val)
344 switch(param)
346 case AL_EAXREVERB_DECAY_HFLIMIT:
347 if(val >= AL_EAXREVERB_MIN_DECAY_HFLIMIT && val <= AL_EAXREVERB_MAX_DECAY_HFLIMIT)
348 effect->Reverb.DecayHFLimit = val;
349 else
350 alSetError(context, AL_INVALID_VALUE);
351 break;
353 default:
354 alSetError(context, AL_INVALID_ENUM);
355 break;
358 static void eaxreverb_SetParamiv(ALeffect *effect, ALCcontext *context, ALenum param, const ALint *vals)
360 eaxreverb_SetParami(effect, context, param, vals[0]);
362 static void eaxreverb_SetParamf(ALeffect *effect, ALCcontext *context, ALenum param, ALfloat val)
364 switch(param)
366 case AL_EAXREVERB_DENSITY:
367 if(val >= AL_EAXREVERB_MIN_DENSITY &&
368 val <= AL_EAXREVERB_MAX_DENSITY)
369 effect->Reverb.Density = val;
370 else
371 alSetError(context, AL_INVALID_VALUE);
372 break;
374 case AL_EAXREVERB_DIFFUSION:
375 if(val >= AL_EAXREVERB_MIN_DIFFUSION &&
376 val <= AL_EAXREVERB_MAX_DIFFUSION)
377 effect->Reverb.Diffusion = val;
378 else
379 alSetError(context, AL_INVALID_VALUE);
380 break;
382 case AL_EAXREVERB_GAIN:
383 if(val >= AL_EAXREVERB_MIN_GAIN &&
384 val <= AL_EAXREVERB_MAX_GAIN)
385 effect->Reverb.Gain = val;
386 else
387 alSetError(context, AL_INVALID_VALUE);
388 break;
390 case AL_EAXREVERB_GAINHF:
391 if(val >= AL_EAXREVERB_MIN_GAINHF &&
392 val <= AL_EAXREVERB_MAX_GAINHF)
393 effect->Reverb.GainHF = val;
394 else
395 alSetError(context, AL_INVALID_VALUE);
396 break;
398 case AL_EAXREVERB_GAINLF:
399 if(val >= AL_EAXREVERB_MIN_GAINLF &&
400 val <= AL_EAXREVERB_MAX_GAINLF)
401 effect->Reverb.GainLF = val;
402 else
403 alSetError(context, AL_INVALID_VALUE);
404 break;
406 case AL_EAXREVERB_DECAY_TIME:
407 if(val >= AL_EAXREVERB_MIN_DECAY_TIME &&
408 val <= AL_EAXREVERB_MAX_DECAY_TIME)
409 effect->Reverb.DecayTime = val;
410 else
411 alSetError(context, AL_INVALID_VALUE);
412 break;
414 case AL_EAXREVERB_DECAY_HFRATIO:
415 if(val >= AL_EAXREVERB_MIN_DECAY_HFRATIO &&
416 val <= AL_EAXREVERB_MAX_DECAY_HFRATIO)
417 effect->Reverb.DecayHFRatio = val;
418 else
419 alSetError(context, AL_INVALID_VALUE);
420 break;
422 case AL_EAXREVERB_DECAY_LFRATIO:
423 if(val >= AL_EAXREVERB_MIN_DECAY_LFRATIO &&
424 val <= AL_EAXREVERB_MAX_DECAY_LFRATIO)
425 effect->Reverb.DecayLFRatio = val;
426 else
427 alSetError(context, AL_INVALID_VALUE);
428 break;
430 case AL_EAXREVERB_REFLECTIONS_GAIN:
431 if(val >= AL_EAXREVERB_MIN_REFLECTIONS_GAIN &&
432 val <= AL_EAXREVERB_MAX_REFLECTIONS_GAIN)
433 effect->Reverb.ReflectionsGain = val;
434 else
435 alSetError(context, AL_INVALID_VALUE);
436 break;
438 case AL_EAXREVERB_REFLECTIONS_DELAY:
439 if(val >= AL_EAXREVERB_MIN_REFLECTIONS_DELAY &&
440 val <= AL_EAXREVERB_MAX_REFLECTIONS_DELAY)
441 effect->Reverb.ReflectionsDelay = val;
442 else
443 alSetError(context, AL_INVALID_VALUE);
444 break;
446 case AL_EAXREVERB_LATE_REVERB_GAIN:
447 if(val >= AL_EAXREVERB_MIN_LATE_REVERB_GAIN &&
448 val <= AL_EAXREVERB_MAX_LATE_REVERB_GAIN)
449 effect->Reverb.LateReverbGain = val;
450 else
451 alSetError(context, AL_INVALID_VALUE);
452 break;
454 case AL_EAXREVERB_LATE_REVERB_DELAY:
455 if(val >= AL_EAXREVERB_MIN_LATE_REVERB_DELAY &&
456 val <= AL_EAXREVERB_MAX_LATE_REVERB_DELAY)
457 effect->Reverb.LateReverbDelay = val;
458 else
459 alSetError(context, AL_INVALID_VALUE);
460 break;
462 case AL_EAXREVERB_AIR_ABSORPTION_GAINHF:
463 if(val >= AL_EAXREVERB_MIN_AIR_ABSORPTION_GAINHF &&
464 val <= AL_EAXREVERB_MAX_AIR_ABSORPTION_GAINHF)
465 effect->Reverb.AirAbsorptionGainHF = val;
466 else
467 alSetError(context, AL_INVALID_VALUE);
468 break;
470 case AL_EAXREVERB_ECHO_TIME:
471 if(val >= AL_EAXREVERB_MIN_ECHO_TIME &&
472 val <= AL_EAXREVERB_MAX_ECHO_TIME)
473 effect->Reverb.EchoTime = val;
474 else
475 alSetError(context, AL_INVALID_VALUE);
476 break;
478 case AL_EAXREVERB_ECHO_DEPTH:
479 if(val >= AL_EAXREVERB_MIN_ECHO_DEPTH &&
480 val <= AL_EAXREVERB_MAX_ECHO_DEPTH)
481 effect->Reverb.EchoDepth = val;
482 else
483 alSetError(context, AL_INVALID_VALUE);
484 break;
486 case AL_EAXREVERB_MODULATION_TIME:
487 if(val >= AL_EAXREVERB_MIN_MODULATION_TIME &&
488 val <= AL_EAXREVERB_MAX_MODULATION_TIME)
489 effect->Reverb.ModulationTime = val;
490 else
491 alSetError(context, AL_INVALID_VALUE);
492 break;
494 case AL_EAXREVERB_MODULATION_DEPTH:
495 if(val >= AL_EAXREVERB_MIN_MODULATION_DEPTH &&
496 val <= AL_EAXREVERB_MAX_MODULATION_DEPTH)
497 effect->Reverb.ModulationDepth = val;
498 else
499 alSetError(context, AL_INVALID_VALUE);
500 break;
502 case AL_EAXREVERB_HFREFERENCE:
503 if(val >= AL_EAXREVERB_MIN_HFREFERENCE &&
504 val <= AL_EAXREVERB_MAX_HFREFERENCE)
505 effect->Reverb.HFReference = val;
506 else
507 alSetError(context, AL_INVALID_VALUE);
508 break;
510 case AL_EAXREVERB_LFREFERENCE:
511 if(val >= AL_EAXREVERB_MIN_LFREFERENCE &&
512 val <= AL_EAXREVERB_MAX_LFREFERENCE)
513 effect->Reverb.LFReference = val;
514 else
515 alSetError(context, AL_INVALID_VALUE);
516 break;
518 case AL_EAXREVERB_ROOM_ROLLOFF_FACTOR:
519 if(val >= 0.0f && val <= 10.0f)
520 effect->Reverb.RoomRolloffFactor = val;
521 else
522 alSetError(context, AL_INVALID_VALUE);
523 break;
525 default:
526 alSetError(context, AL_INVALID_ENUM);
527 break;
530 static void eaxreverb_SetParamfv(ALeffect *effect, ALCcontext *context, ALenum param, const ALfloat *vals)
532 switch(param)
534 case AL_EAXREVERB_REFLECTIONS_PAN:
535 if(isfinite(vals[0]) && isfinite(vals[1]) && isfinite(vals[2]))
537 LockContext(context);
538 effect->Reverb.ReflectionsPan[0] = vals[0];
539 effect->Reverb.ReflectionsPan[1] = vals[1];
540 effect->Reverb.ReflectionsPan[2] = vals[2];
541 UnlockContext(context);
543 else
544 alSetError(context, AL_INVALID_VALUE);
545 break;
546 case AL_EAXREVERB_LATE_REVERB_PAN:
547 if(isfinite(vals[0]) && isfinite(vals[1]) && isfinite(vals[2]))
549 LockContext(context);
550 effect->Reverb.LateReverbPan[0] = vals[0];
551 effect->Reverb.LateReverbPan[1] = vals[1];
552 effect->Reverb.LateReverbPan[2] = vals[2];
553 UnlockContext(context);
555 else
556 alSetError(context, AL_INVALID_VALUE);
557 break;
559 default:
560 eaxreverb_SetParamf(effect, context, param, vals[0]);
561 break;
565 static void eaxreverb_GetParami(ALeffect *effect, ALCcontext *context, ALenum param, ALint *val)
567 switch(param)
569 case AL_EAXREVERB_DECAY_HFLIMIT:
570 *val = effect->Reverb.DecayHFLimit;
571 break;
573 default:
574 alSetError(context, AL_INVALID_ENUM);
575 break;
578 static void eaxreverb_GetParamiv(ALeffect *effect, ALCcontext *context, ALenum param, ALint *vals)
580 eaxreverb_GetParami(effect, context, param, vals);
582 static void eaxreverb_GetParamf(ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *val)
584 switch(param)
586 case AL_EAXREVERB_DENSITY:
587 *val = effect->Reverb.Density;
588 break;
590 case AL_EAXREVERB_DIFFUSION:
591 *val = effect->Reverb.Diffusion;
592 break;
594 case AL_EAXREVERB_GAIN:
595 *val = effect->Reverb.Gain;
596 break;
598 case AL_EAXREVERB_GAINHF:
599 *val = effect->Reverb.GainHF;
600 break;
602 case AL_EAXREVERB_GAINLF:
603 *val = effect->Reverb.GainLF;
604 break;
606 case AL_EAXREVERB_DECAY_TIME:
607 *val = effect->Reverb.DecayTime;
608 break;
610 case AL_EAXREVERB_DECAY_HFRATIO:
611 *val = effect->Reverb.DecayHFRatio;
612 break;
614 case AL_EAXREVERB_DECAY_LFRATIO:
615 *val = effect->Reverb.DecayLFRatio;
616 break;
618 case AL_EAXREVERB_REFLECTIONS_GAIN:
619 *val = effect->Reverb.ReflectionsGain;
620 break;
622 case AL_EAXREVERB_REFLECTIONS_DELAY:
623 *val = effect->Reverb.ReflectionsDelay;
624 break;
626 case AL_EAXREVERB_LATE_REVERB_GAIN:
627 *val = effect->Reverb.LateReverbGain;
628 break;
630 case AL_EAXREVERB_LATE_REVERB_DELAY:
631 *val = effect->Reverb.LateReverbDelay;
632 break;
634 case AL_EAXREVERB_AIR_ABSORPTION_GAINHF:
635 *val = effect->Reverb.AirAbsorptionGainHF;
636 break;
638 case AL_EAXREVERB_ECHO_TIME:
639 *val = effect->Reverb.EchoTime;
640 break;
642 case AL_EAXREVERB_ECHO_DEPTH:
643 *val = effect->Reverb.EchoDepth;
644 break;
646 case AL_EAXREVERB_MODULATION_TIME:
647 *val = effect->Reverb.ModulationTime;
648 break;
650 case AL_EAXREVERB_MODULATION_DEPTH:
651 *val = effect->Reverb.ModulationDepth;
652 break;
654 case AL_EAXREVERB_HFREFERENCE:
655 *val = effect->Reverb.HFReference;
656 break;
658 case AL_EAXREVERB_LFREFERENCE:
659 *val = effect->Reverb.LFReference;
660 break;
662 case AL_EAXREVERB_ROOM_ROLLOFF_FACTOR:
663 *val = effect->Reverb.RoomRolloffFactor;
664 break;
666 default:
667 alSetError(context, AL_INVALID_ENUM);
668 break;
671 static void eaxreverb_GetParamfv(ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *vals)
673 switch(param)
675 case AL_EAXREVERB_REFLECTIONS_PAN:
676 LockContext(context);
677 vals[0] = effect->Reverb.ReflectionsPan[0];
678 vals[1] = effect->Reverb.ReflectionsPan[1];
679 vals[2] = effect->Reverb.ReflectionsPan[2];
680 UnlockContext(context);
681 break;
682 case AL_EAXREVERB_LATE_REVERB_PAN:
683 LockContext(context);
684 vals[0] = effect->Reverb.LateReverbPan[0];
685 vals[1] = effect->Reverb.LateReverbPan[1];
686 vals[2] = effect->Reverb.LateReverbPan[2];
687 UnlockContext(context);
688 break;
690 default:
691 eaxreverb_GetParamf(effect, context, param, vals);
692 break;
697 static void reverb_SetParami(ALeffect *effect, ALCcontext *context, ALenum param, ALint val)
699 switch(param)
701 case AL_REVERB_DECAY_HFLIMIT:
702 if(val >= AL_REVERB_MIN_DECAY_HFLIMIT &&
703 val <= AL_REVERB_MAX_DECAY_HFLIMIT)
704 effect->Reverb.DecayHFLimit = val;
705 else
706 alSetError(context, AL_INVALID_VALUE);
707 break;
709 default:
710 alSetError(context, AL_INVALID_ENUM);
711 break;
714 static void reverb_SetParamiv(ALeffect *effect, ALCcontext *context, ALenum param, const ALint *vals)
716 reverb_SetParami(effect, context, param, vals[0]);
718 static void reverb_SetParamf(ALeffect *effect, ALCcontext *context, ALenum param, ALfloat val)
720 switch(param)
722 case AL_REVERB_DENSITY:
723 if(val >= AL_REVERB_MIN_DENSITY &&
724 val <= AL_REVERB_MAX_DENSITY)
725 effect->Reverb.Density = val;
726 else
727 alSetError(context, AL_INVALID_VALUE);
728 break;
730 case AL_REVERB_DIFFUSION:
731 if(val >= AL_REVERB_MIN_DIFFUSION &&
732 val <= AL_REVERB_MAX_DIFFUSION)
733 effect->Reverb.Diffusion = val;
734 else
735 alSetError(context, AL_INVALID_VALUE);
736 break;
738 case AL_REVERB_GAIN:
739 if(val >= AL_REVERB_MIN_GAIN &&
740 val <= AL_REVERB_MAX_GAIN)
741 effect->Reverb.Gain = val;
742 else
743 alSetError(context, AL_INVALID_VALUE);
744 break;
746 case AL_REVERB_GAINHF:
747 if(val >= AL_REVERB_MIN_GAINHF &&
748 val <= AL_REVERB_MAX_GAINHF)
749 effect->Reverb.GainHF = val;
750 else
751 alSetError(context, AL_INVALID_VALUE);
752 break;
754 case AL_REVERB_DECAY_TIME:
755 if(val >= AL_REVERB_MIN_DECAY_TIME &&
756 val <= AL_REVERB_MAX_DECAY_TIME)
757 effect->Reverb.DecayTime = val;
758 else
759 alSetError(context, AL_INVALID_VALUE);
760 break;
762 case AL_REVERB_DECAY_HFRATIO:
763 if(val >= AL_REVERB_MIN_DECAY_HFRATIO &&
764 val <= AL_REVERB_MAX_DECAY_HFRATIO)
765 effect->Reverb.DecayHFRatio = val;
766 else
767 alSetError(context, AL_INVALID_VALUE);
768 break;
770 case AL_REVERB_REFLECTIONS_GAIN:
771 if(val >= AL_REVERB_MIN_REFLECTIONS_GAIN &&
772 val <= AL_REVERB_MAX_REFLECTIONS_GAIN)
773 effect->Reverb.ReflectionsGain = val;
774 else
775 alSetError(context, AL_INVALID_VALUE);
776 break;
778 case AL_REVERB_REFLECTIONS_DELAY:
779 if(val >= AL_REVERB_MIN_REFLECTIONS_DELAY &&
780 val <= AL_REVERB_MAX_REFLECTIONS_DELAY)
781 effect->Reverb.ReflectionsDelay = val;
782 else
783 alSetError(context, AL_INVALID_VALUE);
784 break;
786 case AL_REVERB_LATE_REVERB_GAIN:
787 if(val >= AL_REVERB_MIN_LATE_REVERB_GAIN &&
788 val <= AL_REVERB_MAX_LATE_REVERB_GAIN)
789 effect->Reverb.LateReverbGain = val;
790 else
791 alSetError(context, AL_INVALID_VALUE);
792 break;
794 case AL_REVERB_LATE_REVERB_DELAY:
795 if(val >= AL_REVERB_MIN_LATE_REVERB_DELAY &&
796 val <= AL_REVERB_MAX_LATE_REVERB_DELAY)
797 effect->Reverb.LateReverbDelay = val;
798 else
799 alSetError(context, AL_INVALID_VALUE);
800 break;
802 case AL_REVERB_AIR_ABSORPTION_GAINHF:
803 if(val >= AL_REVERB_MIN_AIR_ABSORPTION_GAINHF &&
804 val <= AL_REVERB_MAX_AIR_ABSORPTION_GAINHF)
805 effect->Reverb.AirAbsorptionGainHF = val;
806 else
807 alSetError(context, AL_INVALID_VALUE);
808 break;
810 case AL_REVERB_ROOM_ROLLOFF_FACTOR:
811 if(val >= AL_REVERB_MIN_ROOM_ROLLOFF_FACTOR &&
812 val <= AL_REVERB_MAX_ROOM_ROLLOFF_FACTOR)
813 effect->Reverb.RoomRolloffFactor = val;
814 else
815 alSetError(context, AL_INVALID_VALUE);
816 break;
818 default:
819 alSetError(context, AL_INVALID_ENUM);
820 break;
823 static void reverb_SetParamfv(ALeffect *effect, ALCcontext *context, ALenum param, const ALfloat *vals)
825 reverb_SetParamf(effect, context, param, vals[0]);
828 static void reverb_GetParami(ALeffect *effect, ALCcontext *context, ALenum param, ALint *val)
830 switch(param)
832 case AL_REVERB_DECAY_HFLIMIT:
833 *val = effect->Reverb.DecayHFLimit;
834 break;
836 default:
837 alSetError(context, AL_INVALID_ENUM);
838 break;
841 static void reverb_GetParamiv(ALeffect *effect, ALCcontext *context, ALenum param, ALint *vals)
843 reverb_GetParami(effect, context, param, vals);
845 static void reverb_GetParamf(ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *val)
847 switch(param)
849 case AL_REVERB_DENSITY:
850 *val = effect->Reverb.Density;
851 break;
853 case AL_REVERB_DIFFUSION:
854 *val = effect->Reverb.Diffusion;
855 break;
857 case AL_REVERB_GAIN:
858 *val = effect->Reverb.Gain;
859 break;
861 case AL_REVERB_GAINHF:
862 *val = effect->Reverb.GainHF;
863 break;
865 case AL_REVERB_DECAY_TIME:
866 *val = effect->Reverb.DecayTime;
867 break;
869 case AL_REVERB_DECAY_HFRATIO:
870 *val = effect->Reverb.DecayHFRatio;
871 break;
873 case AL_REVERB_REFLECTIONS_GAIN:
874 *val = effect->Reverb.ReflectionsGain;
875 break;
877 case AL_REVERB_REFLECTIONS_DELAY:
878 *val = effect->Reverb.ReflectionsDelay;
879 break;
881 case AL_REVERB_LATE_REVERB_GAIN:
882 *val = effect->Reverb.LateReverbGain;
883 break;
885 case AL_REVERB_LATE_REVERB_DELAY:
886 *val = effect->Reverb.LateReverbDelay;
887 break;
889 case AL_REVERB_AIR_ABSORPTION_GAINHF:
890 *val = effect->Reverb.AirAbsorptionGainHF;
891 break;
893 case AL_REVERB_ROOM_ROLLOFF_FACTOR:
894 *val = effect->Reverb.RoomRolloffFactor;
895 break;
897 default:
898 alSetError(context, AL_INVALID_ENUM);
899 break;
902 static void reverb_GetParamfv(ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *vals)
904 reverb_GetParamf(effect, context, param, vals);
908 static void echo_SetParami(ALeffect *effect, ALCcontext *context, ALenum param, ALint val)
909 { (void)effect;(void)param;(void)val; alSetError(context, AL_INVALID_ENUM); }
910 static void echo_SetParamiv(ALeffect *effect, ALCcontext *context, ALenum param, const ALint *vals)
912 echo_SetParami(effect, context, param, vals[0]);
914 static void echo_SetParamf(ALeffect *effect, ALCcontext *context, ALenum param, ALfloat val)
916 switch(param)
918 case AL_ECHO_DELAY:
919 if(val >= AL_ECHO_MIN_DELAY && val <= AL_ECHO_MAX_DELAY)
920 effect->Echo.Delay = val;
921 else
922 alSetError(context, AL_INVALID_VALUE);
923 break;
925 case AL_ECHO_LRDELAY:
926 if(val >= AL_ECHO_MIN_LRDELAY && val <= AL_ECHO_MAX_LRDELAY)
927 effect->Echo.LRDelay = val;
928 else
929 alSetError(context, AL_INVALID_VALUE);
930 break;
932 case AL_ECHO_DAMPING:
933 if(val >= AL_ECHO_MIN_DAMPING && val <= AL_ECHO_MAX_DAMPING)
934 effect->Echo.Damping = val;
935 else
936 alSetError(context, AL_INVALID_VALUE);
937 break;
939 case AL_ECHO_FEEDBACK:
940 if(val >= AL_ECHO_MIN_FEEDBACK && val <= AL_ECHO_MAX_FEEDBACK)
941 effect->Echo.Feedback = val;
942 else
943 alSetError(context, AL_INVALID_VALUE);
944 break;
946 case AL_ECHO_SPREAD:
947 if(val >= AL_ECHO_MIN_SPREAD && val <= AL_ECHO_MAX_SPREAD)
948 effect->Echo.Spread = val;
949 else
950 alSetError(context, AL_INVALID_VALUE);
951 break;
953 default:
954 alSetError(context, AL_INVALID_ENUM);
955 break;
958 static void echo_SetParamfv(ALeffect *effect, ALCcontext *context, ALenum param, const ALfloat *vals)
960 echo_SetParamf(effect, context, param, vals[0]);
963 static void echo_GetParami(ALeffect *effect, ALCcontext *context, ALenum param, ALint *val)
964 { (void)effect;(void)param;(void)val; alSetError(context, AL_INVALID_ENUM); }
965 static void echo_GetParamiv(ALeffect *effect, ALCcontext *context, ALenum param, ALint *vals)
967 echo_GetParami(effect, context, param, vals);
969 static void echo_GetParamf(ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *val)
971 switch(param)
973 case AL_ECHO_DELAY:
974 *val = effect->Echo.Delay;
975 break;
977 case AL_ECHO_LRDELAY:
978 *val = effect->Echo.LRDelay;
979 break;
981 case AL_ECHO_DAMPING:
982 *val = effect->Echo.Damping;
983 break;
985 case AL_ECHO_FEEDBACK:
986 *val = effect->Echo.Feedback;
987 break;
989 case AL_ECHO_SPREAD:
990 *val = effect->Echo.Spread;
991 break;
993 default:
994 alSetError(context, AL_INVALID_ENUM);
995 break;
998 static void echo_GetParamfv(ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *vals)
1000 echo_GetParamf(effect, context, param, vals);
1004 static void mod_SetParamf(ALeffect *effect, ALCcontext *context, ALenum param, ALfloat val)
1006 switch(param)
1008 case AL_RING_MODULATOR_FREQUENCY:
1009 if(val >= AL_RING_MODULATOR_MIN_FREQUENCY &&
1010 val <= AL_RING_MODULATOR_MAX_FREQUENCY)
1011 effect->Modulator.Frequency = val;
1012 else
1013 alSetError(context, AL_INVALID_VALUE);
1014 break;
1016 case AL_RING_MODULATOR_HIGHPASS_CUTOFF:
1017 if(val >= AL_RING_MODULATOR_MIN_HIGHPASS_CUTOFF &&
1018 val <= AL_RING_MODULATOR_MAX_HIGHPASS_CUTOFF)
1019 effect->Modulator.HighPassCutoff = val;
1020 else
1021 alSetError(context, AL_INVALID_VALUE);
1022 break;
1024 default:
1025 alSetError(context, AL_INVALID_ENUM);
1026 break;
1029 static void mod_SetParamfv(ALeffect *effect, ALCcontext *context, ALenum param, const ALfloat *vals)
1031 mod_SetParamf(effect, context, param, vals[0]);
1033 static void mod_SetParami(ALeffect *effect, ALCcontext *context, ALenum param, ALint val)
1035 switch(param)
1037 case AL_RING_MODULATOR_FREQUENCY:
1038 case AL_RING_MODULATOR_HIGHPASS_CUTOFF:
1039 mod_SetParamf(effect, context, param, (ALfloat)val);
1040 break;
1042 case AL_RING_MODULATOR_WAVEFORM:
1043 if(val >= AL_RING_MODULATOR_MIN_WAVEFORM &&
1044 val <= AL_RING_MODULATOR_MAX_WAVEFORM)
1045 effect->Modulator.Waveform = val;
1046 else
1047 alSetError(context, AL_INVALID_VALUE);
1048 break;
1050 default:
1051 alSetError(context, AL_INVALID_ENUM);
1052 break;
1055 static void mod_SetParamiv(ALeffect *effect, ALCcontext *context, ALenum param, const ALint *vals)
1057 mod_SetParami(effect, context, param, vals[0]);
1060 static void mod_GetParami(ALeffect *effect, ALCcontext *context, ALenum param, ALint *val)
1062 switch(param)
1064 case AL_RING_MODULATOR_FREQUENCY:
1065 *val = (ALint)effect->Modulator.Frequency;
1066 break;
1067 case AL_RING_MODULATOR_HIGHPASS_CUTOFF:
1068 *val = (ALint)effect->Modulator.HighPassCutoff;
1069 break;
1070 case AL_RING_MODULATOR_WAVEFORM:
1071 *val = effect->Modulator.Waveform;
1072 break;
1074 default:
1075 alSetError(context, AL_INVALID_ENUM);
1076 break;
1079 static void mod_GetParamiv(ALeffect *effect, ALCcontext *context, ALenum param, ALint *vals)
1081 mod_GetParami(effect, context, param, vals);
1083 static void mod_GetParamf(ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *val)
1085 switch(param)
1087 case AL_RING_MODULATOR_FREQUENCY:
1088 *val = effect->Modulator.Frequency;
1089 break;
1090 case AL_RING_MODULATOR_HIGHPASS_CUTOFF:
1091 *val = effect->Modulator.HighPassCutoff;
1092 break;
1094 default:
1095 alSetError(context, AL_INVALID_ENUM);
1096 break;
1099 static void mod_GetParamfv(ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *vals)
1101 mod_GetParamf(effect, context, param, vals);
1105 static void ded_SetParami(ALeffect *effect, ALCcontext *context, ALenum param, ALint val)
1106 { (void)effect;(void)param;(void)val; alSetError(context, AL_INVALID_ENUM); }
1107 static void ded_SetParamiv(ALeffect *effect, ALCcontext *context, ALenum param, const ALint *vals)
1109 ded_SetParami(effect, context, param, vals[0]);
1111 static void ded_SetParamf(ALeffect *effect, ALCcontext *context, ALenum param, ALfloat val)
1113 switch(param)
1115 case AL_DEDICATED_GAIN:
1116 if(val >= 0.0f && isfinite(val))
1117 effect->Dedicated.Gain = val;
1118 else
1119 alSetError(context, AL_INVALID_VALUE);
1120 break;
1122 default:
1123 alSetError(context, AL_INVALID_ENUM);
1124 break;
1127 static void ded_SetParamfv(ALeffect *effect, ALCcontext *context, ALenum param, const ALfloat *vals)
1129 ded_SetParamf(effect, context, param, vals[0]);
1132 static void ded_GetParami(ALeffect *effect, ALCcontext *context, ALenum param, ALint *val)
1133 { (void)effect;(void)param;(void)val; alSetError(context, AL_INVALID_ENUM); }
1134 static void ded_GetParamiv(ALeffect *effect, ALCcontext *context, ALenum param, ALint *vals)
1136 ded_GetParami(effect, context, param, vals);
1138 static void ded_GetParamf(ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *val)
1140 switch(param)
1142 case AL_DEDICATED_GAIN:
1143 *val = effect->Dedicated.Gain;
1144 break;
1146 default:
1147 alSetError(context, AL_INVALID_ENUM);
1148 break;
1151 static void ded_GetParamfv(ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *vals)
1153 ded_GetParamf(effect, context, param, vals);
1157 static void null_SetParami(ALeffect *effect, ALCcontext *context, ALenum param, ALint val)
1158 { (void)effect;(void)param;(void)val; alSetError(context, AL_INVALID_ENUM); }
1159 static void null_SetParamiv(ALeffect *effect, ALCcontext *context, ALenum param, const ALint *vals)
1160 { (void)effect;(void)param;(void)vals; alSetError(context, AL_INVALID_ENUM); }
1161 static void null_SetParamf(ALeffect *effect, ALCcontext *context, ALenum param, ALfloat val)
1162 { (void)effect;(void)param;(void)val; alSetError(context, AL_INVALID_ENUM); }
1163 static void null_SetParamfv(ALeffect *effect, ALCcontext *context, ALenum param, const ALfloat *vals)
1164 { (void)effect;(void)param;(void)vals; alSetError(context, AL_INVALID_ENUM); }
1166 static void null_GetParami(ALeffect *effect, ALCcontext *context, ALenum param, ALint *val)
1167 { (void)effect;(void)param;(void)val; alSetError(context, AL_INVALID_ENUM); }
1168 static void null_GetParamiv(ALeffect *effect, ALCcontext *context, ALenum param, ALint *vals)
1169 { (void)effect;(void)param;(void)vals; alSetError(context, AL_INVALID_ENUM); }
1170 static void null_GetParamf(ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *val)
1171 { (void)effect;(void)param;(void)val; alSetError(context, AL_INVALID_ENUM); }
1172 static void null_GetParamfv(ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *vals)
1173 { (void)effect;(void)param;(void)vals; alSetError(context, AL_INVALID_ENUM); }
1176 ALenum InitEffect(ALeffect *effect)
1178 InitEffectParams(effect, AL_EFFECT_NULL);
1179 return AL_NO_ERROR;
1182 ALvoid ReleaseALEffects(ALCdevice *device)
1184 ALsizei i;
1185 for(i = 0;i < device->EffectMap.size;i++)
1187 ALeffect *temp = device->EffectMap.array[i].value;
1188 device->EffectMap.array[i].value = NULL;
1190 // Release effect structure
1191 FreeThunkEntry(temp->effect);
1192 memset(temp, 0, sizeof(ALeffect));
1193 free(temp);
1198 static void InitEffectParams(ALeffect *effect, ALenum type)
1200 switch(type)
1202 case AL_EFFECT_EAXREVERB:
1203 effect->Reverb.Density = AL_EAXREVERB_DEFAULT_DENSITY;
1204 effect->Reverb.Diffusion = AL_EAXREVERB_DEFAULT_DIFFUSION;
1205 effect->Reverb.Gain = AL_EAXREVERB_DEFAULT_GAIN;
1206 effect->Reverb.GainHF = AL_EAXREVERB_DEFAULT_GAINHF;
1207 effect->Reverb.GainLF = AL_EAXREVERB_DEFAULT_GAINLF;
1208 effect->Reverb.DecayTime = AL_EAXREVERB_DEFAULT_DECAY_TIME;
1209 effect->Reverb.DecayHFRatio = AL_EAXREVERB_DEFAULT_DECAY_HFRATIO;
1210 effect->Reverb.DecayLFRatio = AL_EAXREVERB_DEFAULT_DECAY_LFRATIO;
1211 effect->Reverb.ReflectionsGain = AL_EAXREVERB_DEFAULT_REFLECTIONS_GAIN;
1212 effect->Reverb.ReflectionsDelay = AL_EAXREVERB_DEFAULT_REFLECTIONS_DELAY;
1213 effect->Reverb.ReflectionsPan[0] = AL_EAXREVERB_DEFAULT_REFLECTIONS_PAN_XYZ;
1214 effect->Reverb.ReflectionsPan[1] = AL_EAXREVERB_DEFAULT_REFLECTIONS_PAN_XYZ;
1215 effect->Reverb.ReflectionsPan[2] = AL_EAXREVERB_DEFAULT_REFLECTIONS_PAN_XYZ;
1216 effect->Reverb.LateReverbGain = AL_EAXREVERB_DEFAULT_LATE_REVERB_GAIN;
1217 effect->Reverb.LateReverbDelay = AL_EAXREVERB_DEFAULT_LATE_REVERB_DELAY;
1218 effect->Reverb.LateReverbPan[0] = AL_EAXREVERB_DEFAULT_LATE_REVERB_PAN_XYZ;
1219 effect->Reverb.LateReverbPan[1] = AL_EAXREVERB_DEFAULT_LATE_REVERB_PAN_XYZ;
1220 effect->Reverb.LateReverbPan[2] = AL_EAXREVERB_DEFAULT_LATE_REVERB_PAN_XYZ;
1221 effect->Reverb.EchoTime = AL_EAXREVERB_DEFAULT_ECHO_TIME;
1222 effect->Reverb.EchoDepth = AL_EAXREVERB_DEFAULT_ECHO_DEPTH;
1223 effect->Reverb.ModulationTime = AL_EAXREVERB_DEFAULT_MODULATION_TIME;
1224 effect->Reverb.ModulationDepth = AL_EAXREVERB_DEFAULT_MODULATION_DEPTH;
1225 effect->Reverb.AirAbsorptionGainHF = AL_EAXREVERB_DEFAULT_AIR_ABSORPTION_GAINHF;
1226 effect->Reverb.HFReference = AL_EAXREVERB_DEFAULT_HFREFERENCE;
1227 effect->Reverb.LFReference = AL_EAXREVERB_DEFAULT_LFREFERENCE;
1228 effect->Reverb.RoomRolloffFactor = AL_EAXREVERB_DEFAULT_ROOM_ROLLOFF_FACTOR;
1229 effect->Reverb.DecayHFLimit = AL_EAXREVERB_DEFAULT_DECAY_HFLIMIT;
1230 effect->SetParami = eaxreverb_SetParami;
1231 effect->SetParamiv = eaxreverb_SetParamiv;
1232 effect->SetParamf = eaxreverb_SetParamf;
1233 effect->SetParamfv = eaxreverb_SetParamfv;
1234 effect->GetParami = eaxreverb_GetParami;
1235 effect->GetParamiv = eaxreverb_GetParamiv;
1236 effect->GetParamf = eaxreverb_GetParamf;
1237 effect->GetParamfv = eaxreverb_GetParamfv;
1238 break;
1239 case AL_EFFECT_REVERB:
1240 effect->Reverb.Density = AL_REVERB_DEFAULT_DENSITY;
1241 effect->Reverb.Diffusion = AL_REVERB_DEFAULT_DIFFUSION;
1242 effect->Reverb.Gain = AL_REVERB_DEFAULT_GAIN;
1243 effect->Reverb.GainHF = AL_REVERB_DEFAULT_GAINHF;
1244 effect->Reverb.DecayTime = AL_REVERB_DEFAULT_DECAY_TIME;
1245 effect->Reverb.DecayHFRatio = AL_REVERB_DEFAULT_DECAY_HFRATIO;
1246 effect->Reverb.ReflectionsGain = AL_REVERB_DEFAULT_REFLECTIONS_GAIN;
1247 effect->Reverb.ReflectionsDelay = AL_REVERB_DEFAULT_REFLECTIONS_DELAY;
1248 effect->Reverb.LateReverbGain = AL_REVERB_DEFAULT_LATE_REVERB_GAIN;
1249 effect->Reverb.LateReverbDelay = AL_REVERB_DEFAULT_LATE_REVERB_DELAY;
1250 effect->Reverb.AirAbsorptionGainHF = AL_REVERB_DEFAULT_AIR_ABSORPTION_GAINHF;
1251 effect->Reverb.RoomRolloffFactor = AL_REVERB_DEFAULT_ROOM_ROLLOFF_FACTOR;
1252 effect->Reverb.DecayHFLimit = AL_REVERB_DEFAULT_DECAY_HFLIMIT;
1253 effect->SetParami = reverb_SetParami;
1254 effect->SetParamiv = reverb_SetParamiv;
1255 effect->SetParamf = reverb_SetParamf;
1256 effect->SetParamfv = reverb_SetParamfv;
1257 effect->GetParami = reverb_GetParami;
1258 effect->GetParamiv = reverb_GetParamiv;
1259 effect->GetParamf = reverb_GetParamf;
1260 effect->GetParamfv = reverb_GetParamfv;
1261 break;
1262 case AL_EFFECT_ECHO:
1263 effect->Echo.Delay = AL_ECHO_DEFAULT_DELAY;
1264 effect->Echo.LRDelay = AL_ECHO_DEFAULT_LRDELAY;
1265 effect->Echo.Damping = AL_ECHO_DEFAULT_DAMPING;
1266 effect->Echo.Feedback = AL_ECHO_DEFAULT_FEEDBACK;
1267 effect->Echo.Spread = AL_ECHO_DEFAULT_SPREAD;
1268 effect->SetParami = echo_SetParami;
1269 effect->SetParamiv = echo_SetParamiv;
1270 effect->SetParamf = echo_SetParamf;
1271 effect->SetParamfv = echo_SetParamfv;
1272 effect->GetParami = echo_GetParami;
1273 effect->GetParamiv = echo_GetParamiv;
1274 effect->GetParamf = echo_GetParamf;
1275 effect->GetParamfv = echo_GetParamfv;
1276 break;
1277 case AL_EFFECT_RING_MODULATOR:
1278 effect->Modulator.Frequency = AL_RING_MODULATOR_DEFAULT_FREQUENCY;
1279 effect->Modulator.HighPassCutoff = AL_RING_MODULATOR_DEFAULT_HIGHPASS_CUTOFF;
1280 effect->Modulator.Waveform = AL_RING_MODULATOR_DEFAULT_WAVEFORM;
1281 effect->SetParami = mod_SetParami;
1282 effect->SetParamiv = mod_SetParamiv;
1283 effect->SetParamf = mod_SetParamf;
1284 effect->SetParamfv = mod_SetParamfv;
1285 effect->GetParami = mod_GetParami;
1286 effect->GetParamiv = mod_GetParamiv;
1287 effect->GetParamf = mod_GetParamf;
1288 effect->GetParamfv = mod_GetParamfv;
1289 break;
1290 case AL_EFFECT_DEDICATED_LOW_FREQUENCY_EFFECT:
1291 case AL_EFFECT_DEDICATED_DIALOGUE:
1292 effect->Dedicated.Gain = 1.0f;
1293 effect->SetParami = ded_SetParami;
1294 effect->SetParamiv = ded_SetParamiv;
1295 effect->SetParamf = ded_SetParamf;
1296 effect->SetParamfv = ded_SetParamfv;
1297 effect->GetParami = ded_GetParami;
1298 effect->GetParamiv = ded_GetParamiv;
1299 effect->GetParamf = ded_GetParamf;
1300 effect->GetParamfv = ded_GetParamfv;
1301 break;
1302 default:
1303 effect->SetParami = null_SetParami;
1304 effect->SetParamiv = null_SetParamiv;
1305 effect->SetParamf = null_SetParamf;
1306 effect->SetParamfv = null_SetParamfv;
1307 effect->GetParami = null_GetParami;
1308 effect->GetParamiv = null_GetParamiv;
1309 effect->GetParamf = null_GetParamf;
1310 effect->GetParamfv = null_GetParamfv;
1311 break;
1313 effect->type = type;
1317 #include "AL/efx-presets.h"
1319 #define DECL(x) { #x, EFX_REVERB_PRESET_##x }
1320 static const struct {
1321 const char name[32];
1322 EFXEAXREVERBPROPERTIES props;
1323 } reverblist[] = {
1324 DECL(GENERIC),
1325 DECL(PADDEDCELL),
1326 DECL(ROOM),
1327 DECL(BATHROOM),
1328 DECL(LIVINGROOM),
1329 DECL(STONEROOM),
1330 DECL(AUDITORIUM),
1331 DECL(CONCERTHALL),
1332 DECL(CAVE),
1333 DECL(ARENA),
1334 DECL(HANGAR),
1335 DECL(CARPETEDHALLWAY),
1336 DECL(HALLWAY),
1337 DECL(STONECORRIDOR),
1338 DECL(ALLEY),
1339 DECL(FOREST),
1340 DECL(CITY),
1341 DECL(MOUNTAINS),
1342 DECL(QUARRY),
1343 DECL(PLAIN),
1344 DECL(PARKINGLOT),
1345 DECL(SEWERPIPE),
1346 DECL(UNDERWATER),
1347 DECL(DRUGGED),
1348 DECL(DIZZY),
1349 DECL(PSYCHOTIC),
1351 DECL(CASTLE_SMALLROOM),
1352 DECL(CASTLE_SHORTPASSAGE),
1353 DECL(CASTLE_MEDIUMROOM),
1354 DECL(CASTLE_LARGEROOM),
1355 DECL(CASTLE_LONGPASSAGE),
1356 DECL(CASTLE_HALL),
1357 DECL(CASTLE_CUPBOARD),
1358 DECL(CASTLE_COURTYARD),
1359 DECL(CASTLE_ALCOVE),
1361 DECL(FACTORY_SMALLROOM),
1362 DECL(FACTORY_SHORTPASSAGE),
1363 DECL(FACTORY_MEDIUMROOM),
1364 DECL(FACTORY_LARGEROOM),
1365 DECL(FACTORY_LONGPASSAGE),
1366 DECL(FACTORY_HALL),
1367 DECL(FACTORY_CUPBOARD),
1368 DECL(FACTORY_COURTYARD),
1369 DECL(FACTORY_ALCOVE),
1371 DECL(ICEPALACE_SMALLROOM),
1372 DECL(ICEPALACE_SHORTPASSAGE),
1373 DECL(ICEPALACE_MEDIUMROOM),
1374 DECL(ICEPALACE_LARGEROOM),
1375 DECL(ICEPALACE_LONGPASSAGE),
1376 DECL(ICEPALACE_HALL),
1377 DECL(ICEPALACE_CUPBOARD),
1378 DECL(ICEPALACE_COURTYARD),
1379 DECL(ICEPALACE_ALCOVE),
1381 DECL(SPACESTATION_SMALLROOM),
1382 DECL(SPACESTATION_SHORTPASSAGE),
1383 DECL(SPACESTATION_MEDIUMROOM),
1384 DECL(SPACESTATION_LARGEROOM),
1385 DECL(SPACESTATION_LONGPASSAGE),
1386 DECL(SPACESTATION_HALL),
1387 DECL(SPACESTATION_CUPBOARD),
1388 DECL(SPACESTATION_ALCOVE),
1390 DECL(WOODEN_SMALLROOM),
1391 DECL(WOODEN_SHORTPASSAGE),
1392 DECL(WOODEN_MEDIUMROOM),
1393 DECL(WOODEN_LARGEROOM),
1394 DECL(WOODEN_LONGPASSAGE),
1395 DECL(WOODEN_HALL),
1396 DECL(WOODEN_CUPBOARD),
1397 DECL(WOODEN_COURTYARD),
1398 DECL(WOODEN_ALCOVE),
1400 DECL(SPORT_EMPTYSTADIUM),
1401 DECL(SPORT_SQUASHCOURT),
1402 DECL(SPORT_SMALLSWIMMINGPOOL),
1403 DECL(SPORT_LARGESWIMMINGPOOL),
1404 DECL(SPORT_GYMNASIUM),
1405 DECL(SPORT_FULLSTADIUM),
1406 DECL(SPORT_STADIUMTANNOY),
1408 DECL(PREFAB_WORKSHOP),
1409 DECL(PREFAB_SCHOOLROOM),
1410 DECL(PREFAB_PRACTISEROOM),
1411 DECL(PREFAB_OUTHOUSE),
1412 DECL(PREFAB_CARAVAN),
1414 DECL(DOME_TOMB),
1415 DECL(PIPE_SMALL),
1416 DECL(DOME_SAINTPAULS),
1417 DECL(PIPE_LONGTHIN),
1418 DECL(PIPE_LARGE),
1419 DECL(PIPE_RESONANT),
1421 DECL(OUTDOORS_BACKYARD),
1422 DECL(OUTDOORS_ROLLINGPLAINS),
1423 DECL(OUTDOORS_DEEPCANYON),
1424 DECL(OUTDOORS_CREEK),
1425 DECL(OUTDOORS_VALLEY),
1427 DECL(MOOD_HEAVEN),
1428 DECL(MOOD_HELL),
1429 DECL(MOOD_MEMORY),
1431 DECL(DRIVING_COMMENTATOR),
1432 DECL(DRIVING_PITGARAGE),
1433 DECL(DRIVING_INCAR_RACER),
1434 DECL(DRIVING_INCAR_SPORTS),
1435 DECL(DRIVING_INCAR_LUXURY),
1436 DECL(DRIVING_FULLGRANDSTAND),
1437 DECL(DRIVING_EMPTYGRANDSTAND),
1438 DECL(DRIVING_TUNNEL),
1440 DECL(CITY_STREETS),
1441 DECL(CITY_SUBWAY),
1442 DECL(CITY_MUSEUM),
1443 DECL(CITY_LIBRARY),
1444 DECL(CITY_UNDERPASS),
1445 DECL(CITY_ABANDONED),
1447 DECL(DUSTYROOM),
1448 DECL(CHAPEL),
1449 DECL(SMALLWATERROOM),
1451 #undef DECL
1452 static const ALsizei reverblistsize = COUNTOF(reverblist);
1454 ALvoid GetReverbEffect(const char *name, ALeffect *effect)
1456 int i;
1458 if(strcasecmp(name, "NONE") == 0)
1460 InitEffectParams(effect, AL_EFFECT_NULL);
1461 TRACE("Loading reverb '%s'\n", "NONE");
1462 return;
1465 if(!DisabledEffects[EAXREVERB])
1466 InitEffectParams(effect, AL_EFFECT_EAXREVERB);
1467 else if(!DisabledEffects[REVERB])
1468 InitEffectParams(effect, AL_EFFECT_REVERB);
1469 else
1470 InitEffectParams(effect, AL_EFFECT_NULL);
1471 for(i = 0;i < reverblistsize;i++)
1473 const EFXEAXREVERBPROPERTIES *props;
1475 if(strcasecmp(name, reverblist[i].name) != 0)
1476 continue;
1478 TRACE("Loading reverb '%s'\n", reverblist[i].name);
1479 props = &reverblist[i].props;
1480 effect->Reverb.Density = props->flDensity;
1481 effect->Reverb.Diffusion = props->flDiffusion;
1482 effect->Reverb.Gain = props->flGain;
1483 effect->Reverb.GainHF = props->flGainHF;
1484 effect->Reverb.GainLF = props->flGainLF;
1485 effect->Reverb.DecayTime = props->flDecayTime;
1486 effect->Reverb.DecayHFRatio = props->flDecayHFRatio;
1487 effect->Reverb.DecayLFRatio = props->flDecayLFRatio;
1488 effect->Reverb.ReflectionsGain = props->flReflectionsGain;
1489 effect->Reverb.ReflectionsDelay = props->flReflectionsDelay;
1490 effect->Reverb.ReflectionsPan[0] = props->flReflectionsPan[0];
1491 effect->Reverb.ReflectionsPan[1] = props->flReflectionsPan[1];
1492 effect->Reverb.ReflectionsPan[2] = props->flReflectionsPan[2];
1493 effect->Reverb.LateReverbGain = props->flLateReverbGain;
1494 effect->Reverb.LateReverbDelay = props->flLateReverbDelay;
1495 effect->Reverb.LateReverbPan[0] = props->flLateReverbPan[0];
1496 effect->Reverb.LateReverbPan[1] = props->flLateReverbPan[1];
1497 effect->Reverb.LateReverbPan[2] = props->flLateReverbPan[2];
1498 effect->Reverb.EchoTime = props->flEchoTime;
1499 effect->Reverb.EchoDepth = props->flEchoDepth;
1500 effect->Reverb.ModulationTime = props->flModulationTime;
1501 effect->Reverb.ModulationDepth = props->flModulationDepth;
1502 effect->Reverb.AirAbsorptionGainHF = props->flAirAbsorptionGainHF;
1503 effect->Reverb.HFReference = props->flHFReference;
1504 effect->Reverb.LFReference = props->flLFReference;
1505 effect->Reverb.RoomRolloffFactor = props->flRoomRolloffFactor;
1506 effect->Reverb.DecayHFLimit = props->iDecayHFLimit;
1507 break;
1509 if(i == reverblistsize)
1510 WARN("Reverb preset '%s' not found\n", name);