2 * OpenAL cross platform audio library
3 * Copyright (C) 1999-2000 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.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 * Or go to http://www.gnu.org/copyleft/lgpl.html
30 #include "alAuxEffectSlot.h"
33 #include "backends/base.h"
34 #include "midi/base.h"
37 static const ALchar alVendor
[] = "OpenAL Community";
38 static const ALchar alVersion
[] = "1.1 ALSOFT "ALSOFT_VERSION
;
39 static const ALchar alRenderer
[] = "OpenAL Soft";
42 static const ALchar alNoError
[] = "No Error";
43 static const ALchar alErrInvalidName
[] = "Invalid Name";
44 static const ALchar alErrInvalidEnum
[] = "Invalid Enum";
45 static const ALchar alErrInvalidValue
[] = "Invalid Value";
46 static const ALchar alErrInvalidOp
[] = "Invalid Operation";
47 static const ALchar alErrOutOfMemory
[] = "Out of Memory";
49 AL_API ALvoid AL_APIENTRY
alEnable(ALenum capability
)
53 context
= GetContextRef();
58 case AL_SOURCE_DISTANCE_MODEL
:
59 context
->SourceDistanceModel
= AL_TRUE
;
60 ATOMIC_STORE(&context
->UpdateSources
, AL_TRUE
);
64 SET_ERROR_AND_GOTO(context
, AL_INVALID_ENUM
, done
);
68 ALCcontext_DecRef(context
);
71 AL_API ALvoid AL_APIENTRY
alDisable(ALenum capability
)
75 context
= GetContextRef();
80 case AL_SOURCE_DISTANCE_MODEL
:
81 context
->SourceDistanceModel
= AL_FALSE
;
82 ATOMIC_STORE(&context
->UpdateSources
, AL_TRUE
);
86 SET_ERROR_AND_GOTO(context
, AL_INVALID_ENUM
, done
);
90 ALCcontext_DecRef(context
);
93 AL_API ALboolean AL_APIENTRY
alIsEnabled(ALenum capability
)
96 ALboolean value
=AL_FALSE
;
98 context
= GetContextRef();
99 if(!context
) return AL_FALSE
;
103 case AL_SOURCE_DISTANCE_MODEL
:
104 value
= context
->SourceDistanceModel
;
108 SET_ERROR_AND_GOTO(context
, AL_INVALID_ENUM
, done
);
112 ALCcontext_DecRef(context
);
117 AL_API ALboolean AL_APIENTRY
alGetBoolean(ALenum pname
)
120 ALboolean value
=AL_FALSE
;
122 context
= GetContextRef();
123 if(!context
) return AL_FALSE
;
127 case AL_DOPPLER_FACTOR
:
128 if(context
->DopplerFactor
!= 0.0f
)
132 case AL_DOPPLER_VELOCITY
:
133 if(context
->DopplerVelocity
!= 0.0f
)
137 case AL_DISTANCE_MODEL
:
138 if(context
->DistanceModel
== AL_INVERSE_DISTANCE_CLAMPED
)
142 case AL_SPEED_OF_SOUND
:
143 if(context
->SpeedOfSound
!= 0.0f
)
147 case AL_DEFERRED_UPDATES_SOFT
:
148 value
= context
->DeferUpdates
;
152 SET_ERROR_AND_GOTO(context
, AL_INVALID_ENUM
, done
);
156 ALCcontext_DecRef(context
);
161 AL_API ALdouble AL_APIENTRY
alGetDouble(ALenum pname
)
165 ALdouble value
= 0.0;
167 context
= GetContextRef();
168 if(!context
) return 0.0;
172 case AL_DOPPLER_FACTOR
:
173 value
= (ALdouble
)context
->DopplerFactor
;
176 case AL_DOPPLER_VELOCITY
:
177 value
= (ALdouble
)context
->DopplerVelocity
;
180 case AL_DISTANCE_MODEL
:
181 value
= (ALdouble
)context
->DistanceModel
;
184 case AL_SPEED_OF_SOUND
:
185 value
= (ALdouble
)context
->SpeedOfSound
;
188 case AL_DEFERRED_UPDATES_SOFT
:
189 value
= (ALdouble
)context
->DeferUpdates
;
192 case AL_MIDI_GAIN_SOFT
:
193 device
= context
->Device
;
194 value
= (ALdouble
)MidiSynth_getGain(device
->Synth
);
197 case AL_MIDI_STATE_SOFT
:
198 device
= context
->Device
;
199 value
= (ALdouble
)MidiSynth_getState(device
->Synth
);
203 SET_ERROR_AND_GOTO(context
, AL_INVALID_ENUM
, done
);
207 ALCcontext_DecRef(context
);
212 AL_API ALfloat AL_APIENTRY
alGetFloat(ALenum pname
)
216 ALfloat value
= 0.0f
;
218 context
= GetContextRef();
219 if(!context
) return 0.0f
;
223 case AL_DOPPLER_FACTOR
:
224 value
= context
->DopplerFactor
;
227 case AL_DOPPLER_VELOCITY
:
228 value
= context
->DopplerVelocity
;
231 case AL_DISTANCE_MODEL
:
232 value
= (ALfloat
)context
->DistanceModel
;
235 case AL_SPEED_OF_SOUND
:
236 value
= context
->SpeedOfSound
;
239 case AL_DEFERRED_UPDATES_SOFT
:
240 value
= (ALfloat
)context
->DeferUpdates
;
243 case AL_MIDI_GAIN_SOFT
:
244 device
= context
->Device
;
245 value
= MidiSynth_getGain(device
->Synth
);
248 case AL_MIDI_STATE_SOFT
:
249 device
= context
->Device
;
250 value
= (ALfloat
)MidiSynth_getState(device
->Synth
);
254 SET_ERROR_AND_GOTO(context
, AL_INVALID_ENUM
, done
);
258 ALCcontext_DecRef(context
);
263 AL_API ALint AL_APIENTRY
alGetInteger(ALenum pname
)
270 context
= GetContextRef();
271 if(!context
) return 0;
275 case AL_DOPPLER_FACTOR
:
276 value
= (ALint
)context
->DopplerFactor
;
279 case AL_DOPPLER_VELOCITY
:
280 value
= (ALint
)context
->DopplerVelocity
;
283 case AL_DISTANCE_MODEL
:
284 value
= (ALint
)context
->DistanceModel
;
287 case AL_SPEED_OF_SOUND
:
288 value
= (ALint
)context
->SpeedOfSound
;
291 case AL_DEFERRED_UPDATES_SOFT
:
292 value
= (ALint
)context
->DeferUpdates
;
295 case AL_SOUNDFONTS_SIZE_SOFT
:
296 device
= context
->Device
;
297 synth
= device
->Synth
;
298 value
= synth
->NumSoundfonts
;
301 case AL_MIDI_STATE_SOFT
:
302 device
= context
->Device
;
303 value
= MidiSynth_getState(device
->Synth
);
307 SET_ERROR_AND_GOTO(context
, AL_INVALID_ENUM
, done
);
311 ALCcontext_DecRef(context
);
316 AL_API ALint64SOFT AL_APIENTRY
alGetInteger64SOFT(ALenum pname
)
321 ALint64SOFT value
= 0;
323 context
= GetContextRef();
324 if(!context
) return 0;
328 case AL_DOPPLER_FACTOR
:
329 value
= (ALint64SOFT
)context
->DopplerFactor
;
332 case AL_DOPPLER_VELOCITY
:
333 value
= (ALint64SOFT
)context
->DopplerVelocity
;
336 case AL_DISTANCE_MODEL
:
337 value
= (ALint64SOFT
)context
->DistanceModel
;
340 case AL_SPEED_OF_SOUND
:
341 value
= (ALint64SOFT
)context
->SpeedOfSound
;
344 case AL_DEFERRED_UPDATES_SOFT
:
345 value
= (ALint64SOFT
)context
->DeferUpdates
;
348 case AL_MIDI_CLOCK_SOFT
:
349 device
= context
->Device
;
350 V0(device
->Backend
,lock
)();
351 value
= MidiSynth_getTime(device
->Synth
);
352 V0(device
->Backend
,unlock
)();
355 case AL_SOUNDFONTS_SIZE_SOFT
:
356 device
= context
->Device
;
357 synth
= device
->Synth
;
358 value
= (ALint64SOFT
)synth
->NumSoundfonts
;
361 case AL_MIDI_STATE_SOFT
:
362 device
= context
->Device
;
363 value
= (ALint64SOFT
)MidiSynth_getState(device
->Synth
);
367 SET_ERROR_AND_GOTO(context
, AL_INVALID_ENUM
, done
);
371 ALCcontext_DecRef(context
);
376 AL_API ALvoid AL_APIENTRY
alGetBooleanv(ALenum pname
, ALboolean
*values
)
384 case AL_DOPPLER_FACTOR
:
385 case AL_DOPPLER_VELOCITY
:
386 case AL_DISTANCE_MODEL
:
387 case AL_SPEED_OF_SOUND
:
388 case AL_DEFERRED_UPDATES_SOFT
:
389 values
[0] = alGetBoolean(pname
);
394 context
= GetContextRef();
398 SET_ERROR_AND_GOTO(context
, AL_INVALID_VALUE
, done
);
402 SET_ERROR_AND_GOTO(context
, AL_INVALID_ENUM
, done
);
406 ALCcontext_DecRef(context
);
409 AL_API ALvoid AL_APIENTRY
alGetDoublev(ALenum pname
, ALdouble
*values
)
417 case AL_DOPPLER_FACTOR
:
418 case AL_DOPPLER_VELOCITY
:
419 case AL_DISTANCE_MODEL
:
420 case AL_SPEED_OF_SOUND
:
421 case AL_DEFERRED_UPDATES_SOFT
:
422 case AL_MIDI_GAIN_SOFT
:
423 case AL_MIDI_STATE_SOFT
:
424 values
[0] = alGetDouble(pname
);
429 context
= GetContextRef();
433 SET_ERROR_AND_GOTO(context
, AL_INVALID_VALUE
, done
);
437 SET_ERROR_AND_GOTO(context
, AL_INVALID_ENUM
, done
);
441 ALCcontext_DecRef(context
);
444 AL_API ALvoid AL_APIENTRY
alGetFloatv(ALenum pname
, ALfloat
*values
)
452 case AL_DOPPLER_FACTOR
:
453 case AL_DOPPLER_VELOCITY
:
454 case AL_DISTANCE_MODEL
:
455 case AL_SPEED_OF_SOUND
:
456 case AL_DEFERRED_UPDATES_SOFT
:
457 case AL_MIDI_GAIN_SOFT
:
458 case AL_MIDI_STATE_SOFT
:
459 values
[0] = alGetFloat(pname
);
464 context
= GetContextRef();
468 SET_ERROR_AND_GOTO(context
, AL_INVALID_VALUE
, done
);
472 SET_ERROR_AND_GOTO(context
, AL_INVALID_ENUM
, done
);
476 ALCcontext_DecRef(context
);
479 AL_API ALvoid AL_APIENTRY
alGetIntegerv(ALenum pname
, ALint
*values
)
490 case AL_DOPPLER_FACTOR
:
491 case AL_DOPPLER_VELOCITY
:
492 case AL_DISTANCE_MODEL
:
493 case AL_SPEED_OF_SOUND
:
494 case AL_DEFERRED_UPDATES_SOFT
:
495 case AL_SOUNDFONTS_SIZE_SOFT
:
496 case AL_MIDI_STATE_SOFT
:
497 values
[0] = alGetInteger(pname
);
502 context
= GetContextRef();
507 case AL_SOUNDFONTS_SOFT
:
508 device
= context
->Device
;
509 synth
= device
->Synth
;
510 if(synth
->NumSoundfonts
> 0)
513 SET_ERROR_AND_GOTO(context
, AL_INVALID_VALUE
, done
);
514 for(i
= 0;i
< synth
->NumSoundfonts
;i
++)
515 values
[i
] = synth
->Soundfonts
[i
]->id
;
520 SET_ERROR_AND_GOTO(context
, AL_INVALID_ENUM
, done
);
524 ALCcontext_DecRef(context
);
527 AL_API
void AL_APIENTRY
alGetInteger64vSOFT(ALenum pname
, ALint64SOFT
*values
)
538 case AL_DOPPLER_FACTOR
:
539 case AL_DOPPLER_VELOCITY
:
540 case AL_DISTANCE_MODEL
:
541 case AL_SPEED_OF_SOUND
:
542 case AL_DEFERRED_UPDATES_SOFT
:
543 case AL_MIDI_CLOCK_SOFT
:
544 case AL_SOUNDFONTS_SIZE_SOFT
:
545 case AL_MIDI_STATE_SOFT
:
546 values
[0] = alGetInteger64SOFT(pname
);
551 context
= GetContextRef();
556 case AL_SOUNDFONTS_SOFT
:
557 device
= context
->Device
;
558 synth
= device
->Synth
;
559 if(synth
->NumSoundfonts
> 0)
562 SET_ERROR_AND_GOTO(context
, AL_INVALID_VALUE
, done
);
563 for(i
= 0;i
< synth
->NumSoundfonts
;i
++)
564 values
[i
] = (ALint64SOFT
)synth
->Soundfonts
[i
]->id
;
569 SET_ERROR_AND_GOTO(context
, AL_INVALID_ENUM
, done
);
573 ALCcontext_DecRef(context
);
576 AL_API
const ALchar
* AL_APIENTRY
alGetString(ALenum pname
)
578 const ALchar
*value
= NULL
;
581 context
= GetContextRef();
582 if(!context
) return NULL
;
599 value
= context
->ExtensionList
;
606 case AL_INVALID_NAME
:
607 value
= alErrInvalidName
;
610 case AL_INVALID_ENUM
:
611 value
= alErrInvalidEnum
;
614 case AL_INVALID_VALUE
:
615 value
= alErrInvalidValue
;
618 case AL_INVALID_OPERATION
:
619 value
= alErrInvalidOp
;
622 case AL_OUT_OF_MEMORY
:
623 value
= alErrOutOfMemory
;
627 SET_ERROR_AND_GOTO(context
, AL_INVALID_ENUM
, done
);
631 ALCcontext_DecRef(context
);
636 AL_API ALvoid AL_APIENTRY
alDopplerFactor(ALfloat value
)
640 context
= GetContextRef();
643 if(!(value
>= 0.0f
&& isfinite(value
)))
644 SET_ERROR_AND_GOTO(context
, AL_INVALID_VALUE
, done
);
646 context
->DopplerFactor
= value
;
647 ATOMIC_STORE(&context
->UpdateSources
, AL_TRUE
);
650 ALCcontext_DecRef(context
);
653 AL_API ALvoid AL_APIENTRY
alDopplerVelocity(ALfloat value
)
657 context
= GetContextRef();
660 if(!(value
>= 0.0f
&& isfinite(value
)))
661 SET_ERROR_AND_GOTO(context
, AL_INVALID_VALUE
, done
);
663 context
->DopplerVelocity
= value
;
664 ATOMIC_STORE(&context
->UpdateSources
, AL_TRUE
);
667 ALCcontext_DecRef(context
);
670 AL_API ALvoid AL_APIENTRY
alSpeedOfSound(ALfloat value
)
674 context
= GetContextRef();
677 if(!(value
> 0.0f
&& isfinite(value
)))
678 SET_ERROR_AND_GOTO(context
, AL_INVALID_VALUE
, done
);
680 context
->SpeedOfSound
= value
;
681 ATOMIC_STORE(&context
->UpdateSources
, AL_TRUE
);
684 ALCcontext_DecRef(context
);
687 AL_API ALvoid AL_APIENTRY
alDistanceModel(ALenum value
)
691 context
= GetContextRef();
694 if(!(value
== AL_INVERSE_DISTANCE
|| value
== AL_INVERSE_DISTANCE_CLAMPED
||
695 value
== AL_LINEAR_DISTANCE
|| value
== AL_LINEAR_DISTANCE_CLAMPED
||
696 value
== AL_EXPONENT_DISTANCE
|| value
== AL_EXPONENT_DISTANCE_CLAMPED
||
698 SET_ERROR_AND_GOTO(context
, AL_INVALID_VALUE
, done
);
700 context
->DistanceModel
= value
;
701 if(!context
->SourceDistanceModel
)
702 ATOMIC_STORE(&context
->UpdateSources
, AL_TRUE
);
705 ALCcontext_DecRef(context
);
709 AL_API ALvoid AL_APIENTRY
alDeferUpdatesSOFT(void)
713 context
= GetContextRef();
716 ALCcontext_DeferUpdates(context
);
718 ALCcontext_DecRef(context
);
721 AL_API ALvoid AL_APIENTRY
alProcessUpdatesSOFT(void)
725 context
= GetContextRef();
728 ALCcontext_ProcessUpdates(context
);
730 ALCcontext_DecRef(context
);