Avoid void-pointer arithmetic
[openal-soft.git] / OpenAL32 / alState.c
blobca6d749a83c31dc9985ca44fc71c6bcaa69d2827
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 <stdlib.h>
22 #include "alMain.h"
23 #include "AL/alc.h"
24 #include "alError.h"
25 #include "alState.h"
27 static const ALchar alVendor[] = "OpenAL Community";
28 static const ALchar alVersion[] = "1.1";
29 static const ALchar alRenderer[] = "OpenAL Sample Implementation";
31 // Error Messages
32 static const ALchar alNoError[] = "No Error";
33 static const ALchar alErrInvalidName[] = "Invalid Name";
34 static const ALchar alErrInvalidEnum[] = "Invalid Enum";
35 static const ALchar alErrInvalidValue[] = "Invalid Value";
36 static const ALchar alErrInvalidOp[] = "Invalid Operation";
37 static const ALchar alErrOutOfMemory[] = "Out of Memory";
39 ALAPI ALvoid ALAPIENTRY alEnable(ALenum capability)
41 ALCcontext *Context;
43 Context=alcGetCurrentContext();
44 if (Context)
46 SuspendContext(Context);
48 switch (capability)
50 default:
51 alSetError(AL_INVALID_ENUM);
52 break;
55 ProcessContext(Context);
57 else
59 // Invalid Context
60 alSetError(AL_INVALID_OPERATION);
64 ALAPI ALvoid ALAPIENTRY alDisable(ALenum capability)
66 ALCcontext *Context;
68 Context=alcGetCurrentContext();
69 if (Context)
71 SuspendContext(Context);
73 switch (capability)
75 default:
76 alSetError(AL_INVALID_ENUM);
77 break;
80 ProcessContext(Context);
82 else
84 // Invalid Context
85 alSetError(AL_INVALID_OPERATION);
89 ALAPI ALboolean ALAPIENTRY alIsEnabled(ALenum capability)
91 ALCcontext *Context;
92 ALboolean value=AL_FALSE;
94 Context=alcGetCurrentContext();
95 if (Context)
97 SuspendContext(Context);
99 switch (capability)
101 default:
102 alSetError(AL_INVALID_ENUM);
103 break;
106 ProcessContext(Context);
108 else
110 // Invalid Context
111 alSetError(AL_INVALID_OPERATION);
114 return value;
117 ALAPI ALboolean ALAPIENTRY alGetBoolean(ALenum pname)
119 ALCcontext *Context;
120 ALboolean value=AL_FALSE;
122 Context=alcGetCurrentContext();
123 if (Context)
125 SuspendContext(Context);
127 switch (pname)
129 case AL_DOPPLER_FACTOR:
130 if (Context->DopplerFactor != 0.0f)
131 value = AL_TRUE;
132 break;
134 case AL_DOPPLER_VELOCITY:
135 if (Context->DopplerVelocity != 0.0f)
136 value = AL_TRUE;
137 break;
139 case AL_DISTANCE_MODEL:
140 if (Context->DistanceModel == AL_INVERSE_DISTANCE_CLAMPED)
141 value = AL_TRUE;
142 break;
144 case AL_SPEED_OF_SOUND:
145 if (Context->flSpeedOfSound != 0.0f)
146 value = AL_TRUE;
147 break;
149 default:
150 alSetError(AL_INVALID_ENUM);
151 break;
154 ProcessContext(Context);
156 else
158 // Invalid Context
159 alSetError(AL_INVALID_OPERATION);
162 return value;
165 ALAPI ALdouble ALAPIENTRY alGetDouble(ALenum pname)
167 ALCcontext *Context;
168 ALdouble value = 0.0;
170 Context=alcGetCurrentContext();
171 if (Context)
173 SuspendContext(Context);
175 switch (pname)
177 case AL_DOPPLER_FACTOR:
178 value = (double)Context->DopplerFactor;
179 break;
181 case AL_DOPPLER_VELOCITY:
182 value = (double)Context->DopplerVelocity;
183 break;
185 case AL_DISTANCE_MODEL:
186 value = (double)Context->DistanceModel;
187 break;
189 case AL_SPEED_OF_SOUND:
190 value = (double)Context->flSpeedOfSound;
191 break;
193 default:
194 alSetError(AL_INVALID_ENUM);
195 break;
198 ProcessContext(Context);
200 else
202 // Invalid Context
203 alSetError(AL_INVALID_OPERATION);
206 return value;
209 ALAPI ALfloat ALAPIENTRY alGetFloat(ALenum pname)
211 ALCcontext *Context;
212 ALfloat value = 0.0f;
214 Context=alcGetCurrentContext();
215 if (Context)
217 SuspendContext(Context);
219 switch (pname)
221 case AL_DOPPLER_FACTOR:
222 value = Context->DopplerFactor;
223 break;
225 case AL_DOPPLER_VELOCITY:
226 value = Context->DopplerVelocity;
227 break;
229 case AL_DISTANCE_MODEL:
230 value = (float)Context->DistanceModel;
231 break;
233 case AL_SPEED_OF_SOUND:
234 value = Context->flSpeedOfSound;
235 break;
237 default:
238 alSetError(AL_INVALID_ENUM);
239 break;
242 ProcessContext(Context);
244 else
246 // Invalid Context
247 alSetError(AL_INVALID_OPERATION);
250 return value;
253 ALAPI ALint ALAPIENTRY alGetInteger(ALenum pname)
255 ALCcontext *Context;
256 ALint value = 0;
258 Context=alcGetCurrentContext();
259 if (Context)
261 SuspendContext(Context);
263 switch (pname)
265 case AL_DOPPLER_FACTOR:
266 value = (ALint)Context->DopplerFactor;
267 break;
269 case AL_DOPPLER_VELOCITY:
270 value = (ALint)Context->DopplerVelocity;
271 break;
273 case AL_DISTANCE_MODEL:
274 value = (ALint)Context->DistanceModel;
275 break;
277 case AL_SPEED_OF_SOUND:
278 value = (ALint)Context->flSpeedOfSound;
279 break;
281 default:
282 alSetError(AL_INVALID_ENUM);
283 break;
286 ProcessContext(Context);
288 else
290 // Invalid Context
291 alSetError(AL_INVALID_OPERATION);
294 return value;
297 ALAPI ALvoid ALAPIENTRY alGetBooleanv(ALenum pname,ALboolean *data)
299 ALCcontext *Context;
301 Context=alcGetCurrentContext();
302 if (Context)
304 SuspendContext(Context);
306 if (data)
308 switch (pname)
310 case AL_DOPPLER_FACTOR:
311 *data = (ALboolean)((Context->DopplerFactor != 0.0f) ? AL_TRUE : AL_FALSE);
312 break;
314 case AL_DOPPLER_VELOCITY:
315 *data = (ALboolean)((Context->DopplerVelocity != 0.0f) ? AL_TRUE : AL_FALSE);
316 break;
318 case AL_DISTANCE_MODEL:
319 *data = (ALboolean)((Context->DistanceModel == AL_INVERSE_DISTANCE_CLAMPED) ? AL_TRUE : AL_FALSE);
320 break;
322 case AL_SPEED_OF_SOUND:
323 *data = (ALboolean)((Context->flSpeedOfSound != 0.0f) ? AL_TRUE : AL_FALSE);
324 break;
326 default:
327 alSetError(AL_INVALID_ENUM);
328 break;
331 else
333 // data is a NULL pointer
334 alSetError(AL_INVALID_VALUE);
337 ProcessContext(Context);
339 else
341 // Invalid Context
342 alSetError(AL_INVALID_OPERATION);
345 return;
348 ALAPI ALvoid ALAPIENTRY alGetDoublev(ALenum pname,ALdouble *data)
350 ALCcontext *Context;
352 Context=alcGetCurrentContext();
353 if (Context)
355 SuspendContext(Context);
357 if (data)
359 switch (pname)
361 case AL_DOPPLER_FACTOR:
362 *data = (double)Context->DopplerFactor;
363 break;
365 case AL_DOPPLER_VELOCITY:
366 *data = (double)Context->DopplerVelocity;
367 break;
369 case AL_DISTANCE_MODEL:
370 *data = (double)Context->DistanceModel;
371 break;
373 case AL_SPEED_OF_SOUND:
374 *data = (double)Context->flSpeedOfSound;
375 break;
377 default:
378 alSetError(AL_INVALID_ENUM);
379 break;
382 else
384 // data is a NULL pointer
385 alSetError(AL_INVALID_VALUE);
388 ProcessContext(Context);
390 else
392 // Invalid Context
393 alSetError(AL_INVALID_OPERATION);
396 return;
399 ALAPI ALvoid ALAPIENTRY alGetFloatv(ALenum pname,ALfloat *data)
401 ALCcontext *Context;
403 Context=alcGetCurrentContext();
404 if (Context)
406 SuspendContext(Context);
408 if (data)
410 switch (pname)
412 case AL_DOPPLER_FACTOR:
413 *data = Context->DopplerFactor;
414 break;
416 case AL_DOPPLER_VELOCITY:
417 *data = Context->DopplerVelocity;
418 break;
420 case AL_DISTANCE_MODEL:
421 *data = (float)Context->DistanceModel;
422 break;
424 case AL_SPEED_OF_SOUND:
425 *data = Context->flSpeedOfSound;
426 break;
428 default:
429 alSetError(AL_INVALID_ENUM);
430 break;
433 else
435 // data is a NULL pointer
436 alSetError(AL_INVALID_VALUE);
439 ProcessContext(Context);
441 else
443 // Invalid Context
444 alSetError(AL_INVALID_OPERATION);
447 return;
450 ALAPI ALvoid ALAPIENTRY alGetIntegerv(ALenum pname,ALint *data)
452 ALCcontext *Context;
454 Context=alcGetCurrentContext();
455 if (Context)
457 SuspendContext(Context);
459 if (data)
461 switch (pname)
463 case AL_DOPPLER_FACTOR:
464 *data = (ALint)Context->DopplerFactor;
465 break;
467 case AL_DOPPLER_VELOCITY:
468 *data = (ALint)Context->DopplerVelocity;
469 break;
471 case AL_DISTANCE_MODEL:
472 *data = (ALint)Context->DistanceModel;
473 break;
475 case AL_SPEED_OF_SOUND:
476 *data = (ALint)Context->flSpeedOfSound;
477 break;
479 default:
480 alSetError(AL_INVALID_ENUM);
481 break;
484 else
486 // data is a NULL pointer
487 alSetError(AL_INVALID_VALUE);
490 ProcessContext(Context);
492 else
494 // Invalid Context
495 alSetError(AL_INVALID_OPERATION);
498 return;
501 ALAPI const ALchar* ALAPIENTRY alGetString(ALenum pname)
503 const ALchar *value;
504 ALCcontext *pContext;
506 pContext = alcGetCurrentContext();
507 if(!pContext)
509 alSetError(AL_INVALID_OPERATION);
510 return NULL;
513 SuspendContext(pContext);
515 switch(pname)
517 case AL_VENDOR:
518 value=alVendor;
519 break;
521 case AL_VERSION:
522 value=alVersion;
523 break;
525 case AL_RENDERER:
526 value=alRenderer;
527 break;
529 case AL_EXTENSIONS:
530 value=pContext->ExtensionList;//alExtensions;
531 break;
533 case AL_NO_ERROR:
534 value=alNoError;
535 break;
537 case AL_INVALID_NAME:
538 value=alErrInvalidName;
539 break;
541 case AL_INVALID_ENUM:
542 value=alErrInvalidEnum;
543 break;
545 case AL_INVALID_VALUE:
546 value=alErrInvalidValue;
547 break;
549 case AL_INVALID_OPERATION:
550 value=alErrInvalidOp;
551 break;
553 case AL_OUT_OF_MEMORY:
554 value=alErrOutOfMemory;
555 break;
557 default:
558 value=NULL;
559 alSetError(AL_INVALID_ENUM);
560 break;
563 ProcessContext(pContext);
565 return value;
568 ALAPI ALvoid ALAPIENTRY alDopplerFactor(ALfloat value)
570 ALCcontext *Context;
572 Context=alcGetCurrentContext();
573 if (Context)
575 SuspendContext(Context);
577 if (value>=0.0f)
578 Context->DopplerFactor = value;
579 else
580 alSetError(AL_INVALID_VALUE);
582 ProcessContext(Context);
584 else
586 // Invalid Context
587 alSetError(AL_INVALID_OPERATION);
590 return;
593 ALAPI ALvoid ALAPIENTRY alDopplerVelocity(ALfloat value)
595 ALCcontext *Context;
597 Context=alcGetCurrentContext();
598 if (Context)
600 SuspendContext(Context);
602 if (value>0.0f)
603 Context->DopplerVelocity=value;
604 else
605 alSetError(AL_INVALID_VALUE);
607 ProcessContext(Context);
609 else
611 // Invalid Context
612 alSetError(AL_INVALID_OPERATION);
615 return;
618 ALAPI ALvoid ALAPIENTRY alSpeedOfSound(ALfloat flSpeedOfSound)
620 ALCcontext *pContext;
622 pContext = alcGetCurrentContext();
623 if (pContext)
625 SuspendContext(pContext);
627 if (flSpeedOfSound > 0.0f)
628 pContext->flSpeedOfSound = flSpeedOfSound;
629 else
630 alSetError(AL_INVALID_VALUE);
632 ProcessContext(pContext);
634 else
636 alSetError(AL_INVALID_OPERATION);
639 return;
642 ALAPI ALvoid ALAPIENTRY alDistanceModel(ALenum value)
644 ALCcontext *Context;
646 Context=alcGetCurrentContext();
647 if (Context)
649 SuspendContext(Context);
651 switch (value)
653 case AL_NONE:
654 case AL_INVERSE_DISTANCE:
655 case AL_INVERSE_DISTANCE_CLAMPED:
656 case AL_LINEAR_DISTANCE:
657 case AL_LINEAR_DISTANCE_CLAMPED:
658 case AL_EXPONENT_DISTANCE:
659 case AL_EXPONENT_DISTANCE_CLAMPED:
660 Context->DistanceModel = value;
661 break;
663 default:
664 alSetError(AL_INVALID_VALUE);
665 break;
668 ProcessContext(Context);
670 else
672 // Invalid Context
673 alSetError(AL_INVALID_OPERATION);
676 return;