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
34 ALboolean DisabledEffects
[MAX_EFFECTS
];
37 static void InitEffectParams(ALeffect
*effect
, ALenum type
);
40 AL_API ALvoid AL_APIENTRY
alGenEffects(ALsizei n
, ALuint
*effects
)
45 Context
= GetContextRef();
50 ALCdevice
*device
= Context
->Device
;
53 CHECK_VALUE(Context
, n
>= 0);
54 for(cur
= 0;cur
< n
;cur
++)
56 ALeffect
*effect
= calloc(1, sizeof(ALeffect
));
57 err
= AL_OUT_OF_MEMORY
;
58 if(!effect
|| (err
=InitEffect(effect
)) != AL_NO_ERROR
)
61 al_throwerr(Context
, err
);
64 err
= NewThunkEntry(&effect
->id
);
65 if(err
== AL_NO_ERROR
)
66 err
= InsertUIntMapEntry(&device
->EffectMap
, effect
->id
, effect
);
67 if(err
!= AL_NO_ERROR
)
69 FreeThunkEntry(effect
->id
);
70 memset(effect
, 0, sizeof(ALeffect
));
73 al_throwerr(Context
, err
);
76 effects
[cur
] = effect
->id
;
82 alDeleteEffects(cur
, effects
);
86 ALCcontext_DecRef(Context
);
89 AL_API ALvoid AL_APIENTRY
alDeleteEffects(ALsizei n
, const ALuint
*effects
)
95 Context
= GetContextRef();
100 ALCdevice
*device
= Context
->Device
;
101 CHECK_VALUE(Context
, n
>= 0);
104 if(effects
[i
] && LookupEffect(device
, effects
[i
]) == NULL
)
105 al_throwerr(Context
, AL_INVALID_NAME
);
110 if((Effect
=RemoveEffect(device
, effects
[i
])) == NULL
)
112 FreeThunkEntry(Effect
->id
);
114 memset(Effect
, 0, sizeof(*Effect
));
120 ALCcontext_DecRef(Context
);
123 AL_API ALboolean AL_APIENTRY
alIsEffect(ALuint effect
)
128 Context
= GetContextRef();
129 if(!Context
) return AL_FALSE
;
131 result
= ((!effect
|| LookupEffect(Context
->Device
, effect
)) ?
134 ALCcontext_DecRef(Context
);
139 AL_API ALvoid AL_APIENTRY
alEffecti(ALuint effect
, ALenum param
, ALint value
)
145 Context
= GetContextRef();
148 Device
= Context
->Device
;
149 if((ALEffect
=LookupEffect(Device
, effect
)) == NULL
)
150 alSetError(Context
, AL_INVALID_NAME
);
153 if(param
== AL_EFFECT_TYPE
)
155 ALboolean isOk
= (value
== AL_EFFECT_NULL
);
157 for(i
= 0;!isOk
&& EffectList
[i
].val
;i
++)
159 if(value
== EffectList
[i
].val
&&
160 !DisabledEffects
[EffectList
[i
].type
])
165 InitEffectParams(ALEffect
, value
);
167 alSetError(Context
, AL_INVALID_VALUE
);
171 /* Call the appropriate handler */
172 ALeffect_SetParami(ALEffect
, Context
, param
, value
);
176 ALCcontext_DecRef(Context
);
179 AL_API ALvoid AL_APIENTRY
alEffectiv(ALuint effect
, ALenum param
, const ALint
*values
)
188 alEffecti(effect
, param
, values
[0]);
192 Context
= GetContextRef();
195 Device
= Context
->Device
;
196 if((ALEffect
=LookupEffect(Device
, effect
)) == NULL
)
197 alSetError(Context
, AL_INVALID_NAME
);
200 /* Call the appropriate handler */
201 ALeffect_SetParamiv(ALEffect
, Context
, param
, values
);
204 ALCcontext_DecRef(Context
);
207 AL_API ALvoid AL_APIENTRY
alEffectf(ALuint effect
, ALenum param
, ALfloat value
)
213 Context
= GetContextRef();
216 Device
= Context
->Device
;
217 if((ALEffect
=LookupEffect(Device
, effect
)) == NULL
)
218 alSetError(Context
, AL_INVALID_NAME
);
221 /* Call the appropriate handler */
222 ALeffect_SetParamf(ALEffect
, Context
, param
, value
);
225 ALCcontext_DecRef(Context
);
228 AL_API ALvoid AL_APIENTRY
alEffectfv(ALuint effect
, ALenum param
, const ALfloat
*values
)
234 Context
= GetContextRef();
237 Device
= Context
->Device
;
238 if((ALEffect
=LookupEffect(Device
, effect
)) == NULL
)
239 alSetError(Context
, AL_INVALID_NAME
);
242 /* Call the appropriate handler */
243 ALeffect_SetParamfv(ALEffect
, Context
, param
, values
);
246 ALCcontext_DecRef(Context
);
249 AL_API ALvoid AL_APIENTRY
alGetEffecti(ALuint effect
, ALenum param
, ALint
*value
)
255 Context
= GetContextRef();
258 Device
= Context
->Device
;
259 if((ALEffect
=LookupEffect(Device
, effect
)) == NULL
)
260 alSetError(Context
, AL_INVALID_NAME
);
263 if(param
== AL_EFFECT_TYPE
)
264 *value
= ALEffect
->type
;
267 /* Call the appropriate handler */
268 ALeffect_GetParami(ALEffect
, Context
, param
, value
);
272 ALCcontext_DecRef(Context
);
275 AL_API ALvoid AL_APIENTRY
alGetEffectiv(ALuint effect
, ALenum param
, ALint
*values
)
284 alGetEffecti(effect
, param
, values
);
288 Context
= GetContextRef();
291 Device
= Context
->Device
;
292 if((ALEffect
=LookupEffect(Device
, effect
)) == NULL
)
293 alSetError(Context
, AL_INVALID_NAME
);
296 /* Call the appropriate handler */
297 ALeffect_GetParamiv(ALEffect
, Context
, param
, values
);
300 ALCcontext_DecRef(Context
);
303 AL_API ALvoid AL_APIENTRY
alGetEffectf(ALuint effect
, ALenum param
, ALfloat
*value
)
309 Context
= GetContextRef();
312 Device
= Context
->Device
;
313 if((ALEffect
=LookupEffect(Device
, effect
)) == NULL
)
314 alSetError(Context
, AL_INVALID_NAME
);
317 /* Call the appropriate handler */
318 ALeffect_GetParamf(ALEffect
, Context
, param
, value
);
321 ALCcontext_DecRef(Context
);
324 AL_API ALvoid AL_APIENTRY
alGetEffectfv(ALuint effect
, ALenum param
, ALfloat
*values
)
330 Context
= GetContextRef();
333 Device
= Context
->Device
;
334 if((ALEffect
=LookupEffect(Device
, effect
)) == NULL
)
335 alSetError(Context
, AL_INVALID_NAME
);
338 /* Call the appropriate handler */
339 ALeffect_GetParamfv(ALEffect
, Context
, param
, values
);
342 ALCcontext_DecRef(Context
);
346 static void eaxreverb_SetParami(ALeffect
*effect
, ALCcontext
*context
, ALenum param
, ALint val
)
350 case AL_EAXREVERB_DECAY_HFLIMIT
:
351 if(val
>= AL_EAXREVERB_MIN_DECAY_HFLIMIT
&& val
<= AL_EAXREVERB_MAX_DECAY_HFLIMIT
)
352 effect
->Reverb
.DecayHFLimit
= val
;
354 alSetError(context
, AL_INVALID_VALUE
);
358 alSetError(context
, AL_INVALID_ENUM
);
362 static void eaxreverb_SetParamiv(ALeffect
*effect
, ALCcontext
*context
, ALenum param
, const ALint
*vals
)
364 eaxreverb_SetParami(effect
, context
, param
, vals
[0]);
366 static void eaxreverb_SetParamf(ALeffect
*effect
, ALCcontext
*context
, ALenum param
, ALfloat val
)
370 case AL_EAXREVERB_DENSITY
:
371 if(val
>= AL_EAXREVERB_MIN_DENSITY
&&
372 val
<= AL_EAXREVERB_MAX_DENSITY
)
373 effect
->Reverb
.Density
= val
;
375 alSetError(context
, AL_INVALID_VALUE
);
378 case AL_EAXREVERB_DIFFUSION
:
379 if(val
>= AL_EAXREVERB_MIN_DIFFUSION
&&
380 val
<= AL_EAXREVERB_MAX_DIFFUSION
)
381 effect
->Reverb
.Diffusion
= val
;
383 alSetError(context
, AL_INVALID_VALUE
);
386 case AL_EAXREVERB_GAIN
:
387 if(val
>= AL_EAXREVERB_MIN_GAIN
&&
388 val
<= AL_EAXREVERB_MAX_GAIN
)
389 effect
->Reverb
.Gain
= val
;
391 alSetError(context
, AL_INVALID_VALUE
);
394 case AL_EAXREVERB_GAINHF
:
395 if(val
>= AL_EAXREVERB_MIN_GAINHF
&&
396 val
<= AL_EAXREVERB_MAX_GAINHF
)
397 effect
->Reverb
.GainHF
= val
;
399 alSetError(context
, AL_INVALID_VALUE
);
402 case AL_EAXREVERB_GAINLF
:
403 if(val
>= AL_EAXREVERB_MIN_GAINLF
&&
404 val
<= AL_EAXREVERB_MAX_GAINLF
)
405 effect
->Reverb
.GainLF
= val
;
407 alSetError(context
, AL_INVALID_VALUE
);
410 case AL_EAXREVERB_DECAY_TIME
:
411 if(val
>= AL_EAXREVERB_MIN_DECAY_TIME
&&
412 val
<= AL_EAXREVERB_MAX_DECAY_TIME
)
413 effect
->Reverb
.DecayTime
= val
;
415 alSetError(context
, AL_INVALID_VALUE
);
418 case AL_EAXREVERB_DECAY_HFRATIO
:
419 if(val
>= AL_EAXREVERB_MIN_DECAY_HFRATIO
&&
420 val
<= AL_EAXREVERB_MAX_DECAY_HFRATIO
)
421 effect
->Reverb
.DecayHFRatio
= val
;
423 alSetError(context
, AL_INVALID_VALUE
);
426 case AL_EAXREVERB_DECAY_LFRATIO
:
427 if(val
>= AL_EAXREVERB_MIN_DECAY_LFRATIO
&&
428 val
<= AL_EAXREVERB_MAX_DECAY_LFRATIO
)
429 effect
->Reverb
.DecayLFRatio
= val
;
431 alSetError(context
, AL_INVALID_VALUE
);
434 case AL_EAXREVERB_REFLECTIONS_GAIN
:
435 if(val
>= AL_EAXREVERB_MIN_REFLECTIONS_GAIN
&&
436 val
<= AL_EAXREVERB_MAX_REFLECTIONS_GAIN
)
437 effect
->Reverb
.ReflectionsGain
= val
;
439 alSetError(context
, AL_INVALID_VALUE
);
442 case AL_EAXREVERB_REFLECTIONS_DELAY
:
443 if(val
>= AL_EAXREVERB_MIN_REFLECTIONS_DELAY
&&
444 val
<= AL_EAXREVERB_MAX_REFLECTIONS_DELAY
)
445 effect
->Reverb
.ReflectionsDelay
= val
;
447 alSetError(context
, AL_INVALID_VALUE
);
450 case AL_EAXREVERB_LATE_REVERB_GAIN
:
451 if(val
>= AL_EAXREVERB_MIN_LATE_REVERB_GAIN
&&
452 val
<= AL_EAXREVERB_MAX_LATE_REVERB_GAIN
)
453 effect
->Reverb
.LateReverbGain
= val
;
455 alSetError(context
, AL_INVALID_VALUE
);
458 case AL_EAXREVERB_LATE_REVERB_DELAY
:
459 if(val
>= AL_EAXREVERB_MIN_LATE_REVERB_DELAY
&&
460 val
<= AL_EAXREVERB_MAX_LATE_REVERB_DELAY
)
461 effect
->Reverb
.LateReverbDelay
= val
;
463 alSetError(context
, AL_INVALID_VALUE
);
466 case AL_EAXREVERB_AIR_ABSORPTION_GAINHF
:
467 if(val
>= AL_EAXREVERB_MIN_AIR_ABSORPTION_GAINHF
&&
468 val
<= AL_EAXREVERB_MAX_AIR_ABSORPTION_GAINHF
)
469 effect
->Reverb
.AirAbsorptionGainHF
= val
;
471 alSetError(context
, AL_INVALID_VALUE
);
474 case AL_EAXREVERB_ECHO_TIME
:
475 if(val
>= AL_EAXREVERB_MIN_ECHO_TIME
&&
476 val
<= AL_EAXREVERB_MAX_ECHO_TIME
)
477 effect
->Reverb
.EchoTime
= val
;
479 alSetError(context
, AL_INVALID_VALUE
);
482 case AL_EAXREVERB_ECHO_DEPTH
:
483 if(val
>= AL_EAXREVERB_MIN_ECHO_DEPTH
&&
484 val
<= AL_EAXREVERB_MAX_ECHO_DEPTH
)
485 effect
->Reverb
.EchoDepth
= val
;
487 alSetError(context
, AL_INVALID_VALUE
);
490 case AL_EAXREVERB_MODULATION_TIME
:
491 if(val
>= AL_EAXREVERB_MIN_MODULATION_TIME
&&
492 val
<= AL_EAXREVERB_MAX_MODULATION_TIME
)
493 effect
->Reverb
.ModulationTime
= val
;
495 alSetError(context
, AL_INVALID_VALUE
);
498 case AL_EAXREVERB_MODULATION_DEPTH
:
499 if(val
>= AL_EAXREVERB_MIN_MODULATION_DEPTH
&&
500 val
<= AL_EAXREVERB_MAX_MODULATION_DEPTH
)
501 effect
->Reverb
.ModulationDepth
= val
;
503 alSetError(context
, AL_INVALID_VALUE
);
506 case AL_EAXREVERB_HFREFERENCE
:
507 if(val
>= AL_EAXREVERB_MIN_HFREFERENCE
&&
508 val
<= AL_EAXREVERB_MAX_HFREFERENCE
)
509 effect
->Reverb
.HFReference
= val
;
511 alSetError(context
, AL_INVALID_VALUE
);
514 case AL_EAXREVERB_LFREFERENCE
:
515 if(val
>= AL_EAXREVERB_MIN_LFREFERENCE
&&
516 val
<= AL_EAXREVERB_MAX_LFREFERENCE
)
517 effect
->Reverb
.LFReference
= val
;
519 alSetError(context
, AL_INVALID_VALUE
);
522 case AL_EAXREVERB_ROOM_ROLLOFF_FACTOR
:
523 if(val
>= 0.0f
&& val
<= 10.0f
)
524 effect
->Reverb
.RoomRolloffFactor
= val
;
526 alSetError(context
, AL_INVALID_VALUE
);
530 alSetError(context
, AL_INVALID_ENUM
);
534 static void eaxreverb_SetParamfv(ALeffect
*effect
, ALCcontext
*context
, ALenum param
, const ALfloat
*vals
)
538 case AL_EAXREVERB_REFLECTIONS_PAN
:
539 if(isfinite(vals
[0]) && isfinite(vals
[1]) && isfinite(vals
[2]))
541 LockContext(context
);
542 effect
->Reverb
.ReflectionsPan
[0] = vals
[0];
543 effect
->Reverb
.ReflectionsPan
[1] = vals
[1];
544 effect
->Reverb
.ReflectionsPan
[2] = vals
[2];
545 UnlockContext(context
);
548 alSetError(context
, AL_INVALID_VALUE
);
550 case AL_EAXREVERB_LATE_REVERB_PAN
:
551 if(isfinite(vals
[0]) && isfinite(vals
[1]) && isfinite(vals
[2]))
553 LockContext(context
);
554 effect
->Reverb
.LateReverbPan
[0] = vals
[0];
555 effect
->Reverb
.LateReverbPan
[1] = vals
[1];
556 effect
->Reverb
.LateReverbPan
[2] = vals
[2];
557 UnlockContext(context
);
560 alSetError(context
, AL_INVALID_VALUE
);
564 eaxreverb_SetParamf(effect
, context
, param
, vals
[0]);
569 static void eaxreverb_GetParami(ALeffect
*effect
, ALCcontext
*context
, ALenum param
, ALint
*val
)
573 case AL_EAXREVERB_DECAY_HFLIMIT
:
574 *val
= effect
->Reverb
.DecayHFLimit
;
578 alSetError(context
, AL_INVALID_ENUM
);
582 static void eaxreverb_GetParamiv(ALeffect
*effect
, ALCcontext
*context
, ALenum param
, ALint
*vals
)
584 eaxreverb_GetParami(effect
, context
, param
, vals
);
586 static void eaxreverb_GetParamf(ALeffect
*effect
, ALCcontext
*context
, ALenum param
, ALfloat
*val
)
590 case AL_EAXREVERB_DENSITY
:
591 *val
= effect
->Reverb
.Density
;
594 case AL_EAXREVERB_DIFFUSION
:
595 *val
= effect
->Reverb
.Diffusion
;
598 case AL_EAXREVERB_GAIN
:
599 *val
= effect
->Reverb
.Gain
;
602 case AL_EAXREVERB_GAINHF
:
603 *val
= effect
->Reverb
.GainHF
;
606 case AL_EAXREVERB_GAINLF
:
607 *val
= effect
->Reverb
.GainLF
;
610 case AL_EAXREVERB_DECAY_TIME
:
611 *val
= effect
->Reverb
.DecayTime
;
614 case AL_EAXREVERB_DECAY_HFRATIO
:
615 *val
= effect
->Reverb
.DecayHFRatio
;
618 case AL_EAXREVERB_DECAY_LFRATIO
:
619 *val
= effect
->Reverb
.DecayLFRatio
;
622 case AL_EAXREVERB_REFLECTIONS_GAIN
:
623 *val
= effect
->Reverb
.ReflectionsGain
;
626 case AL_EAXREVERB_REFLECTIONS_DELAY
:
627 *val
= effect
->Reverb
.ReflectionsDelay
;
630 case AL_EAXREVERB_LATE_REVERB_GAIN
:
631 *val
= effect
->Reverb
.LateReverbGain
;
634 case AL_EAXREVERB_LATE_REVERB_DELAY
:
635 *val
= effect
->Reverb
.LateReverbDelay
;
638 case AL_EAXREVERB_AIR_ABSORPTION_GAINHF
:
639 *val
= effect
->Reverb
.AirAbsorptionGainHF
;
642 case AL_EAXREVERB_ECHO_TIME
:
643 *val
= effect
->Reverb
.EchoTime
;
646 case AL_EAXREVERB_ECHO_DEPTH
:
647 *val
= effect
->Reverb
.EchoDepth
;
650 case AL_EAXREVERB_MODULATION_TIME
:
651 *val
= effect
->Reverb
.ModulationTime
;
654 case AL_EAXREVERB_MODULATION_DEPTH
:
655 *val
= effect
->Reverb
.ModulationDepth
;
658 case AL_EAXREVERB_HFREFERENCE
:
659 *val
= effect
->Reverb
.HFReference
;
662 case AL_EAXREVERB_LFREFERENCE
:
663 *val
= effect
->Reverb
.LFReference
;
666 case AL_EAXREVERB_ROOM_ROLLOFF_FACTOR
:
667 *val
= effect
->Reverb
.RoomRolloffFactor
;
671 alSetError(context
, AL_INVALID_ENUM
);
675 static void eaxreverb_GetParamfv(ALeffect
*effect
, ALCcontext
*context
, ALenum param
, ALfloat
*vals
)
679 case AL_EAXREVERB_REFLECTIONS_PAN
:
680 LockContext(context
);
681 vals
[0] = effect
->Reverb
.ReflectionsPan
[0];
682 vals
[1] = effect
->Reverb
.ReflectionsPan
[1];
683 vals
[2] = effect
->Reverb
.ReflectionsPan
[2];
684 UnlockContext(context
);
686 case AL_EAXREVERB_LATE_REVERB_PAN
:
687 LockContext(context
);
688 vals
[0] = effect
->Reverb
.LateReverbPan
[0];
689 vals
[1] = effect
->Reverb
.LateReverbPan
[1];
690 vals
[2] = effect
->Reverb
.LateReverbPan
[2];
691 UnlockContext(context
);
695 eaxreverb_GetParamf(effect
, context
, param
, vals
);
701 static void reverb_SetParami(ALeffect
*effect
, ALCcontext
*context
, ALenum param
, ALint val
)
705 case AL_REVERB_DECAY_HFLIMIT
:
706 if(val
>= AL_REVERB_MIN_DECAY_HFLIMIT
&&
707 val
<= AL_REVERB_MAX_DECAY_HFLIMIT
)
708 effect
->Reverb
.DecayHFLimit
= val
;
710 alSetError(context
, AL_INVALID_VALUE
);
714 alSetError(context
, AL_INVALID_ENUM
);
718 static void reverb_SetParamiv(ALeffect
*effect
, ALCcontext
*context
, ALenum param
, const ALint
*vals
)
720 reverb_SetParami(effect
, context
, param
, vals
[0]);
722 static void reverb_SetParamf(ALeffect
*effect
, ALCcontext
*context
, ALenum param
, ALfloat val
)
726 case AL_REVERB_DENSITY
:
727 if(val
>= AL_REVERB_MIN_DENSITY
&&
728 val
<= AL_REVERB_MAX_DENSITY
)
729 effect
->Reverb
.Density
= val
;
731 alSetError(context
, AL_INVALID_VALUE
);
734 case AL_REVERB_DIFFUSION
:
735 if(val
>= AL_REVERB_MIN_DIFFUSION
&&
736 val
<= AL_REVERB_MAX_DIFFUSION
)
737 effect
->Reverb
.Diffusion
= val
;
739 alSetError(context
, AL_INVALID_VALUE
);
743 if(val
>= AL_REVERB_MIN_GAIN
&&
744 val
<= AL_REVERB_MAX_GAIN
)
745 effect
->Reverb
.Gain
= val
;
747 alSetError(context
, AL_INVALID_VALUE
);
750 case AL_REVERB_GAINHF
:
751 if(val
>= AL_REVERB_MIN_GAINHF
&&
752 val
<= AL_REVERB_MAX_GAINHF
)
753 effect
->Reverb
.GainHF
= val
;
755 alSetError(context
, AL_INVALID_VALUE
);
758 case AL_REVERB_DECAY_TIME
:
759 if(val
>= AL_REVERB_MIN_DECAY_TIME
&&
760 val
<= AL_REVERB_MAX_DECAY_TIME
)
761 effect
->Reverb
.DecayTime
= val
;
763 alSetError(context
, AL_INVALID_VALUE
);
766 case AL_REVERB_DECAY_HFRATIO
:
767 if(val
>= AL_REVERB_MIN_DECAY_HFRATIO
&&
768 val
<= AL_REVERB_MAX_DECAY_HFRATIO
)
769 effect
->Reverb
.DecayHFRatio
= val
;
771 alSetError(context
, AL_INVALID_VALUE
);
774 case AL_REVERB_REFLECTIONS_GAIN
:
775 if(val
>= AL_REVERB_MIN_REFLECTIONS_GAIN
&&
776 val
<= AL_REVERB_MAX_REFLECTIONS_GAIN
)
777 effect
->Reverb
.ReflectionsGain
= val
;
779 alSetError(context
, AL_INVALID_VALUE
);
782 case AL_REVERB_REFLECTIONS_DELAY
:
783 if(val
>= AL_REVERB_MIN_REFLECTIONS_DELAY
&&
784 val
<= AL_REVERB_MAX_REFLECTIONS_DELAY
)
785 effect
->Reverb
.ReflectionsDelay
= val
;
787 alSetError(context
, AL_INVALID_VALUE
);
790 case AL_REVERB_LATE_REVERB_GAIN
:
791 if(val
>= AL_REVERB_MIN_LATE_REVERB_GAIN
&&
792 val
<= AL_REVERB_MAX_LATE_REVERB_GAIN
)
793 effect
->Reverb
.LateReverbGain
= val
;
795 alSetError(context
, AL_INVALID_VALUE
);
798 case AL_REVERB_LATE_REVERB_DELAY
:
799 if(val
>= AL_REVERB_MIN_LATE_REVERB_DELAY
&&
800 val
<= AL_REVERB_MAX_LATE_REVERB_DELAY
)
801 effect
->Reverb
.LateReverbDelay
= val
;
803 alSetError(context
, AL_INVALID_VALUE
);
806 case AL_REVERB_AIR_ABSORPTION_GAINHF
:
807 if(val
>= AL_REVERB_MIN_AIR_ABSORPTION_GAINHF
&&
808 val
<= AL_REVERB_MAX_AIR_ABSORPTION_GAINHF
)
809 effect
->Reverb
.AirAbsorptionGainHF
= val
;
811 alSetError(context
, AL_INVALID_VALUE
);
814 case AL_REVERB_ROOM_ROLLOFF_FACTOR
:
815 if(val
>= AL_REVERB_MIN_ROOM_ROLLOFF_FACTOR
&&
816 val
<= AL_REVERB_MAX_ROOM_ROLLOFF_FACTOR
)
817 effect
->Reverb
.RoomRolloffFactor
= val
;
819 alSetError(context
, AL_INVALID_VALUE
);
823 alSetError(context
, AL_INVALID_ENUM
);
827 static void reverb_SetParamfv(ALeffect
*effect
, ALCcontext
*context
, ALenum param
, const ALfloat
*vals
)
829 reverb_SetParamf(effect
, context
, param
, vals
[0]);
832 static void reverb_GetParami(ALeffect
*effect
, ALCcontext
*context
, ALenum param
, ALint
*val
)
836 case AL_REVERB_DECAY_HFLIMIT
:
837 *val
= effect
->Reverb
.DecayHFLimit
;
841 alSetError(context
, AL_INVALID_ENUM
);
845 static void reverb_GetParamiv(ALeffect
*effect
, ALCcontext
*context
, ALenum param
, ALint
*vals
)
847 reverb_GetParami(effect
, context
, param
, vals
);
849 static void reverb_GetParamf(ALeffect
*effect
, ALCcontext
*context
, ALenum param
, ALfloat
*val
)
853 case AL_REVERB_DENSITY
:
854 *val
= effect
->Reverb
.Density
;
857 case AL_REVERB_DIFFUSION
:
858 *val
= effect
->Reverb
.Diffusion
;
862 *val
= effect
->Reverb
.Gain
;
865 case AL_REVERB_GAINHF
:
866 *val
= effect
->Reverb
.GainHF
;
869 case AL_REVERB_DECAY_TIME
:
870 *val
= effect
->Reverb
.DecayTime
;
873 case AL_REVERB_DECAY_HFRATIO
:
874 *val
= effect
->Reverb
.DecayHFRatio
;
877 case AL_REVERB_REFLECTIONS_GAIN
:
878 *val
= effect
->Reverb
.ReflectionsGain
;
881 case AL_REVERB_REFLECTIONS_DELAY
:
882 *val
= effect
->Reverb
.ReflectionsDelay
;
885 case AL_REVERB_LATE_REVERB_GAIN
:
886 *val
= effect
->Reverb
.LateReverbGain
;
889 case AL_REVERB_LATE_REVERB_DELAY
:
890 *val
= effect
->Reverb
.LateReverbDelay
;
893 case AL_REVERB_AIR_ABSORPTION_GAINHF
:
894 *val
= effect
->Reverb
.AirAbsorptionGainHF
;
897 case AL_REVERB_ROOM_ROLLOFF_FACTOR
:
898 *val
= effect
->Reverb
.RoomRolloffFactor
;
902 alSetError(context
, AL_INVALID_ENUM
);
906 static void reverb_GetParamfv(ALeffect
*effect
, ALCcontext
*context
, ALenum param
, ALfloat
*vals
)
908 reverb_GetParamf(effect
, context
, param
, vals
);
912 static void echo_SetParami(ALeffect
*effect
, ALCcontext
*context
, ALenum param
, ALint val
)
913 { (void)effect
;(void)param
;(void)val
; alSetError(context
, AL_INVALID_ENUM
); }
914 static void echo_SetParamiv(ALeffect
*effect
, ALCcontext
*context
, ALenum param
, const ALint
*vals
)
916 echo_SetParami(effect
, context
, param
, vals
[0]);
918 static void echo_SetParamf(ALeffect
*effect
, ALCcontext
*context
, ALenum param
, ALfloat val
)
923 if(val
>= AL_ECHO_MIN_DELAY
&& val
<= AL_ECHO_MAX_DELAY
)
924 effect
->Echo
.Delay
= val
;
926 alSetError(context
, AL_INVALID_VALUE
);
929 case AL_ECHO_LRDELAY
:
930 if(val
>= AL_ECHO_MIN_LRDELAY
&& val
<= AL_ECHO_MAX_LRDELAY
)
931 effect
->Echo
.LRDelay
= val
;
933 alSetError(context
, AL_INVALID_VALUE
);
936 case AL_ECHO_DAMPING
:
937 if(val
>= AL_ECHO_MIN_DAMPING
&& val
<= AL_ECHO_MAX_DAMPING
)
938 effect
->Echo
.Damping
= val
;
940 alSetError(context
, AL_INVALID_VALUE
);
943 case AL_ECHO_FEEDBACK
:
944 if(val
>= AL_ECHO_MIN_FEEDBACK
&& val
<= AL_ECHO_MAX_FEEDBACK
)
945 effect
->Echo
.Feedback
= val
;
947 alSetError(context
, AL_INVALID_VALUE
);
951 if(val
>= AL_ECHO_MIN_SPREAD
&& val
<= AL_ECHO_MAX_SPREAD
)
952 effect
->Echo
.Spread
= val
;
954 alSetError(context
, AL_INVALID_VALUE
);
958 alSetError(context
, AL_INVALID_ENUM
);
962 static void echo_SetParamfv(ALeffect
*effect
, ALCcontext
*context
, ALenum param
, const ALfloat
*vals
)
964 echo_SetParamf(effect
, context
, param
, vals
[0]);
967 static void echo_GetParami(ALeffect
*effect
, ALCcontext
*context
, ALenum param
, ALint
*val
)
968 { (void)effect
;(void)param
;(void)val
; alSetError(context
, AL_INVALID_ENUM
); }
969 static void echo_GetParamiv(ALeffect
*effect
, ALCcontext
*context
, ALenum param
, ALint
*vals
)
971 echo_GetParami(effect
, context
, param
, vals
);
973 static void echo_GetParamf(ALeffect
*effect
, ALCcontext
*context
, ALenum param
, ALfloat
*val
)
978 *val
= effect
->Echo
.Delay
;
981 case AL_ECHO_LRDELAY
:
982 *val
= effect
->Echo
.LRDelay
;
985 case AL_ECHO_DAMPING
:
986 *val
= effect
->Echo
.Damping
;
989 case AL_ECHO_FEEDBACK
:
990 *val
= effect
->Echo
.Feedback
;
994 *val
= effect
->Echo
.Spread
;
998 alSetError(context
, AL_INVALID_ENUM
);
1002 static void echo_GetParamfv(ALeffect
*effect
, ALCcontext
*context
, ALenum param
, ALfloat
*vals
)
1004 echo_GetParamf(effect
, context
, param
, vals
);
1008 static void mod_SetParamf(ALeffect
*effect
, ALCcontext
*context
, ALenum param
, ALfloat val
)
1012 case AL_RING_MODULATOR_FREQUENCY
:
1013 if(val
>= AL_RING_MODULATOR_MIN_FREQUENCY
&&
1014 val
<= AL_RING_MODULATOR_MAX_FREQUENCY
)
1015 effect
->Modulator
.Frequency
= val
;
1017 alSetError(context
, AL_INVALID_VALUE
);
1020 case AL_RING_MODULATOR_HIGHPASS_CUTOFF
:
1021 if(val
>= AL_RING_MODULATOR_MIN_HIGHPASS_CUTOFF
&&
1022 val
<= AL_RING_MODULATOR_MAX_HIGHPASS_CUTOFF
)
1023 effect
->Modulator
.HighPassCutoff
= val
;
1025 alSetError(context
, AL_INVALID_VALUE
);
1029 alSetError(context
, AL_INVALID_ENUM
);
1033 static void mod_SetParamfv(ALeffect
*effect
, ALCcontext
*context
, ALenum param
, const ALfloat
*vals
)
1035 mod_SetParamf(effect
, context
, param
, vals
[0]);
1037 static void mod_SetParami(ALeffect
*effect
, ALCcontext
*context
, ALenum param
, ALint val
)
1041 case AL_RING_MODULATOR_FREQUENCY
:
1042 case AL_RING_MODULATOR_HIGHPASS_CUTOFF
:
1043 mod_SetParamf(effect
, context
, param
, (ALfloat
)val
);
1046 case AL_RING_MODULATOR_WAVEFORM
:
1047 if(val
>= AL_RING_MODULATOR_MIN_WAVEFORM
&&
1048 val
<= AL_RING_MODULATOR_MAX_WAVEFORM
)
1049 effect
->Modulator
.Waveform
= val
;
1051 alSetError(context
, AL_INVALID_VALUE
);
1055 alSetError(context
, AL_INVALID_ENUM
);
1059 static void mod_SetParamiv(ALeffect
*effect
, ALCcontext
*context
, ALenum param
, const ALint
*vals
)
1061 mod_SetParami(effect
, context
, param
, vals
[0]);
1064 static void mod_GetParami(ALeffect
*effect
, ALCcontext
*context
, ALenum param
, ALint
*val
)
1068 case AL_RING_MODULATOR_FREQUENCY
:
1069 *val
= (ALint
)effect
->Modulator
.Frequency
;
1071 case AL_RING_MODULATOR_HIGHPASS_CUTOFF
:
1072 *val
= (ALint
)effect
->Modulator
.HighPassCutoff
;
1074 case AL_RING_MODULATOR_WAVEFORM
:
1075 *val
= effect
->Modulator
.Waveform
;
1079 alSetError(context
, AL_INVALID_ENUM
);
1083 static void mod_GetParamiv(ALeffect
*effect
, ALCcontext
*context
, ALenum param
, ALint
*vals
)
1085 mod_GetParami(effect
, context
, param
, vals
);
1087 static void mod_GetParamf(ALeffect
*effect
, ALCcontext
*context
, ALenum param
, ALfloat
*val
)
1091 case AL_RING_MODULATOR_FREQUENCY
:
1092 *val
= effect
->Modulator
.Frequency
;
1094 case AL_RING_MODULATOR_HIGHPASS_CUTOFF
:
1095 *val
= effect
->Modulator
.HighPassCutoff
;
1099 alSetError(context
, AL_INVALID_ENUM
);
1103 static void mod_GetParamfv(ALeffect
*effect
, ALCcontext
*context
, ALenum param
, ALfloat
*vals
)
1105 mod_GetParamf(effect
, context
, param
, vals
);
1109 static void ded_SetParami(ALeffect
*effect
, ALCcontext
*context
, ALenum param
, ALint val
)
1110 { (void)effect
;(void)param
;(void)val
; alSetError(context
, AL_INVALID_ENUM
); }
1111 static void ded_SetParamiv(ALeffect
*effect
, ALCcontext
*context
, ALenum param
, const ALint
*vals
)
1113 ded_SetParami(effect
, context
, param
, vals
[0]);
1115 static void ded_SetParamf(ALeffect
*effect
, ALCcontext
*context
, ALenum param
, ALfloat val
)
1119 case AL_DEDICATED_GAIN
:
1120 if(val
>= 0.0f
&& isfinite(val
))
1121 effect
->Dedicated
.Gain
= val
;
1123 alSetError(context
, AL_INVALID_VALUE
);
1127 alSetError(context
, AL_INVALID_ENUM
);
1131 static void ded_SetParamfv(ALeffect
*effect
, ALCcontext
*context
, ALenum param
, const ALfloat
*vals
)
1133 ded_SetParamf(effect
, context
, param
, vals
[0]);
1136 static void ded_GetParami(ALeffect
*effect
, ALCcontext
*context
, ALenum param
, ALint
*val
)
1137 { (void)effect
;(void)param
;(void)val
; alSetError(context
, AL_INVALID_ENUM
); }
1138 static void ded_GetParamiv(ALeffect
*effect
, ALCcontext
*context
, ALenum param
, ALint
*vals
)
1140 ded_GetParami(effect
, context
, param
, vals
);
1142 static void ded_GetParamf(ALeffect
*effect
, ALCcontext
*context
, ALenum param
, ALfloat
*val
)
1146 case AL_DEDICATED_GAIN
:
1147 *val
= effect
->Dedicated
.Gain
;
1151 alSetError(context
, AL_INVALID_ENUM
);
1155 static void ded_GetParamfv(ALeffect
*effect
, ALCcontext
*context
, ALenum param
, ALfloat
*vals
)
1157 ded_GetParamf(effect
, context
, param
, vals
);
1161 static void null_SetParami(ALeffect
*effect
, ALCcontext
*context
, ALenum param
, ALint val
)
1162 { (void)effect
;(void)param
;(void)val
; alSetError(context
, AL_INVALID_ENUM
); }
1163 static void null_SetParamiv(ALeffect
*effect
, ALCcontext
*context
, ALenum param
, const ALint
*vals
)
1164 { (void)effect
;(void)param
;(void)vals
; alSetError(context
, AL_INVALID_ENUM
); }
1165 static void null_SetParamf(ALeffect
*effect
, ALCcontext
*context
, ALenum param
, ALfloat val
)
1166 { (void)effect
;(void)param
;(void)val
; alSetError(context
, AL_INVALID_ENUM
); }
1167 static void null_SetParamfv(ALeffect
*effect
, ALCcontext
*context
, ALenum param
, const ALfloat
*vals
)
1168 { (void)effect
;(void)param
;(void)vals
; alSetError(context
, AL_INVALID_ENUM
); }
1170 static void null_GetParami(ALeffect
*effect
, ALCcontext
*context
, ALenum param
, ALint
*val
)
1171 { (void)effect
;(void)param
;(void)val
; alSetError(context
, AL_INVALID_ENUM
); }
1172 static void null_GetParamiv(ALeffect
*effect
, ALCcontext
*context
, ALenum param
, ALint
*vals
)
1173 { (void)effect
;(void)param
;(void)vals
; alSetError(context
, AL_INVALID_ENUM
); }
1174 static void null_GetParamf(ALeffect
*effect
, ALCcontext
*context
, ALenum param
, ALfloat
*val
)
1175 { (void)effect
;(void)param
;(void)val
; alSetError(context
, AL_INVALID_ENUM
); }
1176 static void null_GetParamfv(ALeffect
*effect
, ALCcontext
*context
, ALenum param
, ALfloat
*vals
)
1177 { (void)effect
;(void)param
;(void)vals
; alSetError(context
, AL_INVALID_ENUM
); }
1180 ALenum
InitEffect(ALeffect
*effect
)
1182 InitEffectParams(effect
, AL_EFFECT_NULL
);
1186 ALvoid
ReleaseALEffects(ALCdevice
*device
)
1189 for(i
= 0;i
< device
->EffectMap
.size
;i
++)
1191 ALeffect
*temp
= device
->EffectMap
.array
[i
].value
;
1192 device
->EffectMap
.array
[i
].value
= NULL
;
1194 // Release effect structure
1195 FreeThunkEntry(temp
->id
);
1196 memset(temp
, 0, sizeof(ALeffect
));
1202 static void InitEffectParams(ALeffect
*effect
, ALenum type
)
1206 case AL_EFFECT_EAXREVERB
:
1207 effect
->Reverb
.Density
= AL_EAXREVERB_DEFAULT_DENSITY
;
1208 effect
->Reverb
.Diffusion
= AL_EAXREVERB_DEFAULT_DIFFUSION
;
1209 effect
->Reverb
.Gain
= AL_EAXREVERB_DEFAULT_GAIN
;
1210 effect
->Reverb
.GainHF
= AL_EAXREVERB_DEFAULT_GAINHF
;
1211 effect
->Reverb
.GainLF
= AL_EAXREVERB_DEFAULT_GAINLF
;
1212 effect
->Reverb
.DecayTime
= AL_EAXREVERB_DEFAULT_DECAY_TIME
;
1213 effect
->Reverb
.DecayHFRatio
= AL_EAXREVERB_DEFAULT_DECAY_HFRATIO
;
1214 effect
->Reverb
.DecayLFRatio
= AL_EAXREVERB_DEFAULT_DECAY_LFRATIO
;
1215 effect
->Reverb
.ReflectionsGain
= AL_EAXREVERB_DEFAULT_REFLECTIONS_GAIN
;
1216 effect
->Reverb
.ReflectionsDelay
= AL_EAXREVERB_DEFAULT_REFLECTIONS_DELAY
;
1217 effect
->Reverb
.ReflectionsPan
[0] = AL_EAXREVERB_DEFAULT_REFLECTIONS_PAN_XYZ
;
1218 effect
->Reverb
.ReflectionsPan
[1] = AL_EAXREVERB_DEFAULT_REFLECTIONS_PAN_XYZ
;
1219 effect
->Reverb
.ReflectionsPan
[2] = AL_EAXREVERB_DEFAULT_REFLECTIONS_PAN_XYZ
;
1220 effect
->Reverb
.LateReverbGain
= AL_EAXREVERB_DEFAULT_LATE_REVERB_GAIN
;
1221 effect
->Reverb
.LateReverbDelay
= AL_EAXREVERB_DEFAULT_LATE_REVERB_DELAY
;
1222 effect
->Reverb
.LateReverbPan
[0] = AL_EAXREVERB_DEFAULT_LATE_REVERB_PAN_XYZ
;
1223 effect
->Reverb
.LateReverbPan
[1] = AL_EAXREVERB_DEFAULT_LATE_REVERB_PAN_XYZ
;
1224 effect
->Reverb
.LateReverbPan
[2] = AL_EAXREVERB_DEFAULT_LATE_REVERB_PAN_XYZ
;
1225 effect
->Reverb
.EchoTime
= AL_EAXREVERB_DEFAULT_ECHO_TIME
;
1226 effect
->Reverb
.EchoDepth
= AL_EAXREVERB_DEFAULT_ECHO_DEPTH
;
1227 effect
->Reverb
.ModulationTime
= AL_EAXREVERB_DEFAULT_MODULATION_TIME
;
1228 effect
->Reverb
.ModulationDepth
= AL_EAXREVERB_DEFAULT_MODULATION_DEPTH
;
1229 effect
->Reverb
.AirAbsorptionGainHF
= AL_EAXREVERB_DEFAULT_AIR_ABSORPTION_GAINHF
;
1230 effect
->Reverb
.HFReference
= AL_EAXREVERB_DEFAULT_HFREFERENCE
;
1231 effect
->Reverb
.LFReference
= AL_EAXREVERB_DEFAULT_LFREFERENCE
;
1232 effect
->Reverb
.RoomRolloffFactor
= AL_EAXREVERB_DEFAULT_ROOM_ROLLOFF_FACTOR
;
1233 effect
->Reverb
.DecayHFLimit
= AL_EAXREVERB_DEFAULT_DECAY_HFLIMIT
;
1234 effect
->SetParami
= eaxreverb_SetParami
;
1235 effect
->SetParamiv
= eaxreverb_SetParamiv
;
1236 effect
->SetParamf
= eaxreverb_SetParamf
;
1237 effect
->SetParamfv
= eaxreverb_SetParamfv
;
1238 effect
->GetParami
= eaxreverb_GetParami
;
1239 effect
->GetParamiv
= eaxreverb_GetParamiv
;
1240 effect
->GetParamf
= eaxreverb_GetParamf
;
1241 effect
->GetParamfv
= eaxreverb_GetParamfv
;
1243 case AL_EFFECT_REVERB
:
1244 effect
->Reverb
.Density
= AL_REVERB_DEFAULT_DENSITY
;
1245 effect
->Reverb
.Diffusion
= AL_REVERB_DEFAULT_DIFFUSION
;
1246 effect
->Reverb
.Gain
= AL_REVERB_DEFAULT_GAIN
;
1247 effect
->Reverb
.GainHF
= AL_REVERB_DEFAULT_GAINHF
;
1248 effect
->Reverb
.DecayTime
= AL_REVERB_DEFAULT_DECAY_TIME
;
1249 effect
->Reverb
.DecayHFRatio
= AL_REVERB_DEFAULT_DECAY_HFRATIO
;
1250 effect
->Reverb
.ReflectionsGain
= AL_REVERB_DEFAULT_REFLECTIONS_GAIN
;
1251 effect
->Reverb
.ReflectionsDelay
= AL_REVERB_DEFAULT_REFLECTIONS_DELAY
;
1252 effect
->Reverb
.LateReverbGain
= AL_REVERB_DEFAULT_LATE_REVERB_GAIN
;
1253 effect
->Reverb
.LateReverbDelay
= AL_REVERB_DEFAULT_LATE_REVERB_DELAY
;
1254 effect
->Reverb
.AirAbsorptionGainHF
= AL_REVERB_DEFAULT_AIR_ABSORPTION_GAINHF
;
1255 effect
->Reverb
.RoomRolloffFactor
= AL_REVERB_DEFAULT_ROOM_ROLLOFF_FACTOR
;
1256 effect
->Reverb
.DecayHFLimit
= AL_REVERB_DEFAULT_DECAY_HFLIMIT
;
1257 effect
->SetParami
= reverb_SetParami
;
1258 effect
->SetParamiv
= reverb_SetParamiv
;
1259 effect
->SetParamf
= reverb_SetParamf
;
1260 effect
->SetParamfv
= reverb_SetParamfv
;
1261 effect
->GetParami
= reverb_GetParami
;
1262 effect
->GetParamiv
= reverb_GetParamiv
;
1263 effect
->GetParamf
= reverb_GetParamf
;
1264 effect
->GetParamfv
= reverb_GetParamfv
;
1266 case AL_EFFECT_ECHO
:
1267 effect
->Echo
.Delay
= AL_ECHO_DEFAULT_DELAY
;
1268 effect
->Echo
.LRDelay
= AL_ECHO_DEFAULT_LRDELAY
;
1269 effect
->Echo
.Damping
= AL_ECHO_DEFAULT_DAMPING
;
1270 effect
->Echo
.Feedback
= AL_ECHO_DEFAULT_FEEDBACK
;
1271 effect
->Echo
.Spread
= AL_ECHO_DEFAULT_SPREAD
;
1272 effect
->SetParami
= echo_SetParami
;
1273 effect
->SetParamiv
= echo_SetParamiv
;
1274 effect
->SetParamf
= echo_SetParamf
;
1275 effect
->SetParamfv
= echo_SetParamfv
;
1276 effect
->GetParami
= echo_GetParami
;
1277 effect
->GetParamiv
= echo_GetParamiv
;
1278 effect
->GetParamf
= echo_GetParamf
;
1279 effect
->GetParamfv
= echo_GetParamfv
;
1281 case AL_EFFECT_RING_MODULATOR
:
1282 effect
->Modulator
.Frequency
= AL_RING_MODULATOR_DEFAULT_FREQUENCY
;
1283 effect
->Modulator
.HighPassCutoff
= AL_RING_MODULATOR_DEFAULT_HIGHPASS_CUTOFF
;
1284 effect
->Modulator
.Waveform
= AL_RING_MODULATOR_DEFAULT_WAVEFORM
;
1285 effect
->SetParami
= mod_SetParami
;
1286 effect
->SetParamiv
= mod_SetParamiv
;
1287 effect
->SetParamf
= mod_SetParamf
;
1288 effect
->SetParamfv
= mod_SetParamfv
;
1289 effect
->GetParami
= mod_GetParami
;
1290 effect
->GetParamiv
= mod_GetParamiv
;
1291 effect
->GetParamf
= mod_GetParamf
;
1292 effect
->GetParamfv
= mod_GetParamfv
;
1294 case AL_EFFECT_DEDICATED_LOW_FREQUENCY_EFFECT
:
1295 case AL_EFFECT_DEDICATED_DIALOGUE
:
1296 effect
->Dedicated
.Gain
= 1.0f
;
1297 effect
->SetParami
= ded_SetParami
;
1298 effect
->SetParamiv
= ded_SetParamiv
;
1299 effect
->SetParamf
= ded_SetParamf
;
1300 effect
->SetParamfv
= ded_SetParamfv
;
1301 effect
->GetParami
= ded_GetParami
;
1302 effect
->GetParamiv
= ded_GetParamiv
;
1303 effect
->GetParamf
= ded_GetParamf
;
1304 effect
->GetParamfv
= ded_GetParamfv
;
1307 effect
->SetParami
= null_SetParami
;
1308 effect
->SetParamiv
= null_SetParamiv
;
1309 effect
->SetParamf
= null_SetParamf
;
1310 effect
->SetParamfv
= null_SetParamfv
;
1311 effect
->GetParami
= null_GetParami
;
1312 effect
->GetParamiv
= null_GetParamiv
;
1313 effect
->GetParamf
= null_GetParamf
;
1314 effect
->GetParamfv
= null_GetParamfv
;
1317 effect
->type
= type
;
1321 #include "AL/efx-presets.h"
1323 #define DECL(x) { #x, EFX_REVERB_PRESET_##x }
1324 static const struct {
1325 const char name
[32];
1326 EFXEAXREVERBPROPERTIES props
;
1339 DECL(CARPETEDHALLWAY
),
1341 DECL(STONECORRIDOR
),
1355 DECL(CASTLE_SMALLROOM
),
1356 DECL(CASTLE_SHORTPASSAGE
),
1357 DECL(CASTLE_MEDIUMROOM
),
1358 DECL(CASTLE_LARGEROOM
),
1359 DECL(CASTLE_LONGPASSAGE
),
1361 DECL(CASTLE_CUPBOARD
),
1362 DECL(CASTLE_COURTYARD
),
1363 DECL(CASTLE_ALCOVE
),
1365 DECL(FACTORY_SMALLROOM
),
1366 DECL(FACTORY_SHORTPASSAGE
),
1367 DECL(FACTORY_MEDIUMROOM
),
1368 DECL(FACTORY_LARGEROOM
),
1369 DECL(FACTORY_LONGPASSAGE
),
1371 DECL(FACTORY_CUPBOARD
),
1372 DECL(FACTORY_COURTYARD
),
1373 DECL(FACTORY_ALCOVE
),
1375 DECL(ICEPALACE_SMALLROOM
),
1376 DECL(ICEPALACE_SHORTPASSAGE
),
1377 DECL(ICEPALACE_MEDIUMROOM
),
1378 DECL(ICEPALACE_LARGEROOM
),
1379 DECL(ICEPALACE_LONGPASSAGE
),
1380 DECL(ICEPALACE_HALL
),
1381 DECL(ICEPALACE_CUPBOARD
),
1382 DECL(ICEPALACE_COURTYARD
),
1383 DECL(ICEPALACE_ALCOVE
),
1385 DECL(SPACESTATION_SMALLROOM
),
1386 DECL(SPACESTATION_SHORTPASSAGE
),
1387 DECL(SPACESTATION_MEDIUMROOM
),
1388 DECL(SPACESTATION_LARGEROOM
),
1389 DECL(SPACESTATION_LONGPASSAGE
),
1390 DECL(SPACESTATION_HALL
),
1391 DECL(SPACESTATION_CUPBOARD
),
1392 DECL(SPACESTATION_ALCOVE
),
1394 DECL(WOODEN_SMALLROOM
),
1395 DECL(WOODEN_SHORTPASSAGE
),
1396 DECL(WOODEN_MEDIUMROOM
),
1397 DECL(WOODEN_LARGEROOM
),
1398 DECL(WOODEN_LONGPASSAGE
),
1400 DECL(WOODEN_CUPBOARD
),
1401 DECL(WOODEN_COURTYARD
),
1402 DECL(WOODEN_ALCOVE
),
1404 DECL(SPORT_EMPTYSTADIUM
),
1405 DECL(SPORT_SQUASHCOURT
),
1406 DECL(SPORT_SMALLSWIMMINGPOOL
),
1407 DECL(SPORT_LARGESWIMMINGPOOL
),
1408 DECL(SPORT_GYMNASIUM
),
1409 DECL(SPORT_FULLSTADIUM
),
1410 DECL(SPORT_STADIUMTANNOY
),
1412 DECL(PREFAB_WORKSHOP
),
1413 DECL(PREFAB_SCHOOLROOM
),
1414 DECL(PREFAB_PRACTISEROOM
),
1415 DECL(PREFAB_OUTHOUSE
),
1416 DECL(PREFAB_CARAVAN
),
1420 DECL(DOME_SAINTPAULS
),
1421 DECL(PIPE_LONGTHIN
),
1423 DECL(PIPE_RESONANT
),
1425 DECL(OUTDOORS_BACKYARD
),
1426 DECL(OUTDOORS_ROLLINGPLAINS
),
1427 DECL(OUTDOORS_DEEPCANYON
),
1428 DECL(OUTDOORS_CREEK
),
1429 DECL(OUTDOORS_VALLEY
),
1435 DECL(DRIVING_COMMENTATOR
),
1436 DECL(DRIVING_PITGARAGE
),
1437 DECL(DRIVING_INCAR_RACER
),
1438 DECL(DRIVING_INCAR_SPORTS
),
1439 DECL(DRIVING_INCAR_LUXURY
),
1440 DECL(DRIVING_FULLGRANDSTAND
),
1441 DECL(DRIVING_EMPTYGRANDSTAND
),
1442 DECL(DRIVING_TUNNEL
),
1448 DECL(CITY_UNDERPASS
),
1449 DECL(CITY_ABANDONED
),
1453 DECL(SMALLWATERROOM
),
1456 static const ALsizei reverblistsize
= COUNTOF(reverblist
);
1458 ALvoid
LoadReverbPreset(const char *name
, ALeffect
*effect
)
1462 if(strcasecmp(name
, "NONE") == 0)
1464 InitEffectParams(effect
, AL_EFFECT_NULL
);
1465 TRACE("Loading reverb '%s'\n", "NONE");
1469 if(!DisabledEffects
[EAXREVERB
])
1470 InitEffectParams(effect
, AL_EFFECT_EAXREVERB
);
1471 else if(!DisabledEffects
[REVERB
])
1472 InitEffectParams(effect
, AL_EFFECT_REVERB
);
1474 InitEffectParams(effect
, AL_EFFECT_NULL
);
1475 for(i
= 0;i
< reverblistsize
;i
++)
1477 const EFXEAXREVERBPROPERTIES
*props
;
1479 if(strcasecmp(name
, reverblist
[i
].name
) != 0)
1482 TRACE("Loading reverb '%s'\n", reverblist
[i
].name
);
1483 props
= &reverblist
[i
].props
;
1484 effect
->Reverb
.Density
= props
->flDensity
;
1485 effect
->Reverb
.Diffusion
= props
->flDiffusion
;
1486 effect
->Reverb
.Gain
= props
->flGain
;
1487 effect
->Reverb
.GainHF
= props
->flGainHF
;
1488 effect
->Reverb
.GainLF
= props
->flGainLF
;
1489 effect
->Reverb
.DecayTime
= props
->flDecayTime
;
1490 effect
->Reverb
.DecayHFRatio
= props
->flDecayHFRatio
;
1491 effect
->Reverb
.DecayLFRatio
= props
->flDecayLFRatio
;
1492 effect
->Reverb
.ReflectionsGain
= props
->flReflectionsGain
;
1493 effect
->Reverb
.ReflectionsDelay
= props
->flReflectionsDelay
;
1494 effect
->Reverb
.ReflectionsPan
[0] = props
->flReflectionsPan
[0];
1495 effect
->Reverb
.ReflectionsPan
[1] = props
->flReflectionsPan
[1];
1496 effect
->Reverb
.ReflectionsPan
[2] = props
->flReflectionsPan
[2];
1497 effect
->Reverb
.LateReverbGain
= props
->flLateReverbGain
;
1498 effect
->Reverb
.LateReverbDelay
= props
->flLateReverbDelay
;
1499 effect
->Reverb
.LateReverbPan
[0] = props
->flLateReverbPan
[0];
1500 effect
->Reverb
.LateReverbPan
[1] = props
->flLateReverbPan
[1];
1501 effect
->Reverb
.LateReverbPan
[2] = props
->flLateReverbPan
[2];
1502 effect
->Reverb
.EchoTime
= props
->flEchoTime
;
1503 effect
->Reverb
.EchoDepth
= props
->flEchoDepth
;
1504 effect
->Reverb
.ModulationTime
= props
->flModulationTime
;
1505 effect
->Reverb
.ModulationDepth
= props
->flModulationDepth
;
1506 effect
->Reverb
.AirAbsorptionGainHF
= props
->flAirAbsorptionGainHF
;
1507 effect
->Reverb
.HFReference
= props
->flHFReference
;
1508 effect
->Reverb
.LFReference
= props
->flLFReference
;
1509 effect
->Reverb
.RoomRolloffFactor
= props
->flRoomRolloffFactor
;
1510 effect
->Reverb
.DecayHFLimit
= props
->iDecayHFLimit
;
1513 if(i
== reverblistsize
)
1514 WARN("Reverb preset '%s' not found\n", name
);