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 ALvoid AL_APIENTRY
alGenEffects(ALsizei n
, ALuint
*effects
)
45 Context
= GetContextSuspended();
49 ALCdevice
*device
= Context
->Device
;
51 // Check that enough memory has been allocted in the 'effects' array for n Effects
52 if (!IsBadWritePtr((void*)effects
, n
* sizeof(ALuint
)))
54 ALeffect
**list
= &device
->EffectList
;
56 list
= &(*list
)->next
;
61 *list
= calloc(1, sizeof(ALeffect
));
64 // We must have run out or memory
65 alDeleteEffects(i
, effects
);
66 alSetError(AL_OUT_OF_MEMORY
);
70 effects
[i
] = (ALuint
)ALTHUNK_ADDENTRY(*list
);
71 (*list
)->effect
= effects
[i
];
73 InitEffectParams(*list
, AL_EFFECT_NULL
);
74 device
->EffectCount
++;
77 list
= &(*list
)->next
;
82 ProcessContext(Context
);
85 ALvoid AL_APIENTRY
alDeleteEffects(ALsizei n
, ALuint
*effects
)
91 Context
= GetContextSuspended();
95 ALCdevice
*device
= Context
->Device
;
97 // Check that all effects are valid
98 for (i
= 0; i
< n
; i
++)
100 if (!alIsEffect(effects
[i
]))
102 alSetError(AL_INVALID_NAME
);
109 // All effects are valid
110 for (i
= 0; i
< n
; i
++)
112 // Recheck that the effect is valid, because there could be duplicated names
113 if (effects
[i
] && alIsEffect(effects
[i
]))
117 ALEffect
= ((ALeffect
*)ALTHUNK_LOOKUPENTRY(effects
[i
]));
119 // Remove Source from list of Sources
120 list
= &device
->EffectList
;
121 while(*list
&& *list
!= ALEffect
)
122 list
= &(*list
)->next
;
125 *list
= (*list
)->next
;
126 ALTHUNK_REMOVEENTRY(ALEffect
->effect
);
128 memset(ALEffect
, 0, sizeof(ALeffect
));
131 device
->EffectCount
--;
137 alSetError(AL_INVALID_VALUE
);
139 ProcessContext(Context
);
142 ALboolean AL_APIENTRY
alIsEffect(ALuint effect
)
147 Context
= GetContextSuspended();
149 list
= Context
->Device
->EffectList
;
150 while(list
&& list
->effect
!= effect
)
153 ProcessContext(Context
);
155 return ((list
|| !effect
) ? AL_TRUE
: AL_FALSE
);
158 ALvoid AL_APIENTRY
alEffecti(ALuint effect
, ALenum param
, ALint iValue
)
162 Context
= GetContextSuspended();
164 if (effect
&& alIsEffect(effect
))
166 ALeffect
*ALEffect
= (ALeffect
*)ALTHUNK_LOOKUPENTRY(effect
);
168 if(param
== AL_EFFECT_TYPE
)
170 ALboolean isOk
= (iValue
== AL_EFFECT_NULL
||
171 (iValue
== AL_EFFECT_EAXREVERB
&& !DisabledEffects
[EAXREVERB
]) ||
172 (iValue
== AL_EFFECT_REVERB
&& !DisabledEffects
[REVERB
]) ||
173 (iValue
== AL_EFFECT_ECHO
&& !DisabledEffects
[ECHO
]));
176 InitEffectParams(ALEffect
, iValue
);
178 alSetError(AL_INVALID_VALUE
);
180 else if(ALEffect
->type
== AL_EFFECT_EAXREVERB
)
184 case AL_EAXREVERB_DECAY_HFLIMIT
:
185 if(iValue
>= AL_EAXREVERB_MIN_DECAY_HFLIMIT
&&
186 iValue
<= AL_EAXREVERB_MAX_DECAY_HFLIMIT
)
187 ALEffect
->Reverb
.DecayHFLimit
= iValue
;
189 alSetError(AL_INVALID_VALUE
);
193 alSetError(AL_INVALID_ENUM
);
197 else if(ALEffect
->type
== AL_EFFECT_REVERB
)
201 case AL_REVERB_DECAY_HFLIMIT
:
202 if(iValue
>= AL_REVERB_MIN_DECAY_HFLIMIT
&&
203 iValue
<= AL_REVERB_MAX_DECAY_HFLIMIT
)
204 ALEffect
->Reverb
.DecayHFLimit
= iValue
;
206 alSetError(AL_INVALID_VALUE
);
210 alSetError(AL_INVALID_ENUM
);
214 else if(ALEffect
->type
== AL_EFFECT_ECHO
)
219 alSetError(AL_INVALID_ENUM
);
224 alSetError(AL_INVALID_ENUM
);
227 alSetError(AL_INVALID_NAME
);
229 ProcessContext(Context
);
232 ALvoid AL_APIENTRY
alEffectiv(ALuint effect
, ALenum param
, ALint
*piValues
)
236 Context
= GetContextSuspended();
238 if (effect
&& alIsEffect(effect
))
240 ALeffect
*ALEffect
= (ALeffect
*)ALTHUNK_LOOKUPENTRY(effect
);
242 if(param
== AL_EFFECT_TYPE
)
244 alEffecti(effect
, param
, piValues
[0]);
246 else if(ALEffect
->type
== AL_EFFECT_EAXREVERB
)
250 case AL_EAXREVERB_DECAY_HFLIMIT
:
251 alEffecti(effect
, param
, piValues
[0]);
255 alSetError(AL_INVALID_ENUM
);
259 else if(ALEffect
->type
== AL_EFFECT_REVERB
)
263 case AL_REVERB_DECAY_HFLIMIT
:
264 alEffecti(effect
, param
, piValues
[0]);
268 alSetError(AL_INVALID_ENUM
);
272 else if(ALEffect
->type
== AL_EFFECT_ECHO
)
277 alSetError(AL_INVALID_ENUM
);
282 alSetError(AL_INVALID_ENUM
);
285 alSetError(AL_INVALID_NAME
);
287 ProcessContext(Context
);
290 ALvoid AL_APIENTRY
alEffectf(ALuint effect
, ALenum param
, ALfloat flValue
)
294 Context
= GetContextSuspended();
296 if (effect
&& alIsEffect(effect
))
298 ALeffect
*ALEffect
= (ALeffect
*)ALTHUNK_LOOKUPENTRY(effect
);
300 if(ALEffect
->type
== AL_EFFECT_EAXREVERB
)
304 case AL_EAXREVERB_DENSITY
:
305 if(flValue
>= AL_EAXREVERB_MIN_DENSITY
&&
306 flValue
<= AL_EAXREVERB_MAX_DENSITY
)
307 ALEffect
->Reverb
.Density
= flValue
;
309 alSetError(AL_INVALID_VALUE
);
312 case AL_EAXREVERB_DIFFUSION
:
313 if(flValue
>= AL_EAXREVERB_MIN_DIFFUSION
&&
314 flValue
<= AL_EAXREVERB_MAX_DIFFUSION
)
315 ALEffect
->Reverb
.Diffusion
= flValue
;
317 alSetError(AL_INVALID_VALUE
);
320 case AL_EAXREVERB_GAIN
:
321 if(flValue
>= AL_EAXREVERB_MIN_GAIN
&&
322 flValue
<= AL_EAXREVERB_MAX_GAIN
)
323 ALEffect
->Reverb
.Gain
= flValue
;
325 alSetError(AL_INVALID_VALUE
);
328 case AL_EAXREVERB_GAINHF
:
329 if(flValue
>= AL_EAXREVERB_MIN_GAINHF
&&
330 flValue
<= AL_EAXREVERB_MAX_GAIN
)
331 ALEffect
->Reverb
.GainHF
= flValue
;
333 alSetError(AL_INVALID_VALUE
);
336 case AL_EAXREVERB_GAINLF
:
337 if(flValue
>= AL_EAXREVERB_MIN_GAINLF
&&
338 flValue
<= AL_EAXREVERB_MAX_GAINLF
)
339 ALEffect
->Reverb
.GainLF
= flValue
;
341 alSetError(AL_INVALID_VALUE
);
344 case AL_EAXREVERB_DECAY_TIME
:
345 if(flValue
>= AL_EAXREVERB_MIN_DECAY_TIME
&&
346 flValue
<= AL_EAXREVERB_MAX_DECAY_TIME
)
347 ALEffect
->Reverb
.DecayTime
= flValue
;
349 alSetError(AL_INVALID_VALUE
);
352 case AL_EAXREVERB_DECAY_HFRATIO
:
353 if(flValue
>= AL_EAXREVERB_MIN_DECAY_HFRATIO
&&
354 flValue
<= AL_EAXREVERB_MAX_DECAY_HFRATIO
)
355 ALEffect
->Reverb
.DecayHFRatio
= flValue
;
357 alSetError(AL_INVALID_VALUE
);
360 case AL_EAXREVERB_DECAY_LFRATIO
:
361 if(flValue
>= AL_EAXREVERB_MIN_DECAY_LFRATIO
&&
362 flValue
<= AL_EAXREVERB_MAX_DECAY_LFRATIO
)
363 ALEffect
->Reverb
.DecayLFRatio
= flValue
;
365 alSetError(AL_INVALID_VALUE
);
368 case AL_EAXREVERB_REFLECTIONS_GAIN
:
369 if(flValue
>= AL_EAXREVERB_MIN_REFLECTIONS_GAIN
&&
370 flValue
<= AL_EAXREVERB_MAX_REFLECTIONS_GAIN
)
371 ALEffect
->Reverb
.ReflectionsGain
= flValue
;
373 alSetError(AL_INVALID_VALUE
);
376 case AL_EAXREVERB_REFLECTIONS_DELAY
:
377 if(flValue
>= AL_EAXREVERB_MIN_REFLECTIONS_DELAY
&&
378 flValue
<= AL_EAXREVERB_MAX_REFLECTIONS_DELAY
)
379 ALEffect
->Reverb
.ReflectionsDelay
= flValue
;
381 alSetError(AL_INVALID_VALUE
);
384 case AL_EAXREVERB_LATE_REVERB_GAIN
:
385 if(flValue
>= AL_EAXREVERB_MIN_LATE_REVERB_GAIN
&&
386 flValue
<= AL_EAXREVERB_MAX_LATE_REVERB_GAIN
)
387 ALEffect
->Reverb
.LateReverbGain
= flValue
;
389 alSetError(AL_INVALID_VALUE
);
392 case AL_EAXREVERB_LATE_REVERB_DELAY
:
393 if(flValue
>= AL_EAXREVERB_MIN_LATE_REVERB_DELAY
&&
394 flValue
<= AL_EAXREVERB_MAX_LATE_REVERB_DELAY
)
395 ALEffect
->Reverb
.LateReverbDelay
= flValue
;
397 alSetError(AL_INVALID_VALUE
);
400 case AL_EAXREVERB_AIR_ABSORPTION_GAINHF
:
401 if(flValue
>= AL_EAXREVERB_MIN_AIR_ABSORPTION_GAINHF
&&
402 flValue
<= AL_EAXREVERB_MAX_AIR_ABSORPTION_GAINHF
)
403 ALEffect
->Reverb
.AirAbsorptionGainHF
= flValue
;
405 alSetError(AL_INVALID_VALUE
);
408 case AL_EAXREVERB_ECHO_TIME
:
409 if(flValue
>= AL_EAXREVERB_MIN_ECHO_TIME
&&
410 flValue
<= AL_EAXREVERB_MAX_ECHO_TIME
)
411 ALEffect
->Reverb
.EchoTime
= flValue
;
413 alSetError(AL_INVALID_VALUE
);
416 case AL_EAXREVERB_ECHO_DEPTH
:
417 if(flValue
>= AL_EAXREVERB_MIN_ECHO_DEPTH
&&
418 flValue
<= AL_EAXREVERB_MAX_ECHO_DEPTH
)
419 ALEffect
->Reverb
.EchoDepth
= flValue
;
421 alSetError(AL_INVALID_VALUE
);
424 case AL_EAXREVERB_MODULATION_TIME
:
425 if(flValue
>= AL_EAXREVERB_MIN_MODULATION_TIME
&&
426 flValue
<= AL_EAXREVERB_MAX_MODULATION_TIME
)
427 ALEffect
->Reverb
.ModulationTime
= flValue
;
429 alSetError(AL_INVALID_VALUE
);
432 case AL_EAXREVERB_MODULATION_DEPTH
:
433 if(flValue
>= AL_EAXREVERB_MIN_MODULATION_DEPTH
&&
434 flValue
<= AL_EAXREVERB_MAX_MODULATION_DEPTH
)
435 ALEffect
->Reverb
.ModulationDepth
= flValue
;
437 alSetError(AL_INVALID_VALUE
);
440 case AL_EAXREVERB_HFREFERENCE
:
441 if(flValue
>= AL_EAXREVERB_MIN_HFREFERENCE
&&
442 flValue
<= AL_EAXREVERB_MAX_HFREFERENCE
)
443 ALEffect
->Reverb
.HFReference
= flValue
;
445 alSetError(AL_INVALID_VALUE
);
448 case AL_EAXREVERB_LFREFERENCE
:
449 if(flValue
>= AL_EAXREVERB_MIN_LFREFERENCE
&&
450 flValue
<= AL_EAXREVERB_MAX_LFREFERENCE
)
451 ALEffect
->Reverb
.LFReference
= flValue
;
453 alSetError(AL_INVALID_VALUE
);
456 case AL_EAXREVERB_ROOM_ROLLOFF_FACTOR
:
457 if(flValue
>= 0.0f
&& flValue
<= 10.0f
)
458 ALEffect
->Reverb
.RoomRolloffFactor
= flValue
;
460 alSetError(AL_INVALID_VALUE
);
464 alSetError(AL_INVALID_ENUM
);
468 else if(ALEffect
->type
== AL_EFFECT_REVERB
)
472 case AL_REVERB_DENSITY
:
473 if(flValue
>= AL_REVERB_MIN_DENSITY
&&
474 flValue
<= AL_REVERB_MAX_DENSITY
)
475 ALEffect
->Reverb
.Density
= flValue
;
477 alSetError(AL_INVALID_VALUE
);
480 case AL_REVERB_DIFFUSION
:
481 if(flValue
>= AL_REVERB_MIN_DIFFUSION
&&
482 flValue
<= AL_REVERB_MAX_DIFFUSION
)
483 ALEffect
->Reverb
.Diffusion
= flValue
;
485 alSetError(AL_INVALID_VALUE
);
489 if(flValue
>= AL_REVERB_MIN_GAIN
&&
490 flValue
<= AL_REVERB_MAX_GAIN
)
491 ALEffect
->Reverb
.Gain
= flValue
;
493 alSetError(AL_INVALID_VALUE
);
496 case AL_REVERB_GAINHF
:
497 if(flValue
>= AL_REVERB_MIN_GAINHF
&&
498 flValue
<= AL_REVERB_MAX_GAINHF
)
499 ALEffect
->Reverb
.GainHF
= flValue
;
501 alSetError(AL_INVALID_VALUE
);
504 case AL_REVERB_DECAY_TIME
:
505 if(flValue
>= AL_REVERB_MIN_DECAY_TIME
&&
506 flValue
<= AL_REVERB_MAX_DECAY_TIME
)
507 ALEffect
->Reverb
.DecayTime
= flValue
;
509 alSetError(AL_INVALID_VALUE
);
512 case AL_REVERB_DECAY_HFRATIO
:
513 if(flValue
>= AL_REVERB_MIN_DECAY_HFRATIO
&&
514 flValue
<= AL_REVERB_MAX_DECAY_HFRATIO
)
515 ALEffect
->Reverb
.DecayHFRatio
= flValue
;
517 alSetError(AL_INVALID_VALUE
);
520 case AL_REVERB_REFLECTIONS_GAIN
:
521 if(flValue
>= AL_REVERB_MIN_REFLECTIONS_GAIN
&&
522 flValue
<= AL_REVERB_MAX_REFLECTIONS_GAIN
)
523 ALEffect
->Reverb
.ReflectionsGain
= flValue
;
525 alSetError(AL_INVALID_VALUE
);
528 case AL_REVERB_REFLECTIONS_DELAY
:
529 if(flValue
>= AL_REVERB_MIN_REFLECTIONS_DELAY
&&
530 flValue
<= AL_REVERB_MAX_REFLECTIONS_DELAY
)
531 ALEffect
->Reverb
.ReflectionsDelay
= flValue
;
533 alSetError(AL_INVALID_VALUE
);
536 case AL_REVERB_LATE_REVERB_GAIN
:
537 if(flValue
>= AL_REVERB_MIN_LATE_REVERB_GAIN
&&
538 flValue
<= AL_REVERB_MAX_LATE_REVERB_GAIN
)
539 ALEffect
->Reverb
.LateReverbGain
= flValue
;
541 alSetError(AL_INVALID_VALUE
);
544 case AL_REVERB_LATE_REVERB_DELAY
:
545 if(flValue
>= AL_REVERB_MIN_LATE_REVERB_DELAY
&&
546 flValue
<= AL_REVERB_MAX_LATE_REVERB_DELAY
)
547 ALEffect
->Reverb
.LateReverbDelay
= flValue
;
549 alSetError(AL_INVALID_VALUE
);
552 case AL_REVERB_AIR_ABSORPTION_GAINHF
:
553 if(flValue
>= AL_REVERB_MIN_AIR_ABSORPTION_GAINHF
&&
554 flValue
<= AL_REVERB_MAX_AIR_ABSORPTION_GAINHF
)
555 ALEffect
->Reverb
.AirAbsorptionGainHF
= flValue
;
557 alSetError(AL_INVALID_VALUE
);
560 case AL_REVERB_ROOM_ROLLOFF_FACTOR
:
561 if(flValue
>= AL_REVERB_MIN_ROOM_ROLLOFF_FACTOR
&&
562 flValue
<= AL_REVERB_MAX_ROOM_ROLLOFF_FACTOR
)
563 ALEffect
->Reverb
.RoomRolloffFactor
= flValue
;
565 alSetError(AL_INVALID_VALUE
);
569 alSetError(AL_INVALID_ENUM
);
573 else if(ALEffect
->type
== AL_EFFECT_ECHO
)
578 if(flValue
>= AL_ECHO_MIN_DELAY
&& flValue
<= AL_ECHO_MAX_DELAY
)
579 ALEffect
->Echo
.Delay
= flValue
;
581 alSetError(AL_INVALID_VALUE
);
584 case AL_ECHO_LRDELAY
:
585 if(flValue
>= AL_ECHO_MIN_LRDELAY
&& flValue
<= AL_ECHO_MAX_LRDELAY
)
586 ALEffect
->Echo
.LRDelay
= flValue
;
588 alSetError(AL_INVALID_VALUE
);
591 case AL_ECHO_DAMPING
:
592 if(flValue
>= AL_ECHO_MIN_DAMPING
&& flValue
<= AL_ECHO_MAX_DAMPING
)
593 ALEffect
->Echo
.Damping
= flValue
;
595 alSetError(AL_INVALID_VALUE
);
598 case AL_ECHO_FEEDBACK
:
599 if(flValue
>= AL_ECHO_MIN_FEEDBACK
&& flValue
<= AL_ECHO_MAX_FEEDBACK
)
600 ALEffect
->Echo
.Feedback
= flValue
;
602 alSetError(AL_INVALID_VALUE
);
606 if(flValue
>= AL_ECHO_MIN_SPREAD
&& flValue
<= AL_ECHO_MAX_SPREAD
)
607 ALEffect
->Echo
.Spread
= flValue
;
609 alSetError(AL_INVALID_VALUE
);
613 alSetError(AL_INVALID_ENUM
);
618 alSetError(AL_INVALID_ENUM
);
621 alSetError(AL_INVALID_NAME
);
623 ProcessContext(Context
);
626 ALvoid AL_APIENTRY
alEffectfv(ALuint effect
, ALenum param
, ALfloat
*pflValues
)
630 Context
= GetContextSuspended();
632 if (effect
&& alIsEffect(effect
))
634 ALeffect
*ALEffect
= (ALeffect
*)ALTHUNK_LOOKUPENTRY(effect
);
636 if(ALEffect
->type
== AL_EFFECT_EAXREVERB
)
640 case AL_EAXREVERB_DENSITY
:
641 case AL_EAXREVERB_DIFFUSION
:
642 case AL_EAXREVERB_GAIN
:
643 case AL_EAXREVERB_GAINHF
:
644 case AL_EAXREVERB_GAINLF
:
645 case AL_EAXREVERB_DECAY_TIME
:
646 case AL_EAXREVERB_DECAY_HFRATIO
:
647 case AL_EAXREVERB_DECAY_LFRATIO
:
648 case AL_EAXREVERB_REFLECTIONS_GAIN
:
649 case AL_EAXREVERB_REFLECTIONS_DELAY
:
650 case AL_EAXREVERB_LATE_REVERB_GAIN
:
651 case AL_EAXREVERB_LATE_REVERB_DELAY
:
652 case AL_EAXREVERB_AIR_ABSORPTION_GAINHF
:
653 case AL_EAXREVERB_ECHO_TIME
:
654 case AL_EAXREVERB_ECHO_DEPTH
:
655 case AL_EAXREVERB_MODULATION_TIME
:
656 case AL_EAXREVERB_MODULATION_DEPTH
:
657 case AL_EAXREVERB_HFREFERENCE
:
658 case AL_EAXREVERB_LFREFERENCE
:
659 case AL_EAXREVERB_ROOM_ROLLOFF_FACTOR
:
660 alEffectf(effect
, param
, pflValues
[0]);
663 case AL_EAXREVERB_REFLECTIONS_PAN
:
664 if(!isnan(pflValues
[0]) && !isnan(pflValues
[1]) && !isnan(pflValues
[2]))
666 ALEffect
->Reverb
.ReflectionsPan
[0] = pflValues
[0];
667 ALEffect
->Reverb
.ReflectionsPan
[1] = pflValues
[1];
668 ALEffect
->Reverb
.ReflectionsPan
[2] = pflValues
[2];
671 alSetError(AL_INVALID_VALUE
);
673 case AL_EAXREVERB_LATE_REVERB_PAN
:
674 if(!isnan(pflValues
[0]) && !isnan(pflValues
[1]) && !isnan(pflValues
[2]))
676 ALEffect
->Reverb
.LateReverbPan
[0] = pflValues
[0];
677 ALEffect
->Reverb
.LateReverbPan
[1] = pflValues
[1];
678 ALEffect
->Reverb
.LateReverbPan
[2] = pflValues
[2];
681 alSetError(AL_INVALID_VALUE
);
685 alSetError(AL_INVALID_ENUM
);
689 else if(ALEffect
->type
== AL_EFFECT_REVERB
)
693 case AL_REVERB_DENSITY
:
694 case AL_REVERB_DIFFUSION
:
696 case AL_REVERB_GAINHF
:
697 case AL_REVERB_DECAY_TIME
:
698 case AL_REVERB_DECAY_HFRATIO
:
699 case AL_REVERB_REFLECTIONS_GAIN
:
700 case AL_REVERB_REFLECTIONS_DELAY
:
701 case AL_REVERB_LATE_REVERB_GAIN
:
702 case AL_REVERB_LATE_REVERB_DELAY
:
703 case AL_REVERB_AIR_ABSORPTION_GAINHF
:
704 case AL_REVERB_ROOM_ROLLOFF_FACTOR
:
705 alEffectf(effect
, param
, pflValues
[0]);
709 alSetError(AL_INVALID_ENUM
);
713 else if(ALEffect
->type
== AL_EFFECT_ECHO
)
718 case AL_ECHO_LRDELAY
:
719 case AL_ECHO_DAMPING
:
720 case AL_ECHO_FEEDBACK
:
722 alEffectf(effect
, param
, pflValues
[0]);
726 alSetError(AL_INVALID_ENUM
);
731 alSetError(AL_INVALID_ENUM
);
734 alSetError(AL_INVALID_NAME
);
736 ProcessContext(Context
);
739 ALvoid AL_APIENTRY
alGetEffecti(ALuint effect
, ALenum param
, ALint
*piValue
)
743 Context
= GetContextSuspended();
745 if (effect
&& alIsEffect(effect
))
747 ALeffect
*ALEffect
= (ALeffect
*)ALTHUNK_LOOKUPENTRY(effect
);
749 if(param
== AL_EFFECT_TYPE
)
751 *piValue
= ALEffect
->type
;
753 else if(ALEffect
->type
== AL_EFFECT_EAXREVERB
)
757 case AL_EAXREVERB_DECAY_HFLIMIT
:
758 *piValue
= ALEffect
->Reverb
.DecayHFLimit
;
762 alSetError(AL_INVALID_ENUM
);
766 else if(ALEffect
->type
== AL_EFFECT_REVERB
)
770 case AL_REVERB_DECAY_HFLIMIT
:
771 *piValue
= ALEffect
->Reverb
.DecayHFLimit
;
775 alSetError(AL_INVALID_ENUM
);
779 else if(ALEffect
->type
== AL_EFFECT_ECHO
)
784 alSetError(AL_INVALID_ENUM
);
789 alSetError(AL_INVALID_ENUM
);
792 alSetError(AL_INVALID_NAME
);
794 ProcessContext(Context
);
797 ALvoid AL_APIENTRY
alGetEffectiv(ALuint effect
, ALenum param
, ALint
*piValues
)
801 Context
= GetContextSuspended();
803 if (effect
&& alIsEffect(effect
))
805 ALeffect
*ALEffect
= (ALeffect
*)ALTHUNK_LOOKUPENTRY(effect
);
807 if(param
== AL_EFFECT_TYPE
)
809 alGetEffecti(effect
, param
, piValues
);
811 else if(ALEffect
->type
== AL_EFFECT_EAXREVERB
)
815 case AL_EAXREVERB_DECAY_HFLIMIT
:
816 alGetEffecti(effect
, param
, piValues
);
820 alSetError(AL_INVALID_ENUM
);
824 else if(ALEffect
->type
== AL_EFFECT_REVERB
)
828 case AL_REVERB_DECAY_HFLIMIT
:
829 alGetEffecti(effect
, param
, piValues
);
833 alSetError(AL_INVALID_ENUM
);
837 else if(ALEffect
->type
== AL_EFFECT_ECHO
)
842 alSetError(AL_INVALID_ENUM
);
847 alSetError(AL_INVALID_ENUM
);
850 alSetError(AL_INVALID_NAME
);
852 ProcessContext(Context
);
855 ALvoid AL_APIENTRY
alGetEffectf(ALuint effect
, ALenum param
, ALfloat
*pflValue
)
859 Context
= GetContextSuspended();
861 if (effect
&& alIsEffect(effect
))
863 ALeffect
*ALEffect
= (ALeffect
*)ALTHUNK_LOOKUPENTRY(effect
);
865 if(ALEffect
->type
== AL_EFFECT_EAXREVERB
)
869 case AL_EAXREVERB_DENSITY
:
870 *pflValue
= ALEffect
->Reverb
.Density
;
873 case AL_EAXREVERB_DIFFUSION
:
874 *pflValue
= ALEffect
->Reverb
.Diffusion
;
877 case AL_EAXREVERB_GAIN
:
878 *pflValue
= ALEffect
->Reverb
.Gain
;
881 case AL_EAXREVERB_GAINHF
:
882 *pflValue
= ALEffect
->Reverb
.GainHF
;
885 case AL_EAXREVERB_GAINLF
:
886 *pflValue
= ALEffect
->Reverb
.GainLF
;
889 case AL_EAXREVERB_DECAY_TIME
:
890 *pflValue
= ALEffect
->Reverb
.DecayTime
;
893 case AL_EAXREVERB_DECAY_HFRATIO
:
894 *pflValue
= ALEffect
->Reverb
.DecayHFRatio
;
897 case AL_EAXREVERB_DECAY_LFRATIO
:
898 *pflValue
= ALEffect
->Reverb
.DecayLFRatio
;
901 case AL_EAXREVERB_REFLECTIONS_GAIN
:
902 *pflValue
= ALEffect
->Reverb
.ReflectionsGain
;
905 case AL_EAXREVERB_REFLECTIONS_DELAY
:
906 *pflValue
= ALEffect
->Reverb
.ReflectionsDelay
;
909 case AL_EAXREVERB_LATE_REVERB_GAIN
:
910 *pflValue
= ALEffect
->Reverb
.LateReverbGain
;
913 case AL_EAXREVERB_LATE_REVERB_DELAY
:
914 *pflValue
= ALEffect
->Reverb
.LateReverbDelay
;
917 case AL_EAXREVERB_AIR_ABSORPTION_GAINHF
:
918 *pflValue
= ALEffect
->Reverb
.AirAbsorptionGainHF
;
921 case AL_EAXREVERB_ECHO_TIME
:
922 *pflValue
= ALEffect
->Reverb
.EchoTime
;
925 case AL_EAXREVERB_ECHO_DEPTH
:
926 *pflValue
= ALEffect
->Reverb
.EchoDepth
;
929 case AL_EAXREVERB_MODULATION_TIME
:
930 *pflValue
= ALEffect
->Reverb
.ModulationTime
;
933 case AL_EAXREVERB_MODULATION_DEPTH
:
934 *pflValue
= ALEffect
->Reverb
.ModulationDepth
;
937 case AL_EAXREVERB_HFREFERENCE
:
938 *pflValue
= ALEffect
->Reverb
.HFReference
;
941 case AL_EAXREVERB_LFREFERENCE
:
942 *pflValue
= ALEffect
->Reverb
.LFReference
;
945 case AL_EAXREVERB_ROOM_ROLLOFF_FACTOR
:
946 *pflValue
= ALEffect
->Reverb
.RoomRolloffFactor
;
950 alSetError(AL_INVALID_ENUM
);
954 else if(ALEffect
->type
== AL_EFFECT_REVERB
)
958 case AL_REVERB_DENSITY
:
959 *pflValue
= ALEffect
->Reverb
.Density
;
962 case AL_REVERB_DIFFUSION
:
963 *pflValue
= ALEffect
->Reverb
.Diffusion
;
967 *pflValue
= ALEffect
->Reverb
.Gain
;
970 case AL_REVERB_GAINHF
:
971 *pflValue
= ALEffect
->Reverb
.GainHF
;
974 case AL_REVERB_DECAY_TIME
:
975 *pflValue
= ALEffect
->Reverb
.DecayTime
;
978 case AL_REVERB_DECAY_HFRATIO
:
979 *pflValue
= ALEffect
->Reverb
.DecayHFRatio
;
982 case AL_REVERB_REFLECTIONS_GAIN
:
983 *pflValue
= ALEffect
->Reverb
.ReflectionsGain
;
986 case AL_REVERB_REFLECTIONS_DELAY
:
987 *pflValue
= ALEffect
->Reverb
.ReflectionsDelay
;
990 case AL_REVERB_LATE_REVERB_GAIN
:
991 *pflValue
= ALEffect
->Reverb
.LateReverbGain
;
994 case AL_REVERB_LATE_REVERB_DELAY
:
995 *pflValue
= ALEffect
->Reverb
.LateReverbDelay
;
998 case AL_REVERB_AIR_ABSORPTION_GAINHF
:
999 *pflValue
= ALEffect
->Reverb
.AirAbsorptionGainHF
;
1002 case AL_REVERB_ROOM_ROLLOFF_FACTOR
:
1003 *pflValue
= ALEffect
->Reverb
.RoomRolloffFactor
;
1007 alSetError(AL_INVALID_ENUM
);
1011 else if(ALEffect
->type
== AL_EFFECT_ECHO
)
1016 *pflValue
= ALEffect
->Echo
.Delay
;
1019 case AL_ECHO_LRDELAY
:
1020 *pflValue
= ALEffect
->Echo
.LRDelay
;
1023 case AL_ECHO_DAMPING
:
1024 *pflValue
= ALEffect
->Echo
.Damping
;
1027 case AL_ECHO_FEEDBACK
:
1028 *pflValue
= ALEffect
->Echo
.Feedback
;
1031 case AL_ECHO_SPREAD
:
1032 *pflValue
= ALEffect
->Echo
.Spread
;
1036 alSetError(AL_INVALID_ENUM
);
1041 alSetError(AL_INVALID_ENUM
);
1044 alSetError(AL_INVALID_NAME
);
1046 ProcessContext(Context
);
1049 ALvoid AL_APIENTRY
alGetEffectfv(ALuint effect
, ALenum param
, ALfloat
*pflValues
)
1051 ALCcontext
*Context
;
1053 Context
= GetContextSuspended();
1055 if (effect
&& alIsEffect(effect
))
1057 ALeffect
*ALEffect
= (ALeffect
*)ALTHUNK_LOOKUPENTRY(effect
);
1059 if(ALEffect
->type
== AL_EFFECT_EAXREVERB
)
1063 case AL_EAXREVERB_DENSITY
:
1064 case AL_EAXREVERB_DIFFUSION
:
1065 case AL_EAXREVERB_GAIN
:
1066 case AL_EAXREVERB_GAINHF
:
1067 case AL_EAXREVERB_GAINLF
:
1068 case AL_EAXREVERB_DECAY_TIME
:
1069 case AL_EAXREVERB_DECAY_HFRATIO
:
1070 case AL_EAXREVERB_DECAY_LFRATIO
:
1071 case AL_EAXREVERB_REFLECTIONS_GAIN
:
1072 case AL_EAXREVERB_REFLECTIONS_DELAY
:
1073 case AL_EAXREVERB_LATE_REVERB_GAIN
:
1074 case AL_EAXREVERB_LATE_REVERB_DELAY
:
1075 case AL_EAXREVERB_AIR_ABSORPTION_GAINHF
:
1076 case AL_EAXREVERB_ECHO_TIME
:
1077 case AL_EAXREVERB_ECHO_DEPTH
:
1078 case AL_EAXREVERB_MODULATION_TIME
:
1079 case AL_EAXREVERB_MODULATION_DEPTH
:
1080 case AL_EAXREVERB_HFREFERENCE
:
1081 case AL_EAXREVERB_LFREFERENCE
:
1082 case AL_EAXREVERB_ROOM_ROLLOFF_FACTOR
:
1083 alGetEffectf(effect
, param
, pflValues
);
1086 case AL_EAXREVERB_REFLECTIONS_PAN
:
1087 pflValues
[0] = ALEffect
->Reverb
.ReflectionsPan
[0];
1088 pflValues
[1] = ALEffect
->Reverb
.ReflectionsPan
[1];
1089 pflValues
[2] = ALEffect
->Reverb
.ReflectionsPan
[2];
1091 case AL_EAXREVERB_LATE_REVERB_PAN
:
1092 pflValues
[0] = ALEffect
->Reverb
.LateReverbPan
[0];
1093 pflValues
[1] = ALEffect
->Reverb
.LateReverbPan
[1];
1094 pflValues
[2] = ALEffect
->Reverb
.LateReverbPan
[2];
1098 alSetError(AL_INVALID_ENUM
);
1102 else if(ALEffect
->type
== AL_EFFECT_REVERB
)
1106 case AL_REVERB_DENSITY
:
1107 case AL_REVERB_DIFFUSION
:
1108 case AL_REVERB_GAIN
:
1109 case AL_REVERB_GAINHF
:
1110 case AL_REVERB_DECAY_TIME
:
1111 case AL_REVERB_DECAY_HFRATIO
:
1112 case AL_REVERB_REFLECTIONS_GAIN
:
1113 case AL_REVERB_REFLECTIONS_DELAY
:
1114 case AL_REVERB_LATE_REVERB_GAIN
:
1115 case AL_REVERB_LATE_REVERB_DELAY
:
1116 case AL_REVERB_AIR_ABSORPTION_GAINHF
:
1117 case AL_REVERB_ROOM_ROLLOFF_FACTOR
:
1118 alGetEffectf(effect
, param
, pflValues
);
1122 alSetError(AL_INVALID_ENUM
);
1126 else if(ALEffect
->type
== AL_EFFECT_ECHO
)
1131 case AL_ECHO_LRDELAY
:
1132 case AL_ECHO_DAMPING
:
1133 case AL_ECHO_FEEDBACK
:
1134 case AL_ECHO_SPREAD
:
1135 alGetEffectf(effect
, param
, pflValues
);
1139 alSetError(AL_INVALID_ENUM
);
1144 alSetError(AL_INVALID_ENUM
);
1147 alSetError(AL_INVALID_NAME
);
1149 ProcessContext(Context
);
1153 ALvoid
ReleaseALEffects(ALCdevice
*device
)
1155 ALeffect
*list
= device
->EffectList
;
1158 ALeffect
*temp
= list
;
1161 // Release effect structure
1162 memset(temp
, 0, sizeof(ALeffect
));
1165 device
->EffectList
= NULL
;
1166 device
->EffectCount
= 0;
1170 static void InitEffectParams(ALeffect
*effect
, ALenum type
)
1172 effect
->type
= type
;
1175 /* NOTE: Standard reverb and EAX reverb use the same defaults for the
1176 * shared parameters, and EAX's additional parameters default to
1177 * values assumed by standard reverb.
1179 case AL_EFFECT_EAXREVERB
:
1180 case AL_EFFECT_REVERB
:
1181 effect
->Reverb
.Density
= AL_EAXREVERB_DEFAULT_DENSITY
;
1182 effect
->Reverb
.Diffusion
= AL_EAXREVERB_DEFAULT_DIFFUSION
;
1183 effect
->Reverb
.Gain
= AL_EAXREVERB_DEFAULT_GAIN
;
1184 effect
->Reverb
.GainHF
= AL_EAXREVERB_DEFAULT_GAINHF
;
1185 effect
->Reverb
.GainLF
= AL_EAXREVERB_DEFAULT_GAINLF
;
1186 effect
->Reverb
.DecayTime
= AL_EAXREVERB_DEFAULT_DECAY_TIME
;
1187 effect
->Reverb
.DecayHFRatio
= AL_EAXREVERB_DEFAULT_DECAY_HFRATIO
;
1188 effect
->Reverb
.DecayLFRatio
= AL_EAXREVERB_DEFAULT_DECAY_LFRATIO
;
1189 effect
->Reverb
.ReflectionsGain
= AL_EAXREVERB_DEFAULT_REFLECTIONS_GAIN
;
1190 effect
->Reverb
.ReflectionsDelay
= AL_EAXREVERB_DEFAULT_REFLECTIONS_DELAY
;
1191 effect
->Reverb
.ReflectionsPan
[0] = AL_EAXREVERB_DEFAULT_REFLECTIONS_PAN_XYZ
;
1192 effect
->Reverb
.ReflectionsPan
[1] = AL_EAXREVERB_DEFAULT_REFLECTIONS_PAN_XYZ
;
1193 effect
->Reverb
.ReflectionsPan
[2] = AL_EAXREVERB_DEFAULT_REFLECTIONS_PAN_XYZ
;
1194 effect
->Reverb
.LateReverbGain
= AL_EAXREVERB_DEFAULT_LATE_REVERB_GAIN
;
1195 effect
->Reverb
.LateReverbDelay
= AL_EAXREVERB_DEFAULT_LATE_REVERB_DELAY
;
1196 effect
->Reverb
.LateReverbPan
[0] = AL_EAXREVERB_DEFAULT_LATE_REVERB_PAN_XYZ
;
1197 effect
->Reverb
.LateReverbPan
[1] = AL_EAXREVERB_DEFAULT_LATE_REVERB_PAN_XYZ
;
1198 effect
->Reverb
.LateReverbPan
[2] = AL_EAXREVERB_DEFAULT_LATE_REVERB_PAN_XYZ
;
1199 effect
->Reverb
.EchoTime
= AL_EAXREVERB_DEFAULT_ECHO_TIME
;
1200 effect
->Reverb
.EchoDepth
= AL_EAXREVERB_DEFAULT_ECHO_DEPTH
;
1201 effect
->Reverb
.ModulationTime
= AL_EAXREVERB_DEFAULT_MODULATION_TIME
;
1202 effect
->Reverb
.ModulationDepth
= AL_EAXREVERB_DEFAULT_MODULATION_DEPTH
;
1203 effect
->Reverb
.AirAbsorptionGainHF
= AL_EAXREVERB_DEFAULT_AIR_ABSORPTION_GAINHF
;
1204 effect
->Reverb
.HFReference
= AL_EAXREVERB_DEFAULT_HFREFERENCE
;
1205 effect
->Reverb
.LFReference
= AL_EAXREVERB_DEFAULT_LFREFERENCE
;
1206 effect
->Reverb
.RoomRolloffFactor
= AL_EAXREVERB_DEFAULT_ROOM_ROLLOFF_FACTOR
;
1207 effect
->Reverb
.DecayHFLimit
= AL_EAXREVERB_DEFAULT_DECAY_HFLIMIT
;
1209 case AL_EFFECT_ECHO
:
1210 effect
->Echo
.Delay
= AL_ECHO_DEFAULT_DELAY
;
1211 effect
->Echo
.LRDelay
= AL_ECHO_DEFAULT_LRDELAY
;
1212 effect
->Echo
.Damping
= AL_ECHO_DEFAULT_DAMPING
;
1213 effect
->Echo
.Feedback
= AL_ECHO_DEFAULT_FEEDBACK
;
1214 effect
->Echo
.Spread
= AL_ECHO_DEFAULT_SPREAD
;