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
);
39 DECL_VERIFIER(Effect
, ALeffect
, effect
)
41 ALvoid AL_APIENTRY
alGenEffects(ALsizei n
, ALuint
*effects
)
46 Context
= GetContextSuspended();
51 ALCdevice
*device
= Context
->Device
;
53 // Check that enough memory has been allocted in the 'effects' array for n Effects
54 if (!IsBadWritePtr((void*)effects
, n
* sizeof(ALuint
)))
56 ALeffect
**list
= &device
->EffectList
;
58 list
= &(*list
)->next
;
63 *list
= calloc(1, sizeof(ALeffect
));
66 // We must have run out or memory
67 alDeleteEffects(i
, effects
);
68 alSetError(Context
, AL_OUT_OF_MEMORY
);
72 effects
[i
] = (ALuint
)ALTHUNK_ADDENTRY(*list
);
73 (*list
)->effect
= effects
[i
];
75 InitEffectParams(*list
, AL_EFFECT_NULL
);
76 device
->EffectCount
++;
79 list
= &(*list
)->next
;
84 ProcessContext(Context
);
87 ALvoid AL_APIENTRY
alDeleteEffects(ALsizei n
, ALuint
*effects
)
93 Context
= GetContextSuspended();
98 ALCdevice
*device
= Context
->Device
;
100 // Check that all effects are valid
101 for (i
= 0; i
< n
; i
++)
106 if(!VerifyEffect(device
->EffectList
, effects
[i
]))
108 alSetError(Context
, AL_INVALID_NAME
);
115 // All effects are valid
116 for (i
= 0; i
< n
; i
++)
118 // Recheck that the effect is valid, because there could be duplicated names
119 if((ALEffect
=VerifyEffect(device
->EffectList
, effects
[i
])) != NULL
)
123 // Remove Effect from list of effects
124 list
= &device
->EffectList
;
125 while(*list
&& *list
!= ALEffect
)
126 list
= &(*list
)->next
;
129 *list
= (*list
)->next
;
130 ALTHUNK_REMOVEENTRY(ALEffect
->effect
);
132 memset(ALEffect
, 0, sizeof(ALeffect
));
135 device
->EffectCount
--;
141 alSetError(Context
, AL_INVALID_VALUE
);
143 ProcessContext(Context
);
146 ALboolean AL_APIENTRY
alIsEffect(ALuint effect
)
149 ALboolean result
= AL_TRUE
;
151 Context
= GetContextSuspended();
152 if(!Context
) return AL_FALSE
;
155 result
= (VerifyEffect(Context
->Device
->EffectList
, effect
) ?
158 ProcessContext(Context
);
163 ALvoid AL_APIENTRY
alEffecti(ALuint effect
, ALenum param
, ALint iValue
)
169 Context
= GetContextSuspended();
172 Device
= Context
->Device
;
173 if((ALEffect
=VerifyEffect(Device
->EffectList
, effect
)) != NULL
)
175 if(param
== AL_EFFECT_TYPE
)
177 ALboolean isOk
= (iValue
== AL_EFFECT_NULL
||
178 (iValue
== AL_EFFECT_EAXREVERB
&& !DisabledEffects
[EAXREVERB
]) ||
179 (iValue
== AL_EFFECT_REVERB
&& !DisabledEffects
[REVERB
]) ||
180 (iValue
== AL_EFFECT_ECHO
&& !DisabledEffects
[ECHO
]));
183 InitEffectParams(ALEffect
, iValue
);
185 alSetError(Context
, AL_INVALID_VALUE
);
187 else if(ALEffect
->type
== AL_EFFECT_EAXREVERB
)
191 case AL_EAXREVERB_DECAY_HFLIMIT
:
192 if(iValue
>= AL_EAXREVERB_MIN_DECAY_HFLIMIT
&&
193 iValue
<= AL_EAXREVERB_MAX_DECAY_HFLIMIT
)
194 ALEffect
->Reverb
.DecayHFLimit
= iValue
;
196 alSetError(Context
, AL_INVALID_VALUE
);
200 alSetError(Context
, AL_INVALID_ENUM
);
204 else if(ALEffect
->type
== AL_EFFECT_REVERB
)
208 case AL_REVERB_DECAY_HFLIMIT
:
209 if(iValue
>= AL_REVERB_MIN_DECAY_HFLIMIT
&&
210 iValue
<= AL_REVERB_MAX_DECAY_HFLIMIT
)
211 ALEffect
->Reverb
.DecayHFLimit
= iValue
;
213 alSetError(Context
, AL_INVALID_VALUE
);
217 alSetError(Context
, AL_INVALID_ENUM
);
221 else if(ALEffect
->type
== AL_EFFECT_ECHO
)
226 alSetError(Context
, AL_INVALID_ENUM
);
231 alSetError(Context
, AL_INVALID_ENUM
);
234 alSetError(Context
, AL_INVALID_NAME
);
236 ProcessContext(Context
);
239 ALvoid AL_APIENTRY
alEffectiv(ALuint effect
, ALenum param
, ALint
*piValues
)
245 Context
= GetContextSuspended();
248 Device
= Context
->Device
;
249 if((ALEffect
=VerifyEffect(Device
->EffectList
, effect
)) != NULL
)
251 if(param
== AL_EFFECT_TYPE
)
253 alEffecti(effect
, param
, piValues
[0]);
255 else if(ALEffect
->type
== AL_EFFECT_EAXREVERB
)
259 case AL_EAXREVERB_DECAY_HFLIMIT
:
260 alEffecti(effect
, param
, piValues
[0]);
264 alSetError(Context
, AL_INVALID_ENUM
);
268 else if(ALEffect
->type
== AL_EFFECT_REVERB
)
272 case AL_REVERB_DECAY_HFLIMIT
:
273 alEffecti(effect
, param
, piValues
[0]);
277 alSetError(Context
, AL_INVALID_ENUM
);
281 else if(ALEffect
->type
== AL_EFFECT_ECHO
)
286 alSetError(Context
, AL_INVALID_ENUM
);
291 alSetError(Context
, AL_INVALID_ENUM
);
294 alSetError(Context
, AL_INVALID_NAME
);
296 ProcessContext(Context
);
299 ALvoid AL_APIENTRY
alEffectf(ALuint effect
, ALenum param
, ALfloat flValue
)
305 Context
= GetContextSuspended();
308 Device
= Context
->Device
;
309 if((ALEffect
=VerifyEffect(Device
->EffectList
, effect
)) != NULL
)
311 if(ALEffect
->type
== AL_EFFECT_EAXREVERB
)
315 case AL_EAXREVERB_DENSITY
:
316 if(flValue
>= AL_EAXREVERB_MIN_DENSITY
&&
317 flValue
<= AL_EAXREVERB_MAX_DENSITY
)
318 ALEffect
->Reverb
.Density
= flValue
;
320 alSetError(Context
, AL_INVALID_VALUE
);
323 case AL_EAXREVERB_DIFFUSION
:
324 if(flValue
>= AL_EAXREVERB_MIN_DIFFUSION
&&
325 flValue
<= AL_EAXREVERB_MAX_DIFFUSION
)
326 ALEffect
->Reverb
.Diffusion
= flValue
;
328 alSetError(Context
, AL_INVALID_VALUE
);
331 case AL_EAXREVERB_GAIN
:
332 if(flValue
>= AL_EAXREVERB_MIN_GAIN
&&
333 flValue
<= AL_EAXREVERB_MAX_GAIN
)
334 ALEffect
->Reverb
.Gain
= flValue
;
336 alSetError(Context
, AL_INVALID_VALUE
);
339 case AL_EAXREVERB_GAINHF
:
340 if(flValue
>= AL_EAXREVERB_MIN_GAINHF
&&
341 flValue
<= AL_EAXREVERB_MAX_GAIN
)
342 ALEffect
->Reverb
.GainHF
= flValue
;
344 alSetError(Context
, AL_INVALID_VALUE
);
347 case AL_EAXREVERB_GAINLF
:
348 if(flValue
>= AL_EAXREVERB_MIN_GAINLF
&&
349 flValue
<= AL_EAXREVERB_MAX_GAINLF
)
350 ALEffect
->Reverb
.GainLF
= flValue
;
352 alSetError(Context
, AL_INVALID_VALUE
);
355 case AL_EAXREVERB_DECAY_TIME
:
356 if(flValue
>= AL_EAXREVERB_MIN_DECAY_TIME
&&
357 flValue
<= AL_EAXREVERB_MAX_DECAY_TIME
)
358 ALEffect
->Reverb
.DecayTime
= flValue
;
360 alSetError(Context
, AL_INVALID_VALUE
);
363 case AL_EAXREVERB_DECAY_HFRATIO
:
364 if(flValue
>= AL_EAXREVERB_MIN_DECAY_HFRATIO
&&
365 flValue
<= AL_EAXREVERB_MAX_DECAY_HFRATIO
)
366 ALEffect
->Reverb
.DecayHFRatio
= flValue
;
368 alSetError(Context
, AL_INVALID_VALUE
);
371 case AL_EAXREVERB_DECAY_LFRATIO
:
372 if(flValue
>= AL_EAXREVERB_MIN_DECAY_LFRATIO
&&
373 flValue
<= AL_EAXREVERB_MAX_DECAY_LFRATIO
)
374 ALEffect
->Reverb
.DecayLFRatio
= flValue
;
376 alSetError(Context
, AL_INVALID_VALUE
);
379 case AL_EAXREVERB_REFLECTIONS_GAIN
:
380 if(flValue
>= AL_EAXREVERB_MIN_REFLECTIONS_GAIN
&&
381 flValue
<= AL_EAXREVERB_MAX_REFLECTIONS_GAIN
)
382 ALEffect
->Reverb
.ReflectionsGain
= flValue
;
384 alSetError(Context
, AL_INVALID_VALUE
);
387 case AL_EAXREVERB_REFLECTIONS_DELAY
:
388 if(flValue
>= AL_EAXREVERB_MIN_REFLECTIONS_DELAY
&&
389 flValue
<= AL_EAXREVERB_MAX_REFLECTIONS_DELAY
)
390 ALEffect
->Reverb
.ReflectionsDelay
= flValue
;
392 alSetError(Context
, AL_INVALID_VALUE
);
395 case AL_EAXREVERB_LATE_REVERB_GAIN
:
396 if(flValue
>= AL_EAXREVERB_MIN_LATE_REVERB_GAIN
&&
397 flValue
<= AL_EAXREVERB_MAX_LATE_REVERB_GAIN
)
398 ALEffect
->Reverb
.LateReverbGain
= flValue
;
400 alSetError(Context
, AL_INVALID_VALUE
);
403 case AL_EAXREVERB_LATE_REVERB_DELAY
:
404 if(flValue
>= AL_EAXREVERB_MIN_LATE_REVERB_DELAY
&&
405 flValue
<= AL_EAXREVERB_MAX_LATE_REVERB_DELAY
)
406 ALEffect
->Reverb
.LateReverbDelay
= flValue
;
408 alSetError(Context
, AL_INVALID_VALUE
);
411 case AL_EAXREVERB_AIR_ABSORPTION_GAINHF
:
412 if(flValue
>= AL_EAXREVERB_MIN_AIR_ABSORPTION_GAINHF
&&
413 flValue
<= AL_EAXREVERB_MAX_AIR_ABSORPTION_GAINHF
)
414 ALEffect
->Reverb
.AirAbsorptionGainHF
= flValue
;
416 alSetError(Context
, AL_INVALID_VALUE
);
419 case AL_EAXREVERB_ECHO_TIME
:
420 if(flValue
>= AL_EAXREVERB_MIN_ECHO_TIME
&&
421 flValue
<= AL_EAXREVERB_MAX_ECHO_TIME
)
422 ALEffect
->Reverb
.EchoTime
= flValue
;
424 alSetError(Context
, AL_INVALID_VALUE
);
427 case AL_EAXREVERB_ECHO_DEPTH
:
428 if(flValue
>= AL_EAXREVERB_MIN_ECHO_DEPTH
&&
429 flValue
<= AL_EAXREVERB_MAX_ECHO_DEPTH
)
430 ALEffect
->Reverb
.EchoDepth
= flValue
;
432 alSetError(Context
, AL_INVALID_VALUE
);
435 case AL_EAXREVERB_MODULATION_TIME
:
436 if(flValue
>= AL_EAXREVERB_MIN_MODULATION_TIME
&&
437 flValue
<= AL_EAXREVERB_MAX_MODULATION_TIME
)
438 ALEffect
->Reverb
.ModulationTime
= flValue
;
440 alSetError(Context
, AL_INVALID_VALUE
);
443 case AL_EAXREVERB_MODULATION_DEPTH
:
444 if(flValue
>= AL_EAXREVERB_MIN_MODULATION_DEPTH
&&
445 flValue
<= AL_EAXREVERB_MAX_MODULATION_DEPTH
)
446 ALEffect
->Reverb
.ModulationDepth
= flValue
;
448 alSetError(Context
, AL_INVALID_VALUE
);
451 case AL_EAXREVERB_HFREFERENCE
:
452 if(flValue
>= AL_EAXREVERB_MIN_HFREFERENCE
&&
453 flValue
<= AL_EAXREVERB_MAX_HFREFERENCE
)
454 ALEffect
->Reverb
.HFReference
= flValue
;
456 alSetError(Context
, AL_INVALID_VALUE
);
459 case AL_EAXREVERB_LFREFERENCE
:
460 if(flValue
>= AL_EAXREVERB_MIN_LFREFERENCE
&&
461 flValue
<= AL_EAXREVERB_MAX_LFREFERENCE
)
462 ALEffect
->Reverb
.LFReference
= flValue
;
464 alSetError(Context
, AL_INVALID_VALUE
);
467 case AL_EAXREVERB_ROOM_ROLLOFF_FACTOR
:
468 if(flValue
>= 0.0f
&& flValue
<= 10.0f
)
469 ALEffect
->Reverb
.RoomRolloffFactor
= flValue
;
471 alSetError(Context
, AL_INVALID_VALUE
);
475 alSetError(Context
, AL_INVALID_ENUM
);
479 else if(ALEffect
->type
== AL_EFFECT_REVERB
)
483 case AL_REVERB_DENSITY
:
484 if(flValue
>= AL_REVERB_MIN_DENSITY
&&
485 flValue
<= AL_REVERB_MAX_DENSITY
)
486 ALEffect
->Reverb
.Density
= flValue
;
488 alSetError(Context
, AL_INVALID_VALUE
);
491 case AL_REVERB_DIFFUSION
:
492 if(flValue
>= AL_REVERB_MIN_DIFFUSION
&&
493 flValue
<= AL_REVERB_MAX_DIFFUSION
)
494 ALEffect
->Reverb
.Diffusion
= flValue
;
496 alSetError(Context
, AL_INVALID_VALUE
);
500 if(flValue
>= AL_REVERB_MIN_GAIN
&&
501 flValue
<= AL_REVERB_MAX_GAIN
)
502 ALEffect
->Reverb
.Gain
= flValue
;
504 alSetError(Context
, AL_INVALID_VALUE
);
507 case AL_REVERB_GAINHF
:
508 if(flValue
>= AL_REVERB_MIN_GAINHF
&&
509 flValue
<= AL_REVERB_MAX_GAINHF
)
510 ALEffect
->Reverb
.GainHF
= flValue
;
512 alSetError(Context
, AL_INVALID_VALUE
);
515 case AL_REVERB_DECAY_TIME
:
516 if(flValue
>= AL_REVERB_MIN_DECAY_TIME
&&
517 flValue
<= AL_REVERB_MAX_DECAY_TIME
)
518 ALEffect
->Reverb
.DecayTime
= flValue
;
520 alSetError(Context
, AL_INVALID_VALUE
);
523 case AL_REVERB_DECAY_HFRATIO
:
524 if(flValue
>= AL_REVERB_MIN_DECAY_HFRATIO
&&
525 flValue
<= AL_REVERB_MAX_DECAY_HFRATIO
)
526 ALEffect
->Reverb
.DecayHFRatio
= flValue
;
528 alSetError(Context
, AL_INVALID_VALUE
);
531 case AL_REVERB_REFLECTIONS_GAIN
:
532 if(flValue
>= AL_REVERB_MIN_REFLECTIONS_GAIN
&&
533 flValue
<= AL_REVERB_MAX_REFLECTIONS_GAIN
)
534 ALEffect
->Reverb
.ReflectionsGain
= flValue
;
536 alSetError(Context
, AL_INVALID_VALUE
);
539 case AL_REVERB_REFLECTIONS_DELAY
:
540 if(flValue
>= AL_REVERB_MIN_REFLECTIONS_DELAY
&&
541 flValue
<= AL_REVERB_MAX_REFLECTIONS_DELAY
)
542 ALEffect
->Reverb
.ReflectionsDelay
= flValue
;
544 alSetError(Context
, AL_INVALID_VALUE
);
547 case AL_REVERB_LATE_REVERB_GAIN
:
548 if(flValue
>= AL_REVERB_MIN_LATE_REVERB_GAIN
&&
549 flValue
<= AL_REVERB_MAX_LATE_REVERB_GAIN
)
550 ALEffect
->Reverb
.LateReverbGain
= flValue
;
552 alSetError(Context
, AL_INVALID_VALUE
);
555 case AL_REVERB_LATE_REVERB_DELAY
:
556 if(flValue
>= AL_REVERB_MIN_LATE_REVERB_DELAY
&&
557 flValue
<= AL_REVERB_MAX_LATE_REVERB_DELAY
)
558 ALEffect
->Reverb
.LateReverbDelay
= flValue
;
560 alSetError(Context
, AL_INVALID_VALUE
);
563 case AL_REVERB_AIR_ABSORPTION_GAINHF
:
564 if(flValue
>= AL_REVERB_MIN_AIR_ABSORPTION_GAINHF
&&
565 flValue
<= AL_REVERB_MAX_AIR_ABSORPTION_GAINHF
)
566 ALEffect
->Reverb
.AirAbsorptionGainHF
= flValue
;
568 alSetError(Context
, AL_INVALID_VALUE
);
571 case AL_REVERB_ROOM_ROLLOFF_FACTOR
:
572 if(flValue
>= AL_REVERB_MIN_ROOM_ROLLOFF_FACTOR
&&
573 flValue
<= AL_REVERB_MAX_ROOM_ROLLOFF_FACTOR
)
574 ALEffect
->Reverb
.RoomRolloffFactor
= flValue
;
576 alSetError(Context
, AL_INVALID_VALUE
);
580 alSetError(Context
, AL_INVALID_ENUM
);
584 else if(ALEffect
->type
== AL_EFFECT_ECHO
)
589 if(flValue
>= AL_ECHO_MIN_DELAY
&& flValue
<= AL_ECHO_MAX_DELAY
)
590 ALEffect
->Echo
.Delay
= flValue
;
592 alSetError(Context
, AL_INVALID_VALUE
);
595 case AL_ECHO_LRDELAY
:
596 if(flValue
>= AL_ECHO_MIN_LRDELAY
&& flValue
<= AL_ECHO_MAX_LRDELAY
)
597 ALEffect
->Echo
.LRDelay
= flValue
;
599 alSetError(Context
, AL_INVALID_VALUE
);
602 case AL_ECHO_DAMPING
:
603 if(flValue
>= AL_ECHO_MIN_DAMPING
&& flValue
<= AL_ECHO_MAX_DAMPING
)
604 ALEffect
->Echo
.Damping
= flValue
;
606 alSetError(Context
, AL_INVALID_VALUE
);
609 case AL_ECHO_FEEDBACK
:
610 if(flValue
>= AL_ECHO_MIN_FEEDBACK
&& flValue
<= AL_ECHO_MAX_FEEDBACK
)
611 ALEffect
->Echo
.Feedback
= flValue
;
613 alSetError(Context
, AL_INVALID_VALUE
);
617 if(flValue
>= AL_ECHO_MIN_SPREAD
&& flValue
<= AL_ECHO_MAX_SPREAD
)
618 ALEffect
->Echo
.Spread
= flValue
;
620 alSetError(Context
, AL_INVALID_VALUE
);
624 alSetError(Context
, AL_INVALID_ENUM
);
629 alSetError(Context
, AL_INVALID_ENUM
);
632 alSetError(Context
, AL_INVALID_NAME
);
634 ProcessContext(Context
);
637 ALvoid AL_APIENTRY
alEffectfv(ALuint effect
, ALenum param
, ALfloat
*pflValues
)
643 Context
= GetContextSuspended();
646 Device
= Context
->Device
;
647 if((ALEffect
=VerifyEffect(Device
->EffectList
, effect
)) != NULL
)
649 if(ALEffect
->type
== AL_EFFECT_EAXREVERB
)
653 case AL_EAXREVERB_DENSITY
:
654 case AL_EAXREVERB_DIFFUSION
:
655 case AL_EAXREVERB_GAIN
:
656 case AL_EAXREVERB_GAINHF
:
657 case AL_EAXREVERB_GAINLF
:
658 case AL_EAXREVERB_DECAY_TIME
:
659 case AL_EAXREVERB_DECAY_HFRATIO
:
660 case AL_EAXREVERB_DECAY_LFRATIO
:
661 case AL_EAXREVERB_REFLECTIONS_GAIN
:
662 case AL_EAXREVERB_REFLECTIONS_DELAY
:
663 case AL_EAXREVERB_LATE_REVERB_GAIN
:
664 case AL_EAXREVERB_LATE_REVERB_DELAY
:
665 case AL_EAXREVERB_AIR_ABSORPTION_GAINHF
:
666 case AL_EAXREVERB_ECHO_TIME
:
667 case AL_EAXREVERB_ECHO_DEPTH
:
668 case AL_EAXREVERB_MODULATION_TIME
:
669 case AL_EAXREVERB_MODULATION_DEPTH
:
670 case AL_EAXREVERB_HFREFERENCE
:
671 case AL_EAXREVERB_LFREFERENCE
:
672 case AL_EAXREVERB_ROOM_ROLLOFF_FACTOR
:
673 alEffectf(effect
, param
, pflValues
[0]);
676 case AL_EAXREVERB_REFLECTIONS_PAN
:
677 if(!isnan(pflValues
[0]) && !isnan(pflValues
[1]) && !isnan(pflValues
[2]))
679 ALEffect
->Reverb
.ReflectionsPan
[0] = pflValues
[0];
680 ALEffect
->Reverb
.ReflectionsPan
[1] = pflValues
[1];
681 ALEffect
->Reverb
.ReflectionsPan
[2] = pflValues
[2];
684 alSetError(Context
, AL_INVALID_VALUE
);
686 case AL_EAXREVERB_LATE_REVERB_PAN
:
687 if(!isnan(pflValues
[0]) && !isnan(pflValues
[1]) && !isnan(pflValues
[2]))
689 ALEffect
->Reverb
.LateReverbPan
[0] = pflValues
[0];
690 ALEffect
->Reverb
.LateReverbPan
[1] = pflValues
[1];
691 ALEffect
->Reverb
.LateReverbPan
[2] = pflValues
[2];
694 alSetError(Context
, AL_INVALID_VALUE
);
698 alSetError(Context
, AL_INVALID_ENUM
);
702 else if(ALEffect
->type
== AL_EFFECT_REVERB
)
706 case AL_REVERB_DENSITY
:
707 case AL_REVERB_DIFFUSION
:
709 case AL_REVERB_GAINHF
:
710 case AL_REVERB_DECAY_TIME
:
711 case AL_REVERB_DECAY_HFRATIO
:
712 case AL_REVERB_REFLECTIONS_GAIN
:
713 case AL_REVERB_REFLECTIONS_DELAY
:
714 case AL_REVERB_LATE_REVERB_GAIN
:
715 case AL_REVERB_LATE_REVERB_DELAY
:
716 case AL_REVERB_AIR_ABSORPTION_GAINHF
:
717 case AL_REVERB_ROOM_ROLLOFF_FACTOR
:
718 alEffectf(effect
, param
, pflValues
[0]);
722 alSetError(Context
, AL_INVALID_ENUM
);
726 else if(ALEffect
->type
== AL_EFFECT_ECHO
)
731 case AL_ECHO_LRDELAY
:
732 case AL_ECHO_DAMPING
:
733 case AL_ECHO_FEEDBACK
:
735 alEffectf(effect
, param
, pflValues
[0]);
739 alSetError(Context
, AL_INVALID_ENUM
);
744 alSetError(Context
, AL_INVALID_ENUM
);
747 alSetError(Context
, AL_INVALID_NAME
);
749 ProcessContext(Context
);
752 ALvoid AL_APIENTRY
alGetEffecti(ALuint effect
, ALenum param
, ALint
*piValue
)
758 Context
= GetContextSuspended();
761 Device
= Context
->Device
;
762 if((ALEffect
=VerifyEffect(Device
->EffectList
, effect
)) != NULL
)
764 if(param
== AL_EFFECT_TYPE
)
766 *piValue
= ALEffect
->type
;
768 else if(ALEffect
->type
== AL_EFFECT_EAXREVERB
)
772 case AL_EAXREVERB_DECAY_HFLIMIT
:
773 *piValue
= ALEffect
->Reverb
.DecayHFLimit
;
777 alSetError(Context
, AL_INVALID_ENUM
);
781 else if(ALEffect
->type
== AL_EFFECT_REVERB
)
785 case AL_REVERB_DECAY_HFLIMIT
:
786 *piValue
= ALEffect
->Reverb
.DecayHFLimit
;
790 alSetError(Context
, AL_INVALID_ENUM
);
794 else if(ALEffect
->type
== AL_EFFECT_ECHO
)
799 alSetError(Context
, AL_INVALID_ENUM
);
804 alSetError(Context
, AL_INVALID_ENUM
);
807 alSetError(Context
, AL_INVALID_NAME
);
809 ProcessContext(Context
);
812 ALvoid AL_APIENTRY
alGetEffectiv(ALuint effect
, ALenum param
, ALint
*piValues
)
818 Context
= GetContextSuspended();
821 Device
= Context
->Device
;
822 if((ALEffect
=VerifyEffect(Device
->EffectList
, effect
)) != NULL
)
824 if(param
== AL_EFFECT_TYPE
)
826 alGetEffecti(effect
, param
, piValues
);
828 else if(ALEffect
->type
== AL_EFFECT_EAXREVERB
)
832 case AL_EAXREVERB_DECAY_HFLIMIT
:
833 alGetEffecti(effect
, param
, piValues
);
837 alSetError(Context
, AL_INVALID_ENUM
);
841 else if(ALEffect
->type
== AL_EFFECT_REVERB
)
845 case AL_REVERB_DECAY_HFLIMIT
:
846 alGetEffecti(effect
, param
, piValues
);
850 alSetError(Context
, AL_INVALID_ENUM
);
854 else if(ALEffect
->type
== AL_EFFECT_ECHO
)
859 alSetError(Context
, AL_INVALID_ENUM
);
864 alSetError(Context
, AL_INVALID_ENUM
);
867 alSetError(Context
, AL_INVALID_NAME
);
869 ProcessContext(Context
);
872 ALvoid AL_APIENTRY
alGetEffectf(ALuint effect
, ALenum param
, ALfloat
*pflValue
)
878 Context
= GetContextSuspended();
881 Device
= Context
->Device
;
882 if((ALEffect
=VerifyEffect(Device
->EffectList
, effect
)) != NULL
)
884 if(ALEffect
->type
== AL_EFFECT_EAXREVERB
)
888 case AL_EAXREVERB_DENSITY
:
889 *pflValue
= ALEffect
->Reverb
.Density
;
892 case AL_EAXREVERB_DIFFUSION
:
893 *pflValue
= ALEffect
->Reverb
.Diffusion
;
896 case AL_EAXREVERB_GAIN
:
897 *pflValue
= ALEffect
->Reverb
.Gain
;
900 case AL_EAXREVERB_GAINHF
:
901 *pflValue
= ALEffect
->Reverb
.GainHF
;
904 case AL_EAXREVERB_GAINLF
:
905 *pflValue
= ALEffect
->Reverb
.GainLF
;
908 case AL_EAXREVERB_DECAY_TIME
:
909 *pflValue
= ALEffect
->Reverb
.DecayTime
;
912 case AL_EAXREVERB_DECAY_HFRATIO
:
913 *pflValue
= ALEffect
->Reverb
.DecayHFRatio
;
916 case AL_EAXREVERB_DECAY_LFRATIO
:
917 *pflValue
= ALEffect
->Reverb
.DecayLFRatio
;
920 case AL_EAXREVERB_REFLECTIONS_GAIN
:
921 *pflValue
= ALEffect
->Reverb
.ReflectionsGain
;
924 case AL_EAXREVERB_REFLECTIONS_DELAY
:
925 *pflValue
= ALEffect
->Reverb
.ReflectionsDelay
;
928 case AL_EAXREVERB_LATE_REVERB_GAIN
:
929 *pflValue
= ALEffect
->Reverb
.LateReverbGain
;
932 case AL_EAXREVERB_LATE_REVERB_DELAY
:
933 *pflValue
= ALEffect
->Reverb
.LateReverbDelay
;
936 case AL_EAXREVERB_AIR_ABSORPTION_GAINHF
:
937 *pflValue
= ALEffect
->Reverb
.AirAbsorptionGainHF
;
940 case AL_EAXREVERB_ECHO_TIME
:
941 *pflValue
= ALEffect
->Reverb
.EchoTime
;
944 case AL_EAXREVERB_ECHO_DEPTH
:
945 *pflValue
= ALEffect
->Reverb
.EchoDepth
;
948 case AL_EAXREVERB_MODULATION_TIME
:
949 *pflValue
= ALEffect
->Reverb
.ModulationTime
;
952 case AL_EAXREVERB_MODULATION_DEPTH
:
953 *pflValue
= ALEffect
->Reverb
.ModulationDepth
;
956 case AL_EAXREVERB_HFREFERENCE
:
957 *pflValue
= ALEffect
->Reverb
.HFReference
;
960 case AL_EAXREVERB_LFREFERENCE
:
961 *pflValue
= ALEffect
->Reverb
.LFReference
;
964 case AL_EAXREVERB_ROOM_ROLLOFF_FACTOR
:
965 *pflValue
= ALEffect
->Reverb
.RoomRolloffFactor
;
969 alSetError(Context
, AL_INVALID_ENUM
);
973 else if(ALEffect
->type
== AL_EFFECT_REVERB
)
977 case AL_REVERB_DENSITY
:
978 *pflValue
= ALEffect
->Reverb
.Density
;
981 case AL_REVERB_DIFFUSION
:
982 *pflValue
= ALEffect
->Reverb
.Diffusion
;
986 *pflValue
= ALEffect
->Reverb
.Gain
;
989 case AL_REVERB_GAINHF
:
990 *pflValue
= ALEffect
->Reverb
.GainHF
;
993 case AL_REVERB_DECAY_TIME
:
994 *pflValue
= ALEffect
->Reverb
.DecayTime
;
997 case AL_REVERB_DECAY_HFRATIO
:
998 *pflValue
= ALEffect
->Reverb
.DecayHFRatio
;
1001 case AL_REVERB_REFLECTIONS_GAIN
:
1002 *pflValue
= ALEffect
->Reverb
.ReflectionsGain
;
1005 case AL_REVERB_REFLECTIONS_DELAY
:
1006 *pflValue
= ALEffect
->Reverb
.ReflectionsDelay
;
1009 case AL_REVERB_LATE_REVERB_GAIN
:
1010 *pflValue
= ALEffect
->Reverb
.LateReverbGain
;
1013 case AL_REVERB_LATE_REVERB_DELAY
:
1014 *pflValue
= ALEffect
->Reverb
.LateReverbDelay
;
1017 case AL_REVERB_AIR_ABSORPTION_GAINHF
:
1018 *pflValue
= ALEffect
->Reverb
.AirAbsorptionGainHF
;
1021 case AL_REVERB_ROOM_ROLLOFF_FACTOR
:
1022 *pflValue
= ALEffect
->Reverb
.RoomRolloffFactor
;
1026 alSetError(Context
, AL_INVALID_ENUM
);
1030 else if(ALEffect
->type
== AL_EFFECT_ECHO
)
1035 *pflValue
= ALEffect
->Echo
.Delay
;
1038 case AL_ECHO_LRDELAY
:
1039 *pflValue
= ALEffect
->Echo
.LRDelay
;
1042 case AL_ECHO_DAMPING
:
1043 *pflValue
= ALEffect
->Echo
.Damping
;
1046 case AL_ECHO_FEEDBACK
:
1047 *pflValue
= ALEffect
->Echo
.Feedback
;
1050 case AL_ECHO_SPREAD
:
1051 *pflValue
= ALEffect
->Echo
.Spread
;
1055 alSetError(Context
, AL_INVALID_ENUM
);
1060 alSetError(Context
, AL_INVALID_ENUM
);
1063 alSetError(Context
, AL_INVALID_NAME
);
1065 ProcessContext(Context
);
1068 ALvoid AL_APIENTRY
alGetEffectfv(ALuint effect
, ALenum param
, ALfloat
*pflValues
)
1070 ALCcontext
*Context
;
1074 Context
= GetContextSuspended();
1075 if(!Context
) return;
1077 Device
= Context
->Device
;
1078 if((ALEffect
=VerifyEffect(Device
->EffectList
, effect
)) != NULL
)
1080 if(ALEffect
->type
== AL_EFFECT_EAXREVERB
)
1084 case AL_EAXREVERB_DENSITY
:
1085 case AL_EAXREVERB_DIFFUSION
:
1086 case AL_EAXREVERB_GAIN
:
1087 case AL_EAXREVERB_GAINHF
:
1088 case AL_EAXREVERB_GAINLF
:
1089 case AL_EAXREVERB_DECAY_TIME
:
1090 case AL_EAXREVERB_DECAY_HFRATIO
:
1091 case AL_EAXREVERB_DECAY_LFRATIO
:
1092 case AL_EAXREVERB_REFLECTIONS_GAIN
:
1093 case AL_EAXREVERB_REFLECTIONS_DELAY
:
1094 case AL_EAXREVERB_LATE_REVERB_GAIN
:
1095 case AL_EAXREVERB_LATE_REVERB_DELAY
:
1096 case AL_EAXREVERB_AIR_ABSORPTION_GAINHF
:
1097 case AL_EAXREVERB_ECHO_TIME
:
1098 case AL_EAXREVERB_ECHO_DEPTH
:
1099 case AL_EAXREVERB_MODULATION_TIME
:
1100 case AL_EAXREVERB_MODULATION_DEPTH
:
1101 case AL_EAXREVERB_HFREFERENCE
:
1102 case AL_EAXREVERB_LFREFERENCE
:
1103 case AL_EAXREVERB_ROOM_ROLLOFF_FACTOR
:
1104 alGetEffectf(effect
, param
, pflValues
);
1107 case AL_EAXREVERB_REFLECTIONS_PAN
:
1108 pflValues
[0] = ALEffect
->Reverb
.ReflectionsPan
[0];
1109 pflValues
[1] = ALEffect
->Reverb
.ReflectionsPan
[1];
1110 pflValues
[2] = ALEffect
->Reverb
.ReflectionsPan
[2];
1112 case AL_EAXREVERB_LATE_REVERB_PAN
:
1113 pflValues
[0] = ALEffect
->Reverb
.LateReverbPan
[0];
1114 pflValues
[1] = ALEffect
->Reverb
.LateReverbPan
[1];
1115 pflValues
[2] = ALEffect
->Reverb
.LateReverbPan
[2];
1119 alSetError(Context
, AL_INVALID_ENUM
);
1123 else if(ALEffect
->type
== AL_EFFECT_REVERB
)
1127 case AL_REVERB_DENSITY
:
1128 case AL_REVERB_DIFFUSION
:
1129 case AL_REVERB_GAIN
:
1130 case AL_REVERB_GAINHF
:
1131 case AL_REVERB_DECAY_TIME
:
1132 case AL_REVERB_DECAY_HFRATIO
:
1133 case AL_REVERB_REFLECTIONS_GAIN
:
1134 case AL_REVERB_REFLECTIONS_DELAY
:
1135 case AL_REVERB_LATE_REVERB_GAIN
:
1136 case AL_REVERB_LATE_REVERB_DELAY
:
1137 case AL_REVERB_AIR_ABSORPTION_GAINHF
:
1138 case AL_REVERB_ROOM_ROLLOFF_FACTOR
:
1139 alGetEffectf(effect
, param
, pflValues
);
1143 alSetError(Context
, AL_INVALID_ENUM
);
1147 else if(ALEffect
->type
== AL_EFFECT_ECHO
)
1152 case AL_ECHO_LRDELAY
:
1153 case AL_ECHO_DAMPING
:
1154 case AL_ECHO_FEEDBACK
:
1155 case AL_ECHO_SPREAD
:
1156 alGetEffectf(effect
, param
, pflValues
);
1160 alSetError(Context
, AL_INVALID_ENUM
);
1165 alSetError(Context
, AL_INVALID_ENUM
);
1168 alSetError(Context
, AL_INVALID_NAME
);
1170 ProcessContext(Context
);
1174 ALvoid
ReleaseALEffects(ALCdevice
*device
)
1176 ALeffect
*list
= device
->EffectList
;
1179 ALeffect
*temp
= list
;
1182 // Release effect structure
1183 memset(temp
, 0, sizeof(ALeffect
));
1186 device
->EffectList
= NULL
;
1187 device
->EffectCount
= 0;
1191 static void InitEffectParams(ALeffect
*effect
, ALenum type
)
1193 effect
->type
= type
;
1196 /* NOTE: Standard reverb and EAX reverb use the same defaults for the
1197 * shared parameters, and EAX's additional parameters default to
1198 * values assumed by standard reverb.
1200 case AL_EFFECT_EAXREVERB
:
1201 case AL_EFFECT_REVERB
:
1202 effect
->Reverb
.Density
= AL_EAXREVERB_DEFAULT_DENSITY
;
1203 effect
->Reverb
.Diffusion
= AL_EAXREVERB_DEFAULT_DIFFUSION
;
1204 effect
->Reverb
.Gain
= AL_EAXREVERB_DEFAULT_GAIN
;
1205 effect
->Reverb
.GainHF
= AL_EAXREVERB_DEFAULT_GAINHF
;
1206 effect
->Reverb
.GainLF
= AL_EAXREVERB_DEFAULT_GAINLF
;
1207 effect
->Reverb
.DecayTime
= AL_EAXREVERB_DEFAULT_DECAY_TIME
;
1208 effect
->Reverb
.DecayHFRatio
= AL_EAXREVERB_DEFAULT_DECAY_HFRATIO
;
1209 effect
->Reverb
.DecayLFRatio
= AL_EAXREVERB_DEFAULT_DECAY_LFRATIO
;
1210 effect
->Reverb
.ReflectionsGain
= AL_EAXREVERB_DEFAULT_REFLECTIONS_GAIN
;
1211 effect
->Reverb
.ReflectionsDelay
= AL_EAXREVERB_DEFAULT_REFLECTIONS_DELAY
;
1212 effect
->Reverb
.ReflectionsPan
[0] = AL_EAXREVERB_DEFAULT_REFLECTIONS_PAN_XYZ
;
1213 effect
->Reverb
.ReflectionsPan
[1] = AL_EAXREVERB_DEFAULT_REFLECTIONS_PAN_XYZ
;
1214 effect
->Reverb
.ReflectionsPan
[2] = AL_EAXREVERB_DEFAULT_REFLECTIONS_PAN_XYZ
;
1215 effect
->Reverb
.LateReverbGain
= AL_EAXREVERB_DEFAULT_LATE_REVERB_GAIN
;
1216 effect
->Reverb
.LateReverbDelay
= AL_EAXREVERB_DEFAULT_LATE_REVERB_DELAY
;
1217 effect
->Reverb
.LateReverbPan
[0] = AL_EAXREVERB_DEFAULT_LATE_REVERB_PAN_XYZ
;
1218 effect
->Reverb
.LateReverbPan
[1] = AL_EAXREVERB_DEFAULT_LATE_REVERB_PAN_XYZ
;
1219 effect
->Reverb
.LateReverbPan
[2] = AL_EAXREVERB_DEFAULT_LATE_REVERB_PAN_XYZ
;
1220 effect
->Reverb
.EchoTime
= AL_EAXREVERB_DEFAULT_ECHO_TIME
;
1221 effect
->Reverb
.EchoDepth
= AL_EAXREVERB_DEFAULT_ECHO_DEPTH
;
1222 effect
->Reverb
.ModulationTime
= AL_EAXREVERB_DEFAULT_MODULATION_TIME
;
1223 effect
->Reverb
.ModulationDepth
= AL_EAXREVERB_DEFAULT_MODULATION_DEPTH
;
1224 effect
->Reverb
.AirAbsorptionGainHF
= AL_EAXREVERB_DEFAULT_AIR_ABSORPTION_GAINHF
;
1225 effect
->Reverb
.HFReference
= AL_EAXREVERB_DEFAULT_HFREFERENCE
;
1226 effect
->Reverb
.LFReference
= AL_EAXREVERB_DEFAULT_LFREFERENCE
;
1227 effect
->Reverb
.RoomRolloffFactor
= AL_EAXREVERB_DEFAULT_ROOM_ROLLOFF_FACTOR
;
1228 effect
->Reverb
.DecayHFLimit
= AL_EAXREVERB_DEFAULT_DECAY_HFLIMIT
;
1230 case AL_EFFECT_ECHO
:
1231 effect
->Echo
.Delay
= AL_ECHO_DEFAULT_DELAY
;
1232 effect
->Echo
.LRDelay
= AL_ECHO_DEFAULT_LRDELAY
;
1233 effect
->Echo
.Damping
= AL_ECHO_DEFAULT_DAMPING
;
1234 effect
->Echo
.Feedback
= AL_ECHO_DEFAULT_FEEDBACK
;
1235 effect
->Echo
.Spread
= AL_ECHO_DEFAULT_SPREAD
;