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 #define LookupEffect(m, k) ((ALeffect*)LookupUIntMapKey(&(m), (k)))
41 AL_API ALvoid AL_APIENTRY
alGenEffects(ALsizei n
, ALuint
*effects
)
46 Context
= GetLockedContext();
49 if(n
< 0 || IsBadWritePtr((void*)effects
, n
* sizeof(ALuint
)))
50 alSetError(Context
, AL_INVALID_VALUE
);
53 ALCdevice
*device
= Context
->Device
;
58 ALeffect
*effect
= calloc(1, sizeof(ALeffect
));
61 alSetError(Context
, AL_OUT_OF_MEMORY
);
62 alDeleteEffects(i
, effects
);
66 err
= ALTHUNK_ADDENTRY(effect
, &effect
->effect
);
67 if(err
== AL_NO_ERROR
)
68 err
= InsertUIntMapEntry(&device
->EffectMap
, effect
->effect
, effect
);
69 if(err
!= AL_NO_ERROR
)
71 ALTHUNK_REMOVEENTRY(effect
->effect
);
72 memset(effect
, 0, sizeof(ALeffect
));
75 alSetError(Context
, err
);
76 alDeleteEffects(i
, effects
);
80 effects
[i
++] = effect
->effect
;
81 InitEffectParams(effect
, AL_EFFECT_NULL
);
85 UnlockContext(Context
);
88 AL_API ALvoid AL_APIENTRY
alDeleteEffects(ALsizei n
, ALuint
*effects
)
96 Context
= GetLockedContext();
100 device
= Context
->Device
;
102 alSetError(Context
, AL_INVALID_VALUE
);
106 // Check that all effects are valid
112 if(LookupEffect(device
->EffectMap
, effects
[i
]) == NULL
)
114 alSetError(Context
, AL_INVALID_NAME
);
123 // All effects are valid
126 // Recheck that the effect is valid, because there could be duplicated names
127 if((ALEffect
=LookupEffect(device
->EffectMap
, effects
[i
])) == NULL
)
130 RemoveUIntMapKey(&device
->EffectMap
, ALEffect
->effect
);
131 ALTHUNK_REMOVEENTRY(ALEffect
->effect
);
133 memset(ALEffect
, 0, sizeof(ALeffect
));
138 UnlockContext(Context
);
141 AL_API ALboolean AL_APIENTRY
alIsEffect(ALuint effect
)
146 Context
= GetLockedContext();
147 if(!Context
) return AL_FALSE
;
149 result
= ((!effect
|| LookupEffect(Context
->Device
->EffectMap
, effect
)) ?
152 UnlockContext(Context
);
157 AL_API ALvoid AL_APIENTRY
alEffecti(ALuint effect
, ALenum param
, ALint iValue
)
163 Context
= GetLockedContext();
166 Device
= Context
->Device
;
167 if((ALEffect
=LookupEffect(Device
->EffectMap
, effect
)) != NULL
)
169 if(param
== AL_EFFECT_TYPE
)
171 ALboolean isOk
= (iValue
== AL_EFFECT_NULL
);
173 for(i
= 0;!isOk
&& EffectList
[i
].val
;i
++)
175 if(iValue
== EffectList
[i
].val
&&
176 !DisabledEffects
[EffectList
[i
].type
])
181 InitEffectParams(ALEffect
, iValue
);
183 alSetError(Context
, AL_INVALID_VALUE
);
185 else if(ALEffect
->type
== AL_EFFECT_EAXREVERB
)
189 case AL_EAXREVERB_DECAY_HFLIMIT
:
190 if(iValue
>= AL_EAXREVERB_MIN_DECAY_HFLIMIT
&&
191 iValue
<= AL_EAXREVERB_MAX_DECAY_HFLIMIT
)
192 ALEffect
->Params
.Reverb
.DecayHFLimit
= iValue
;
194 alSetError(Context
, AL_INVALID_VALUE
);
198 alSetError(Context
, AL_INVALID_ENUM
);
202 else if(ALEffect
->type
== AL_EFFECT_REVERB
)
206 case AL_REVERB_DECAY_HFLIMIT
:
207 if(iValue
>= AL_REVERB_MIN_DECAY_HFLIMIT
&&
208 iValue
<= AL_REVERB_MAX_DECAY_HFLIMIT
)
209 ALEffect
->Params
.Reverb
.DecayHFLimit
= iValue
;
211 alSetError(Context
, AL_INVALID_VALUE
);
215 alSetError(Context
, AL_INVALID_ENUM
);
219 else if(ALEffect
->type
== AL_EFFECT_ECHO
)
224 alSetError(Context
, AL_INVALID_ENUM
);
228 else if(ALEffect
->type
== AL_EFFECT_RING_MODULATOR
)
232 case AL_RING_MODULATOR_FREQUENCY
:
233 if(iValue
>= AL_RING_MODULATOR_MIN_FREQUENCY
&&
234 iValue
<= AL_RING_MODULATOR_MAX_FREQUENCY
)
235 ALEffect
->Params
.Modulator
.Frequency
= iValue
;
237 alSetError(Context
, AL_INVALID_VALUE
);
240 case AL_RING_MODULATOR_HIGHPASS_CUTOFF
:
241 if(iValue
>= AL_RING_MODULATOR_MIN_HIGHPASS_CUTOFF
&&
242 iValue
<= AL_RING_MODULATOR_MAX_HIGHPASS_CUTOFF
)
243 ALEffect
->Params
.Modulator
.HighPassCutoff
= iValue
;
245 alSetError(Context
, AL_INVALID_VALUE
);
248 case AL_RING_MODULATOR_WAVEFORM
:
249 if(iValue
>= AL_RING_MODULATOR_MIN_WAVEFORM
&&
250 iValue
<= AL_RING_MODULATOR_MAX_WAVEFORM
)
251 ALEffect
->Params
.Modulator
.Waveform
= iValue
;
253 alSetError(Context
, AL_INVALID_VALUE
);
257 alSetError(Context
, AL_INVALID_ENUM
);
262 alSetError(Context
, AL_INVALID_ENUM
);
265 alSetError(Context
, AL_INVALID_NAME
);
267 UnlockContext(Context
);
270 AL_API ALvoid AL_APIENTRY
alEffectiv(ALuint effect
, ALenum param
, ALint
*piValues
)
272 /* There are no multi-value int effect parameters */
273 alEffecti(effect
, param
, piValues
[0]);
276 AL_API ALvoid AL_APIENTRY
alEffectf(ALuint effect
, ALenum param
, ALfloat flValue
)
282 Context
= GetLockedContext();
285 Device
= Context
->Device
;
286 if((ALEffect
=LookupEffect(Device
->EffectMap
, effect
)) != NULL
)
288 if(ALEffect
->type
== AL_EFFECT_EAXREVERB
)
292 case AL_EAXREVERB_DENSITY
:
293 if(flValue
>= AL_EAXREVERB_MIN_DENSITY
&&
294 flValue
<= AL_EAXREVERB_MAX_DENSITY
)
295 ALEffect
->Params
.Reverb
.Density
= flValue
;
297 alSetError(Context
, AL_INVALID_VALUE
);
300 case AL_EAXREVERB_DIFFUSION
:
301 if(flValue
>= AL_EAXREVERB_MIN_DIFFUSION
&&
302 flValue
<= AL_EAXREVERB_MAX_DIFFUSION
)
303 ALEffect
->Params
.Reverb
.Diffusion
= flValue
;
305 alSetError(Context
, AL_INVALID_VALUE
);
308 case AL_EAXREVERB_GAIN
:
309 if(flValue
>= AL_EAXREVERB_MIN_GAIN
&&
310 flValue
<= AL_EAXREVERB_MAX_GAIN
)
311 ALEffect
->Params
.Reverb
.Gain
= flValue
;
313 alSetError(Context
, AL_INVALID_VALUE
);
316 case AL_EAXREVERB_GAINHF
:
317 if(flValue
>= AL_EAXREVERB_MIN_GAINHF
&&
318 flValue
<= AL_EAXREVERB_MAX_GAINHF
)
319 ALEffect
->Params
.Reverb
.GainHF
= flValue
;
321 alSetError(Context
, AL_INVALID_VALUE
);
324 case AL_EAXREVERB_GAINLF
:
325 if(flValue
>= AL_EAXREVERB_MIN_GAINLF
&&
326 flValue
<= AL_EAXREVERB_MAX_GAINLF
)
327 ALEffect
->Params
.Reverb
.GainLF
= flValue
;
329 alSetError(Context
, AL_INVALID_VALUE
);
332 case AL_EAXREVERB_DECAY_TIME
:
333 if(flValue
>= AL_EAXREVERB_MIN_DECAY_TIME
&&
334 flValue
<= AL_EAXREVERB_MAX_DECAY_TIME
)
335 ALEffect
->Params
.Reverb
.DecayTime
= flValue
;
337 alSetError(Context
, AL_INVALID_VALUE
);
340 case AL_EAXREVERB_DECAY_HFRATIO
:
341 if(flValue
>= AL_EAXREVERB_MIN_DECAY_HFRATIO
&&
342 flValue
<= AL_EAXREVERB_MAX_DECAY_HFRATIO
)
343 ALEffect
->Params
.Reverb
.DecayHFRatio
= flValue
;
345 alSetError(Context
, AL_INVALID_VALUE
);
348 case AL_EAXREVERB_DECAY_LFRATIO
:
349 if(flValue
>= AL_EAXREVERB_MIN_DECAY_LFRATIO
&&
350 flValue
<= AL_EAXREVERB_MAX_DECAY_LFRATIO
)
351 ALEffect
->Params
.Reverb
.DecayLFRatio
= flValue
;
353 alSetError(Context
, AL_INVALID_VALUE
);
356 case AL_EAXREVERB_REFLECTIONS_GAIN
:
357 if(flValue
>= AL_EAXREVERB_MIN_REFLECTIONS_GAIN
&&
358 flValue
<= AL_EAXREVERB_MAX_REFLECTIONS_GAIN
)
359 ALEffect
->Params
.Reverb
.ReflectionsGain
= flValue
;
361 alSetError(Context
, AL_INVALID_VALUE
);
364 case AL_EAXREVERB_REFLECTIONS_DELAY
:
365 if(flValue
>= AL_EAXREVERB_MIN_REFLECTIONS_DELAY
&&
366 flValue
<= AL_EAXREVERB_MAX_REFLECTIONS_DELAY
)
367 ALEffect
->Params
.Reverb
.ReflectionsDelay
= flValue
;
369 alSetError(Context
, AL_INVALID_VALUE
);
372 case AL_EAXREVERB_LATE_REVERB_GAIN
:
373 if(flValue
>= AL_EAXREVERB_MIN_LATE_REVERB_GAIN
&&
374 flValue
<= AL_EAXREVERB_MAX_LATE_REVERB_GAIN
)
375 ALEffect
->Params
.Reverb
.LateReverbGain
= flValue
;
377 alSetError(Context
, AL_INVALID_VALUE
);
380 case AL_EAXREVERB_LATE_REVERB_DELAY
:
381 if(flValue
>= AL_EAXREVERB_MIN_LATE_REVERB_DELAY
&&
382 flValue
<= AL_EAXREVERB_MAX_LATE_REVERB_DELAY
)
383 ALEffect
->Params
.Reverb
.LateReverbDelay
= flValue
;
385 alSetError(Context
, AL_INVALID_VALUE
);
388 case AL_EAXREVERB_AIR_ABSORPTION_GAINHF
:
389 if(flValue
>= AL_EAXREVERB_MIN_AIR_ABSORPTION_GAINHF
&&
390 flValue
<= AL_EAXREVERB_MAX_AIR_ABSORPTION_GAINHF
)
391 ALEffect
->Params
.Reverb
.AirAbsorptionGainHF
= flValue
;
393 alSetError(Context
, AL_INVALID_VALUE
);
396 case AL_EAXREVERB_ECHO_TIME
:
397 if(flValue
>= AL_EAXREVERB_MIN_ECHO_TIME
&&
398 flValue
<= AL_EAXREVERB_MAX_ECHO_TIME
)
399 ALEffect
->Params
.Reverb
.EchoTime
= flValue
;
401 alSetError(Context
, AL_INVALID_VALUE
);
404 case AL_EAXREVERB_ECHO_DEPTH
:
405 if(flValue
>= AL_EAXREVERB_MIN_ECHO_DEPTH
&&
406 flValue
<= AL_EAXREVERB_MAX_ECHO_DEPTH
)
407 ALEffect
->Params
.Reverb
.EchoDepth
= flValue
;
409 alSetError(Context
, AL_INVALID_VALUE
);
412 case AL_EAXREVERB_MODULATION_TIME
:
413 if(flValue
>= AL_EAXREVERB_MIN_MODULATION_TIME
&&
414 flValue
<= AL_EAXREVERB_MAX_MODULATION_TIME
)
415 ALEffect
->Params
.Reverb
.ModulationTime
= flValue
;
417 alSetError(Context
, AL_INVALID_VALUE
);
420 case AL_EAXREVERB_MODULATION_DEPTH
:
421 if(flValue
>= AL_EAXREVERB_MIN_MODULATION_DEPTH
&&
422 flValue
<= AL_EAXREVERB_MAX_MODULATION_DEPTH
)
423 ALEffect
->Params
.Reverb
.ModulationDepth
= flValue
;
425 alSetError(Context
, AL_INVALID_VALUE
);
428 case AL_EAXREVERB_HFREFERENCE
:
429 if(flValue
>= AL_EAXREVERB_MIN_HFREFERENCE
&&
430 flValue
<= AL_EAXREVERB_MAX_HFREFERENCE
)
431 ALEffect
->Params
.Reverb
.HFReference
= flValue
;
433 alSetError(Context
, AL_INVALID_VALUE
);
436 case AL_EAXREVERB_LFREFERENCE
:
437 if(flValue
>= AL_EAXREVERB_MIN_LFREFERENCE
&&
438 flValue
<= AL_EAXREVERB_MAX_LFREFERENCE
)
439 ALEffect
->Params
.Reverb
.LFReference
= flValue
;
441 alSetError(Context
, AL_INVALID_VALUE
);
444 case AL_EAXREVERB_ROOM_ROLLOFF_FACTOR
:
445 if(flValue
>= 0.0f
&& flValue
<= 10.0f
)
446 ALEffect
->Params
.Reverb
.RoomRolloffFactor
= flValue
;
448 alSetError(Context
, AL_INVALID_VALUE
);
452 alSetError(Context
, AL_INVALID_ENUM
);
456 else if(ALEffect
->type
== AL_EFFECT_REVERB
)
460 case AL_REVERB_DENSITY
:
461 if(flValue
>= AL_REVERB_MIN_DENSITY
&&
462 flValue
<= AL_REVERB_MAX_DENSITY
)
463 ALEffect
->Params
.Reverb
.Density
= flValue
;
465 alSetError(Context
, AL_INVALID_VALUE
);
468 case AL_REVERB_DIFFUSION
:
469 if(flValue
>= AL_REVERB_MIN_DIFFUSION
&&
470 flValue
<= AL_REVERB_MAX_DIFFUSION
)
471 ALEffect
->Params
.Reverb
.Diffusion
= flValue
;
473 alSetError(Context
, AL_INVALID_VALUE
);
477 if(flValue
>= AL_REVERB_MIN_GAIN
&&
478 flValue
<= AL_REVERB_MAX_GAIN
)
479 ALEffect
->Params
.Reverb
.Gain
= flValue
;
481 alSetError(Context
, AL_INVALID_VALUE
);
484 case AL_REVERB_GAINHF
:
485 if(flValue
>= AL_REVERB_MIN_GAINHF
&&
486 flValue
<= AL_REVERB_MAX_GAINHF
)
487 ALEffect
->Params
.Reverb
.GainHF
= flValue
;
489 alSetError(Context
, AL_INVALID_VALUE
);
492 case AL_REVERB_DECAY_TIME
:
493 if(flValue
>= AL_REVERB_MIN_DECAY_TIME
&&
494 flValue
<= AL_REVERB_MAX_DECAY_TIME
)
495 ALEffect
->Params
.Reverb
.DecayTime
= flValue
;
497 alSetError(Context
, AL_INVALID_VALUE
);
500 case AL_REVERB_DECAY_HFRATIO
:
501 if(flValue
>= AL_REVERB_MIN_DECAY_HFRATIO
&&
502 flValue
<= AL_REVERB_MAX_DECAY_HFRATIO
)
503 ALEffect
->Params
.Reverb
.DecayHFRatio
= flValue
;
505 alSetError(Context
, AL_INVALID_VALUE
);
508 case AL_REVERB_REFLECTIONS_GAIN
:
509 if(flValue
>= AL_REVERB_MIN_REFLECTIONS_GAIN
&&
510 flValue
<= AL_REVERB_MAX_REFLECTIONS_GAIN
)
511 ALEffect
->Params
.Reverb
.ReflectionsGain
= flValue
;
513 alSetError(Context
, AL_INVALID_VALUE
);
516 case AL_REVERB_REFLECTIONS_DELAY
:
517 if(flValue
>= AL_REVERB_MIN_REFLECTIONS_DELAY
&&
518 flValue
<= AL_REVERB_MAX_REFLECTIONS_DELAY
)
519 ALEffect
->Params
.Reverb
.ReflectionsDelay
= flValue
;
521 alSetError(Context
, AL_INVALID_VALUE
);
524 case AL_REVERB_LATE_REVERB_GAIN
:
525 if(flValue
>= AL_REVERB_MIN_LATE_REVERB_GAIN
&&
526 flValue
<= AL_REVERB_MAX_LATE_REVERB_GAIN
)
527 ALEffect
->Params
.Reverb
.LateReverbGain
= flValue
;
529 alSetError(Context
, AL_INVALID_VALUE
);
532 case AL_REVERB_LATE_REVERB_DELAY
:
533 if(flValue
>= AL_REVERB_MIN_LATE_REVERB_DELAY
&&
534 flValue
<= AL_REVERB_MAX_LATE_REVERB_DELAY
)
535 ALEffect
->Params
.Reverb
.LateReverbDelay
= flValue
;
537 alSetError(Context
, AL_INVALID_VALUE
);
540 case AL_REVERB_AIR_ABSORPTION_GAINHF
:
541 if(flValue
>= AL_REVERB_MIN_AIR_ABSORPTION_GAINHF
&&
542 flValue
<= AL_REVERB_MAX_AIR_ABSORPTION_GAINHF
)
543 ALEffect
->Params
.Reverb
.AirAbsorptionGainHF
= flValue
;
545 alSetError(Context
, AL_INVALID_VALUE
);
548 case AL_REVERB_ROOM_ROLLOFF_FACTOR
:
549 if(flValue
>= AL_REVERB_MIN_ROOM_ROLLOFF_FACTOR
&&
550 flValue
<= AL_REVERB_MAX_ROOM_ROLLOFF_FACTOR
)
551 ALEffect
->Params
.Reverb
.RoomRolloffFactor
= flValue
;
553 alSetError(Context
, AL_INVALID_VALUE
);
557 alSetError(Context
, AL_INVALID_ENUM
);
561 else if(ALEffect
->type
== AL_EFFECT_ECHO
)
566 if(flValue
>= AL_ECHO_MIN_DELAY
&& flValue
<= AL_ECHO_MAX_DELAY
)
567 ALEffect
->Params
.Echo
.Delay
= flValue
;
569 alSetError(Context
, AL_INVALID_VALUE
);
572 case AL_ECHO_LRDELAY
:
573 if(flValue
>= AL_ECHO_MIN_LRDELAY
&& flValue
<= AL_ECHO_MAX_LRDELAY
)
574 ALEffect
->Params
.Echo
.LRDelay
= flValue
;
576 alSetError(Context
, AL_INVALID_VALUE
);
579 case AL_ECHO_DAMPING
:
580 if(flValue
>= AL_ECHO_MIN_DAMPING
&& flValue
<= AL_ECHO_MAX_DAMPING
)
581 ALEffect
->Params
.Echo
.Damping
= flValue
;
583 alSetError(Context
, AL_INVALID_VALUE
);
586 case AL_ECHO_FEEDBACK
:
587 if(flValue
>= AL_ECHO_MIN_FEEDBACK
&& flValue
<= AL_ECHO_MAX_FEEDBACK
)
588 ALEffect
->Params
.Echo
.Feedback
= flValue
;
590 alSetError(Context
, AL_INVALID_VALUE
);
594 if(flValue
>= AL_ECHO_MIN_SPREAD
&& flValue
<= AL_ECHO_MAX_SPREAD
)
595 ALEffect
->Params
.Echo
.Spread
= flValue
;
597 alSetError(Context
, AL_INVALID_VALUE
);
601 alSetError(Context
, AL_INVALID_ENUM
);
605 else if(ALEffect
->type
== AL_EFFECT_RING_MODULATOR
)
609 case AL_RING_MODULATOR_FREQUENCY
:
610 if(flValue
>= AL_RING_MODULATOR_MIN_FREQUENCY
&&
611 flValue
<= AL_RING_MODULATOR_MAX_FREQUENCY
)
612 ALEffect
->Params
.Modulator
.Frequency
= flValue
;
614 alSetError(Context
, AL_INVALID_VALUE
);
617 case AL_RING_MODULATOR_HIGHPASS_CUTOFF
:
618 if(flValue
>= AL_RING_MODULATOR_MIN_HIGHPASS_CUTOFF
&&
619 flValue
<= AL_RING_MODULATOR_MAX_HIGHPASS_CUTOFF
)
620 ALEffect
->Params
.Modulator
.HighPassCutoff
= flValue
;
622 alSetError(Context
, AL_INVALID_VALUE
);
626 alSetError(Context
, AL_INVALID_ENUM
);
630 else if(ALEffect
->type
== AL_EFFECT_DEDICATED_LOW_FREQUENCY_EFFECT
||
631 ALEffect
->type
== AL_EFFECT_DEDICATED_DIALOGUE
)
635 case AL_DEDICATED_GAIN
:
636 if(flValue
>= 0.0f
&& isfinite(flValue
))
637 ALEffect
->Params
.Dedicated
.Gain
= flValue
;
639 alSetError(Context
, AL_INVALID_VALUE
);
643 alSetError(Context
, AL_INVALID_ENUM
);
648 alSetError(Context
, AL_INVALID_ENUM
);
651 alSetError(Context
, AL_INVALID_NAME
);
653 UnlockContext(Context
);
656 AL_API ALvoid AL_APIENTRY
alEffectfv(ALuint effect
, ALenum param
, ALfloat
*pflValues
)
662 Context
= GetLockedContext();
665 Device
= Context
->Device
;
666 if((ALEffect
=LookupEffect(Device
->EffectMap
, effect
)) != NULL
)
668 if(ALEffect
->type
== AL_EFFECT_EAXREVERB
)
672 case AL_EAXREVERB_REFLECTIONS_PAN
:
673 if(isfinite(pflValues
[0]) && isfinite(pflValues
[1]) && isfinite(pflValues
[2]))
675 ALEffect
->Params
.Reverb
.ReflectionsPan
[0] = pflValues
[0];
676 ALEffect
->Params
.Reverb
.ReflectionsPan
[1] = pflValues
[1];
677 ALEffect
->Params
.Reverb
.ReflectionsPan
[2] = pflValues
[2];
680 alSetError(Context
, AL_INVALID_VALUE
);
682 case AL_EAXREVERB_LATE_REVERB_PAN
:
683 if(isfinite(pflValues
[0]) && isfinite(pflValues
[1]) && isfinite(pflValues
[2]))
685 ALEffect
->Params
.Reverb
.LateReverbPan
[0] = pflValues
[0];
686 ALEffect
->Params
.Reverb
.LateReverbPan
[1] = pflValues
[1];
687 ALEffect
->Params
.Reverb
.LateReverbPan
[2] = pflValues
[2];
690 alSetError(Context
, AL_INVALID_VALUE
);
694 UnlockContext(Context
);
695 alEffectf(effect
, param
, pflValues
[0]);
701 UnlockContext(Context
);
702 alEffectf(effect
, param
, pflValues
[0]);
707 alSetError(Context
, AL_INVALID_NAME
);
709 UnlockContext(Context
);
712 AL_API ALvoid AL_APIENTRY
alGetEffecti(ALuint effect
, ALenum param
, ALint
*piValue
)
718 Context
= GetLockedContext();
721 Device
= Context
->Device
;
722 if((ALEffect
=LookupEffect(Device
->EffectMap
, effect
)) != NULL
)
724 if(param
== AL_EFFECT_TYPE
)
726 *piValue
= ALEffect
->type
;
728 else if(ALEffect
->type
== AL_EFFECT_EAXREVERB
)
732 case AL_EAXREVERB_DECAY_HFLIMIT
:
733 *piValue
= ALEffect
->Params
.Reverb
.DecayHFLimit
;
737 alSetError(Context
, AL_INVALID_ENUM
);
741 else if(ALEffect
->type
== AL_EFFECT_REVERB
)
745 case AL_REVERB_DECAY_HFLIMIT
:
746 *piValue
= ALEffect
->Params
.Reverb
.DecayHFLimit
;
750 alSetError(Context
, AL_INVALID_ENUM
);
754 else if(ALEffect
->type
== AL_EFFECT_ECHO
)
759 alSetError(Context
, AL_INVALID_ENUM
);
763 else if(ALEffect
->type
== AL_EFFECT_RING_MODULATOR
)
767 case AL_RING_MODULATOR_FREQUENCY
:
768 *piValue
= (ALint
)ALEffect
->Params
.Modulator
.Frequency
;
770 case AL_RING_MODULATOR_HIGHPASS_CUTOFF
:
771 *piValue
= (ALint
)ALEffect
->Params
.Modulator
.HighPassCutoff
;
773 case AL_RING_MODULATOR_WAVEFORM
:
774 *piValue
= ALEffect
->Params
.Modulator
.Waveform
;
778 alSetError(Context
, AL_INVALID_ENUM
);
783 alSetError(Context
, AL_INVALID_ENUM
);
786 alSetError(Context
, AL_INVALID_NAME
);
788 UnlockContext(Context
);
791 AL_API ALvoid AL_APIENTRY
alGetEffectiv(ALuint effect
, ALenum param
, ALint
*piValues
)
793 /* There are no multi-value int effect parameters */
794 alGetEffecti(effect
, param
, piValues
);
797 AL_API ALvoid AL_APIENTRY
alGetEffectf(ALuint effect
, ALenum param
, ALfloat
*pflValue
)
803 Context
= GetLockedContext();
806 Device
= Context
->Device
;
807 if((ALEffect
=LookupEffect(Device
->EffectMap
, effect
)) != NULL
)
809 if(ALEffect
->type
== AL_EFFECT_EAXREVERB
)
813 case AL_EAXREVERB_DENSITY
:
814 *pflValue
= ALEffect
->Params
.Reverb
.Density
;
817 case AL_EAXREVERB_DIFFUSION
:
818 *pflValue
= ALEffect
->Params
.Reverb
.Diffusion
;
821 case AL_EAXREVERB_GAIN
:
822 *pflValue
= ALEffect
->Params
.Reverb
.Gain
;
825 case AL_EAXREVERB_GAINHF
:
826 *pflValue
= ALEffect
->Params
.Reverb
.GainHF
;
829 case AL_EAXREVERB_GAINLF
:
830 *pflValue
= ALEffect
->Params
.Reverb
.GainLF
;
833 case AL_EAXREVERB_DECAY_TIME
:
834 *pflValue
= ALEffect
->Params
.Reverb
.DecayTime
;
837 case AL_EAXREVERB_DECAY_HFRATIO
:
838 *pflValue
= ALEffect
->Params
.Reverb
.DecayHFRatio
;
841 case AL_EAXREVERB_DECAY_LFRATIO
:
842 *pflValue
= ALEffect
->Params
.Reverb
.DecayLFRatio
;
845 case AL_EAXREVERB_REFLECTIONS_GAIN
:
846 *pflValue
= ALEffect
->Params
.Reverb
.ReflectionsGain
;
849 case AL_EAXREVERB_REFLECTIONS_DELAY
:
850 *pflValue
= ALEffect
->Params
.Reverb
.ReflectionsDelay
;
853 case AL_EAXREVERB_LATE_REVERB_GAIN
:
854 *pflValue
= ALEffect
->Params
.Reverb
.LateReverbGain
;
857 case AL_EAXREVERB_LATE_REVERB_DELAY
:
858 *pflValue
= ALEffect
->Params
.Reverb
.LateReverbDelay
;
861 case AL_EAXREVERB_AIR_ABSORPTION_GAINHF
:
862 *pflValue
= ALEffect
->Params
.Reverb
.AirAbsorptionGainHF
;
865 case AL_EAXREVERB_ECHO_TIME
:
866 *pflValue
= ALEffect
->Params
.Reverb
.EchoTime
;
869 case AL_EAXREVERB_ECHO_DEPTH
:
870 *pflValue
= ALEffect
->Params
.Reverb
.EchoDepth
;
873 case AL_EAXREVERB_MODULATION_TIME
:
874 *pflValue
= ALEffect
->Params
.Reverb
.ModulationTime
;
877 case AL_EAXREVERB_MODULATION_DEPTH
:
878 *pflValue
= ALEffect
->Params
.Reverb
.ModulationDepth
;
881 case AL_EAXREVERB_HFREFERENCE
:
882 *pflValue
= ALEffect
->Params
.Reverb
.HFReference
;
885 case AL_EAXREVERB_LFREFERENCE
:
886 *pflValue
= ALEffect
->Params
.Reverb
.LFReference
;
889 case AL_EAXREVERB_ROOM_ROLLOFF_FACTOR
:
890 *pflValue
= ALEffect
->Params
.Reverb
.RoomRolloffFactor
;
894 alSetError(Context
, AL_INVALID_ENUM
);
898 else if(ALEffect
->type
== AL_EFFECT_REVERB
)
902 case AL_REVERB_DENSITY
:
903 *pflValue
= ALEffect
->Params
.Reverb
.Density
;
906 case AL_REVERB_DIFFUSION
:
907 *pflValue
= ALEffect
->Params
.Reverb
.Diffusion
;
911 *pflValue
= ALEffect
->Params
.Reverb
.Gain
;
914 case AL_REVERB_GAINHF
:
915 *pflValue
= ALEffect
->Params
.Reverb
.GainHF
;
918 case AL_REVERB_DECAY_TIME
:
919 *pflValue
= ALEffect
->Params
.Reverb
.DecayTime
;
922 case AL_REVERB_DECAY_HFRATIO
:
923 *pflValue
= ALEffect
->Params
.Reverb
.DecayHFRatio
;
926 case AL_REVERB_REFLECTIONS_GAIN
:
927 *pflValue
= ALEffect
->Params
.Reverb
.ReflectionsGain
;
930 case AL_REVERB_REFLECTIONS_DELAY
:
931 *pflValue
= ALEffect
->Params
.Reverb
.ReflectionsDelay
;
934 case AL_REVERB_LATE_REVERB_GAIN
:
935 *pflValue
= ALEffect
->Params
.Reverb
.LateReverbGain
;
938 case AL_REVERB_LATE_REVERB_DELAY
:
939 *pflValue
= ALEffect
->Params
.Reverb
.LateReverbDelay
;
942 case AL_REVERB_AIR_ABSORPTION_GAINHF
:
943 *pflValue
= ALEffect
->Params
.Reverb
.AirAbsorptionGainHF
;
946 case AL_REVERB_ROOM_ROLLOFF_FACTOR
:
947 *pflValue
= ALEffect
->Params
.Reverb
.RoomRolloffFactor
;
951 alSetError(Context
, AL_INVALID_ENUM
);
955 else if(ALEffect
->type
== AL_EFFECT_ECHO
)
960 *pflValue
= ALEffect
->Params
.Echo
.Delay
;
963 case AL_ECHO_LRDELAY
:
964 *pflValue
= ALEffect
->Params
.Echo
.LRDelay
;
967 case AL_ECHO_DAMPING
:
968 *pflValue
= ALEffect
->Params
.Echo
.Damping
;
971 case AL_ECHO_FEEDBACK
:
972 *pflValue
= ALEffect
->Params
.Echo
.Feedback
;
976 *pflValue
= ALEffect
->Params
.Echo
.Spread
;
980 alSetError(Context
, AL_INVALID_ENUM
);
984 else if(ALEffect
->type
== AL_EFFECT_RING_MODULATOR
)
988 case AL_RING_MODULATOR_FREQUENCY
:
989 *pflValue
= ALEffect
->Params
.Modulator
.Frequency
;
991 case AL_RING_MODULATOR_HIGHPASS_CUTOFF
:
992 *pflValue
= ALEffect
->Params
.Modulator
.HighPassCutoff
;
996 alSetError(Context
, AL_INVALID_ENUM
);
1000 else if(ALEffect
->type
== AL_EFFECT_DEDICATED_LOW_FREQUENCY_EFFECT
||
1001 ALEffect
->type
== AL_EFFECT_DEDICATED_DIALOGUE
)
1005 case AL_DEDICATED_GAIN
:
1006 *pflValue
= ALEffect
->Params
.Dedicated
.Gain
;
1010 alSetError(Context
, AL_INVALID_ENUM
);
1015 alSetError(Context
, AL_INVALID_ENUM
);
1018 alSetError(Context
, AL_INVALID_NAME
);
1020 UnlockContext(Context
);
1023 AL_API ALvoid AL_APIENTRY
alGetEffectfv(ALuint effect
, ALenum param
, ALfloat
*pflValues
)
1025 ALCcontext
*Context
;
1029 Context
= GetLockedContext();
1030 if(!Context
) return;
1032 Device
= Context
->Device
;
1033 if((ALEffect
=LookupEffect(Device
->EffectMap
, effect
)) != NULL
)
1035 if(ALEffect
->type
== AL_EFFECT_EAXREVERB
)
1039 case AL_EAXREVERB_REFLECTIONS_PAN
:
1040 pflValues
[0] = ALEffect
->Params
.Reverb
.ReflectionsPan
[0];
1041 pflValues
[1] = ALEffect
->Params
.Reverb
.ReflectionsPan
[1];
1042 pflValues
[2] = ALEffect
->Params
.Reverb
.ReflectionsPan
[2];
1044 case AL_EAXREVERB_LATE_REVERB_PAN
:
1045 pflValues
[0] = ALEffect
->Params
.Reverb
.LateReverbPan
[0];
1046 pflValues
[1] = ALEffect
->Params
.Reverb
.LateReverbPan
[1];
1047 pflValues
[2] = ALEffect
->Params
.Reverb
.LateReverbPan
[2];
1051 UnlockContext(Context
);
1052 alGetEffectf(effect
, param
, pflValues
);
1058 UnlockContext(Context
);
1059 alGetEffectf(effect
, param
, pflValues
);
1064 alSetError(Context
, AL_INVALID_NAME
);
1066 UnlockContext(Context
);
1070 ALvoid
ReleaseALEffects(ALCdevice
*device
)
1073 for(i
= 0;i
< device
->EffectMap
.size
;i
++)
1075 ALeffect
*temp
= device
->EffectMap
.array
[i
].value
;
1076 device
->EffectMap
.array
[i
].value
= NULL
;
1078 // Release effect structure
1079 ALTHUNK_REMOVEENTRY(temp
->effect
);
1080 memset(temp
, 0, sizeof(ALeffect
));
1086 static void InitEffectParams(ALeffect
*effect
, ALenum type
)
1088 effect
->type
= type
;
1091 /* NOTE: Standard reverb and EAX reverb use the same defaults for the
1092 * shared parameters, and EAX's additional parameters default to
1093 * values assumed by standard reverb.
1095 case AL_EFFECT_EAXREVERB
:
1096 case AL_EFFECT_REVERB
:
1097 effect
->Params
.Reverb
.Density
= AL_EAXREVERB_DEFAULT_DENSITY
;
1098 effect
->Params
.Reverb
.Diffusion
= AL_EAXREVERB_DEFAULT_DIFFUSION
;
1099 effect
->Params
.Reverb
.Gain
= AL_EAXREVERB_DEFAULT_GAIN
;
1100 effect
->Params
.Reverb
.GainHF
= AL_EAXREVERB_DEFAULT_GAINHF
;
1101 effect
->Params
.Reverb
.GainLF
= AL_EAXREVERB_DEFAULT_GAINLF
;
1102 effect
->Params
.Reverb
.DecayTime
= AL_EAXREVERB_DEFAULT_DECAY_TIME
;
1103 effect
->Params
.Reverb
.DecayHFRatio
= AL_EAXREVERB_DEFAULT_DECAY_HFRATIO
;
1104 effect
->Params
.Reverb
.DecayLFRatio
= AL_EAXREVERB_DEFAULT_DECAY_LFRATIO
;
1105 effect
->Params
.Reverb
.ReflectionsGain
= AL_EAXREVERB_DEFAULT_REFLECTIONS_GAIN
;
1106 effect
->Params
.Reverb
.ReflectionsDelay
= AL_EAXREVERB_DEFAULT_REFLECTIONS_DELAY
;
1107 effect
->Params
.Reverb
.ReflectionsPan
[0] = AL_EAXREVERB_DEFAULT_REFLECTIONS_PAN_XYZ
;
1108 effect
->Params
.Reverb
.ReflectionsPan
[1] = AL_EAXREVERB_DEFAULT_REFLECTIONS_PAN_XYZ
;
1109 effect
->Params
.Reverb
.ReflectionsPan
[2] = AL_EAXREVERB_DEFAULT_REFLECTIONS_PAN_XYZ
;
1110 effect
->Params
.Reverb
.LateReverbGain
= AL_EAXREVERB_DEFAULT_LATE_REVERB_GAIN
;
1111 effect
->Params
.Reverb
.LateReverbDelay
= AL_EAXREVERB_DEFAULT_LATE_REVERB_DELAY
;
1112 effect
->Params
.Reverb
.LateReverbPan
[0] = AL_EAXREVERB_DEFAULT_LATE_REVERB_PAN_XYZ
;
1113 effect
->Params
.Reverb
.LateReverbPan
[1] = AL_EAXREVERB_DEFAULT_LATE_REVERB_PAN_XYZ
;
1114 effect
->Params
.Reverb
.LateReverbPan
[2] = AL_EAXREVERB_DEFAULT_LATE_REVERB_PAN_XYZ
;
1115 effect
->Params
.Reverb
.EchoTime
= AL_EAXREVERB_DEFAULT_ECHO_TIME
;
1116 effect
->Params
.Reverb
.EchoDepth
= AL_EAXREVERB_DEFAULT_ECHO_DEPTH
;
1117 effect
->Params
.Reverb
.ModulationTime
= AL_EAXREVERB_DEFAULT_MODULATION_TIME
;
1118 effect
->Params
.Reverb
.ModulationDepth
= AL_EAXREVERB_DEFAULT_MODULATION_DEPTH
;
1119 effect
->Params
.Reverb
.AirAbsorptionGainHF
= AL_EAXREVERB_DEFAULT_AIR_ABSORPTION_GAINHF
;
1120 effect
->Params
.Reverb
.HFReference
= AL_EAXREVERB_DEFAULT_HFREFERENCE
;
1121 effect
->Params
.Reverb
.LFReference
= AL_EAXREVERB_DEFAULT_LFREFERENCE
;
1122 effect
->Params
.Reverb
.RoomRolloffFactor
= AL_EAXREVERB_DEFAULT_ROOM_ROLLOFF_FACTOR
;
1123 effect
->Params
.Reverb
.DecayHFLimit
= AL_EAXREVERB_DEFAULT_DECAY_HFLIMIT
;
1125 case AL_EFFECT_ECHO
:
1126 effect
->Params
.Echo
.Delay
= AL_ECHO_DEFAULT_DELAY
;
1127 effect
->Params
.Echo
.LRDelay
= AL_ECHO_DEFAULT_LRDELAY
;
1128 effect
->Params
.Echo
.Damping
= AL_ECHO_DEFAULT_DAMPING
;
1129 effect
->Params
.Echo
.Feedback
= AL_ECHO_DEFAULT_FEEDBACK
;
1130 effect
->Params
.Echo
.Spread
= AL_ECHO_DEFAULT_SPREAD
;
1132 case AL_EFFECT_RING_MODULATOR
:
1133 effect
->Params
.Modulator
.Frequency
= AL_RING_MODULATOR_DEFAULT_FREQUENCY
;
1134 effect
->Params
.Modulator
.HighPassCutoff
= AL_RING_MODULATOR_DEFAULT_HIGHPASS_CUTOFF
;
1135 effect
->Params
.Modulator
.Waveform
= AL_RING_MODULATOR_DEFAULT_WAVEFORM
;
1137 case AL_EFFECT_DEDICATED_LOW_FREQUENCY_EFFECT
:
1138 case AL_EFFECT_DEDICATED_DIALOGUE
:
1139 effect
->Params
.Dedicated
.Gain
= 1.0f
;