Do not open pulseaudio if it didn't load
[openal-soft.git] / OpenAL32 / alState.c
blob8ca5a01259206e447d06aa440dc39891006f3877
1 /**
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., 59 Temple Place - Suite 330,
17 * Boston, MA 02111-1307, USA.
18 * Or go to http://www.gnu.org/copyleft/lgpl.html
21 #include "config.h"
23 #include <stdlib.h>
24 #include "alMain.h"
25 #include "AL/alc.h"
26 #include "alError.h"
27 #include "alSource.h"
28 #include "alState.h"
30 static const ALchar alVendor[] = "OpenAL Community";
31 static const ALchar alVersion[] = "1.1 ALSOFT "ALSOFT_VERSION;
32 static const ALchar alRenderer[] = "OpenAL Soft";
34 // Error Messages
35 static const ALchar alNoError[] = "No Error";
36 static const ALchar alErrInvalidName[] = "Invalid Name";
37 static const ALchar alErrInvalidEnum[] = "Invalid Enum";
38 static const ALchar alErrInvalidValue[] = "Invalid Value";
39 static const ALchar alErrInvalidOp[] = "Invalid Operation";
40 static const ALchar alErrOutOfMemory[] = "Out of Memory";
42 ALAPI ALvoid ALAPIENTRY alEnable(ALenum capability)
44 ALCcontext *Context;
46 Context=alcGetCurrentContext();
47 if (Context)
49 SuspendContext(Context);
51 switch (capability)
53 default:
54 alSetError(AL_INVALID_ENUM);
55 break;
58 ProcessContext(Context);
60 else
62 // Invalid Context
63 alSetError(AL_INVALID_OPERATION);
67 ALAPI ALvoid ALAPIENTRY alDisable(ALenum capability)
69 ALCcontext *Context;
71 Context=alcGetCurrentContext();
72 if (Context)
74 SuspendContext(Context);
76 switch (capability)
78 default:
79 alSetError(AL_INVALID_ENUM);
80 break;
83 ProcessContext(Context);
85 else
87 // Invalid Context
88 alSetError(AL_INVALID_OPERATION);
92 ALAPI ALboolean ALAPIENTRY alIsEnabled(ALenum capability)
94 ALCcontext *Context;
95 ALboolean value=AL_FALSE;
97 Context=alcGetCurrentContext();
98 if (Context)
100 SuspendContext(Context);
102 switch (capability)
104 default:
105 alSetError(AL_INVALID_ENUM);
106 break;
109 ProcessContext(Context);
111 else
113 // Invalid Context
114 alSetError(AL_INVALID_OPERATION);
117 return value;
120 ALAPI ALboolean ALAPIENTRY alGetBoolean(ALenum pname)
122 ALCcontext *Context;
123 ALboolean value=AL_FALSE;
125 Context=alcGetCurrentContext();
126 if (Context)
128 SuspendContext(Context);
130 switch (pname)
132 case AL_DOPPLER_FACTOR:
133 if (Context->DopplerFactor != 0.0f)
134 value = AL_TRUE;
135 break;
137 case AL_DOPPLER_VELOCITY:
138 if (Context->DopplerVelocity != 0.0f)
139 value = AL_TRUE;
140 break;
142 case AL_DISTANCE_MODEL:
143 if (Context->DistanceModel == AL_INVERSE_DISTANCE_CLAMPED)
144 value = AL_TRUE;
145 break;
147 case AL_SPEED_OF_SOUND:
148 if (Context->flSpeedOfSound != 0.0f)
149 value = AL_TRUE;
150 break;
152 default:
153 alSetError(AL_INVALID_ENUM);
154 break;
157 ProcessContext(Context);
159 else
161 // Invalid Context
162 alSetError(AL_INVALID_OPERATION);
165 return value;
168 ALAPI ALdouble ALAPIENTRY alGetDouble(ALenum pname)
170 ALCcontext *Context;
171 ALdouble value = 0.0;
173 Context=alcGetCurrentContext();
174 if (Context)
176 SuspendContext(Context);
178 switch (pname)
180 case AL_DOPPLER_FACTOR:
181 value = (double)Context->DopplerFactor;
182 break;
184 case AL_DOPPLER_VELOCITY:
185 value = (double)Context->DopplerVelocity;
186 break;
188 case AL_DISTANCE_MODEL:
189 value = (double)Context->DistanceModel;
190 break;
192 case AL_SPEED_OF_SOUND:
193 value = (double)Context->flSpeedOfSound;
194 break;
196 default:
197 alSetError(AL_INVALID_ENUM);
198 break;
201 ProcessContext(Context);
203 else
205 // Invalid Context
206 alSetError(AL_INVALID_OPERATION);
209 return value;
212 ALAPI ALfloat ALAPIENTRY alGetFloat(ALenum pname)
214 ALCcontext *Context;
215 ALfloat value = 0.0f;
217 Context=alcGetCurrentContext();
218 if (Context)
220 SuspendContext(Context);
222 switch (pname)
224 case AL_DOPPLER_FACTOR:
225 value = Context->DopplerFactor;
226 break;
228 case AL_DOPPLER_VELOCITY:
229 value = Context->DopplerVelocity;
230 break;
232 case AL_DISTANCE_MODEL:
233 value = (float)Context->DistanceModel;
234 break;
236 case AL_SPEED_OF_SOUND:
237 value = Context->flSpeedOfSound;
238 break;
240 default:
241 alSetError(AL_INVALID_ENUM);
242 break;
245 ProcessContext(Context);
247 else
249 // Invalid Context
250 alSetError(AL_INVALID_OPERATION);
253 return value;
256 ALAPI ALint ALAPIENTRY alGetInteger(ALenum pname)
258 ALCcontext *Context;
259 ALint value = 0;
261 Context=alcGetCurrentContext();
262 if (Context)
264 SuspendContext(Context);
266 switch (pname)
268 case AL_DOPPLER_FACTOR:
269 value = (ALint)Context->DopplerFactor;
270 break;
272 case AL_DOPPLER_VELOCITY:
273 value = (ALint)Context->DopplerVelocity;
274 break;
276 case AL_DISTANCE_MODEL:
277 value = (ALint)Context->DistanceModel;
278 break;
280 case AL_SPEED_OF_SOUND:
281 value = (ALint)Context->flSpeedOfSound;
282 break;
284 default:
285 alSetError(AL_INVALID_ENUM);
286 break;
289 ProcessContext(Context);
291 else
293 // Invalid Context
294 alSetError(AL_INVALID_OPERATION);
297 return value;
300 ALAPI ALvoid ALAPIENTRY alGetBooleanv(ALenum pname,ALboolean *data)
302 ALCcontext *Context;
304 Context=alcGetCurrentContext();
305 if (Context)
307 SuspendContext(Context);
309 if (data)
311 switch (pname)
313 case AL_DOPPLER_FACTOR:
314 *data = (ALboolean)((Context->DopplerFactor != 0.0f) ? AL_TRUE : AL_FALSE);
315 break;
317 case AL_DOPPLER_VELOCITY:
318 *data = (ALboolean)((Context->DopplerVelocity != 0.0f) ? AL_TRUE : AL_FALSE);
319 break;
321 case AL_DISTANCE_MODEL:
322 *data = (ALboolean)((Context->DistanceModel == AL_INVERSE_DISTANCE_CLAMPED) ? AL_TRUE : AL_FALSE);
323 break;
325 case AL_SPEED_OF_SOUND:
326 *data = (ALboolean)((Context->flSpeedOfSound != 0.0f) ? AL_TRUE : AL_FALSE);
327 break;
329 default:
330 alSetError(AL_INVALID_ENUM);
331 break;
334 else
336 // data is a NULL pointer
337 alSetError(AL_INVALID_VALUE);
340 ProcessContext(Context);
342 else
344 // Invalid Context
345 alSetError(AL_INVALID_OPERATION);
348 return;
351 ALAPI ALvoid ALAPIENTRY alGetDoublev(ALenum pname,ALdouble *data)
353 ALCcontext *Context;
355 Context=alcGetCurrentContext();
356 if (Context)
358 SuspendContext(Context);
360 if (data)
362 switch (pname)
364 case AL_DOPPLER_FACTOR:
365 *data = (double)Context->DopplerFactor;
366 break;
368 case AL_DOPPLER_VELOCITY:
369 *data = (double)Context->DopplerVelocity;
370 break;
372 case AL_DISTANCE_MODEL:
373 *data = (double)Context->DistanceModel;
374 break;
376 case AL_SPEED_OF_SOUND:
377 *data = (double)Context->flSpeedOfSound;
378 break;
380 default:
381 alSetError(AL_INVALID_ENUM);
382 break;
385 else
387 // data is a NULL pointer
388 alSetError(AL_INVALID_VALUE);
391 ProcessContext(Context);
393 else
395 // Invalid Context
396 alSetError(AL_INVALID_OPERATION);
399 return;
402 ALAPI ALvoid ALAPIENTRY alGetFloatv(ALenum pname,ALfloat *data)
404 ALCcontext *Context;
406 Context=alcGetCurrentContext();
407 if (Context)
409 SuspendContext(Context);
411 if (data)
413 switch (pname)
415 case AL_DOPPLER_FACTOR:
416 *data = Context->DopplerFactor;
417 break;
419 case AL_DOPPLER_VELOCITY:
420 *data = Context->DopplerVelocity;
421 break;
423 case AL_DISTANCE_MODEL:
424 *data = (float)Context->DistanceModel;
425 break;
427 case AL_SPEED_OF_SOUND:
428 *data = Context->flSpeedOfSound;
429 break;
431 default:
432 alSetError(AL_INVALID_ENUM);
433 break;
436 else
438 // data is a NULL pointer
439 alSetError(AL_INVALID_VALUE);
442 ProcessContext(Context);
444 else
446 // Invalid Context
447 alSetError(AL_INVALID_OPERATION);
450 return;
453 ALAPI ALvoid ALAPIENTRY alGetIntegerv(ALenum pname,ALint *data)
455 ALCcontext *Context;
457 Context=alcGetCurrentContext();
458 if (Context)
460 SuspendContext(Context);
462 if (data)
464 switch (pname)
466 case AL_DOPPLER_FACTOR:
467 *data = (ALint)Context->DopplerFactor;
468 break;
470 case AL_DOPPLER_VELOCITY:
471 *data = (ALint)Context->DopplerVelocity;
472 break;
474 case AL_DISTANCE_MODEL:
475 *data = (ALint)Context->DistanceModel;
476 break;
478 case AL_SPEED_OF_SOUND:
479 *data = (ALint)Context->flSpeedOfSound;
480 break;
482 default:
483 alSetError(AL_INVALID_ENUM);
484 break;
487 else
489 // data is a NULL pointer
490 alSetError(AL_INVALID_VALUE);
493 ProcessContext(Context);
495 else
497 // Invalid Context
498 alSetError(AL_INVALID_OPERATION);
501 return;
504 ALAPI const ALchar* ALAPIENTRY alGetString(ALenum pname)
506 const ALchar *value;
507 ALCcontext *pContext;
509 pContext = alcGetCurrentContext();
510 if(!pContext)
512 alSetError(AL_INVALID_OPERATION);
513 return NULL;
516 SuspendContext(pContext);
518 switch(pname)
520 case AL_VENDOR:
521 value=alVendor;
522 break;
524 case AL_VERSION:
525 value=alVersion;
526 break;
528 case AL_RENDERER:
529 value=alRenderer;
530 break;
532 case AL_EXTENSIONS:
533 value=pContext->ExtensionList;//alExtensions;
534 break;
536 case AL_NO_ERROR:
537 value=alNoError;
538 break;
540 case AL_INVALID_NAME:
541 value=alErrInvalidName;
542 break;
544 case AL_INVALID_ENUM:
545 value=alErrInvalidEnum;
546 break;
548 case AL_INVALID_VALUE:
549 value=alErrInvalidValue;
550 break;
552 case AL_INVALID_OPERATION:
553 value=alErrInvalidOp;
554 break;
556 case AL_OUT_OF_MEMORY:
557 value=alErrOutOfMemory;
558 break;
560 default:
561 value=NULL;
562 alSetError(AL_INVALID_ENUM);
563 break;
566 ProcessContext(pContext);
568 return value;
571 ALAPI ALvoid ALAPIENTRY alDopplerFactor(ALfloat value)
573 ALCcontext *Context;
575 Context=alcGetCurrentContext();
576 if (Context)
578 SuspendContext(Context);
580 if (value>=0.0f)
581 Context->DopplerFactor = value;
582 else
583 alSetError(AL_INVALID_VALUE);
585 ProcessContext(Context);
587 else
589 // Invalid Context
590 alSetError(AL_INVALID_OPERATION);
593 return;
596 ALAPI ALvoid ALAPIENTRY alDopplerVelocity(ALfloat value)
598 ALCcontext *Context;
600 Context=alcGetCurrentContext();
601 if (Context)
603 SuspendContext(Context);
605 if (value>0.0f)
606 Context->DopplerVelocity=value;
607 else
608 alSetError(AL_INVALID_VALUE);
610 ProcessContext(Context);
612 else
614 // Invalid Context
615 alSetError(AL_INVALID_OPERATION);
618 return;
621 ALAPI ALvoid ALAPIENTRY alSpeedOfSound(ALfloat flSpeedOfSound)
623 ALCcontext *pContext;
625 pContext = alcGetCurrentContext();
626 if (pContext)
628 SuspendContext(pContext);
630 if (flSpeedOfSound > 0.0f)
631 pContext->flSpeedOfSound = flSpeedOfSound;
632 else
633 alSetError(AL_INVALID_VALUE);
635 ProcessContext(pContext);
637 else
639 alSetError(AL_INVALID_OPERATION);
642 return;
645 ALAPI ALvoid ALAPIENTRY alDistanceModel(ALenum value)
647 ALCcontext *Context;
648 ALsource *Source;
650 Context=alcGetCurrentContext();
651 if (Context)
653 SuspendContext(Context);
655 switch (value)
657 case AL_NONE:
658 case AL_INVERSE_DISTANCE:
659 case AL_INVERSE_DISTANCE_CLAMPED:
660 case AL_LINEAR_DISTANCE:
661 case AL_LINEAR_DISTANCE_CLAMPED:
662 case AL_EXPONENT_DISTANCE:
663 case AL_EXPONENT_DISTANCE_CLAMPED:
664 Context->DistanceModel = value;
665 for(Source = Context->Source;Source != NULL;Source = Source->next)
666 Source->DistanceModel = value;
667 break;
669 default:
670 alSetError(AL_INVALID_VALUE);
671 break;
674 ProcessContext(Context);
676 else
678 // Invalid Context
679 alSetError(AL_INVALID_OPERATION);
682 return;