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
33 #include "alDatabuffer.h"
37 static ALenum
LoadData(ALbuffer
*ALBuf
, const ALvoid
*data
, ALsizei size
, ALuint freq
, ALenum OrigFormat
, ALenum NewFormat
);
38 static void ConvertData(ALvoid
*dst
, enum FmtType dstType
, const ALvoid
*src
, enum SrcFmtType srcType
, ALsizei len
);
39 static void ConvertDataIMA4(ALvoid
*dst
, const ALvoid
*src
, ALint origChans
, ALsizei len
);
41 #define LookupBuffer(m, k) ((ALbuffer*)LookupUIntMapKey(&(m), (k)))
48 static const long g_IMAStep_size
[89]={ // IMA ADPCM Stepsize table
49 7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 19, 21, 23, 25, 28, 31,
50 34, 37, 41, 45, 50, 55, 60, 66, 73, 80, 88, 97, 107, 118, 130, 143,
51 157, 173, 190, 209, 230, 253, 279, 307, 337, 371, 408, 449, 494, 544, 598, 658,
52 724, 796, 876, 963, 1060, 1166, 1282, 1411, 1552, 1707, 1878, 2066, 2272, 2499, 2749, 3024,
53 3327, 3660, 4026, 4428, 4871, 5358, 5894, 6484, 7132, 7845, 8630, 9493,10442,11487,12635,13899,
54 15289,16818,18500,20350,22358,24633,27086,29794,32767
57 static const long g_IMACodeword_4
[16]={ // IMA4 ADPCM Codeword decode table
58 1, 3, 5, 7, 9, 11, 13, 15,
59 -1,-3,-5,-7,-9,-11,-13,-15,
62 static const long g_IMAIndex_adjust_4
[16]={ // IMA4 ADPCM Step index adjust decode table
63 -1,-1,-1,-1, 2, 4, 6, 8,
64 -1,-1,-1,-1, 2, 4, 6, 8
67 static const ALshort muLawDecompressionTable
[256] = {
68 -32124,-31100,-30076,-29052,-28028,-27004,-25980,-24956,
69 -23932,-22908,-21884,-20860,-19836,-18812,-17788,-16764,
70 -15996,-15484,-14972,-14460,-13948,-13436,-12924,-12412,
71 -11900,-11388,-10876,-10364, -9852, -9340, -8828, -8316,
72 -7932, -7676, -7420, -7164, -6908, -6652, -6396, -6140,
73 -5884, -5628, -5372, -5116, -4860, -4604, -4348, -4092,
74 -3900, -3772, -3644, -3516, -3388, -3260, -3132, -3004,
75 -2876, -2748, -2620, -2492, -2364, -2236, -2108, -1980,
76 -1884, -1820, -1756, -1692, -1628, -1564, -1500, -1436,
77 -1372, -1308, -1244, -1180, -1116, -1052, -988, -924,
78 -876, -844, -812, -780, -748, -716, -684, -652,
79 -620, -588, -556, -524, -492, -460, -428, -396,
80 -372, -356, -340, -324, -308, -292, -276, -260,
81 -244, -228, -212, -196, -180, -164, -148, -132,
82 -120, -112, -104, -96, -88, -80, -72, -64,
83 -56, -48, -40, -32, -24, -16, -8, 0,
84 32124, 31100, 30076, 29052, 28028, 27004, 25980, 24956,
85 23932, 22908, 21884, 20860, 19836, 18812, 17788, 16764,
86 15996, 15484, 14972, 14460, 13948, 13436, 12924, 12412,
87 11900, 11388, 10876, 10364, 9852, 9340, 8828, 8316,
88 7932, 7676, 7420, 7164, 6908, 6652, 6396, 6140,
89 5884, 5628, 5372, 5116, 4860, 4604, 4348, 4092,
90 3900, 3772, 3644, 3516, 3388, 3260, 3132, 3004,
91 2876, 2748, 2620, 2492, 2364, 2236, 2108, 1980,
92 1884, 1820, 1756, 1692, 1628, 1564, 1500, 1436,
93 1372, 1308, 1244, 1180, 1116, 1052, 988, 924,
94 876, 844, 812, 780, 748, 716, 684, 652,
95 620, 588, 556, 524, 492, 460, 428, 396,
96 372, 356, 340, 324, 308, 292, 276, 260,
97 244, 228, 212, 196, 180, 164, 148, 132,
98 120, 112, 104, 96, 88, 80, 72, 64,
99 56, 48, 40, 32, 24, 16, 8, 0
103 * alGenBuffers(ALsizei n, ALuint *buffers)
105 * Generates n AL Buffers, and stores the Buffers Names in the array pointed to by buffers
107 AL_API ALvoid AL_APIENTRY
alGenBuffers(ALsizei n
, ALuint
*buffers
)
112 Context
= GetContextSuspended();
115 // Check that we are actually generating some Buffers
116 if(n
< 0 || IsBadWritePtr((void*)buffers
, n
* sizeof(ALuint
)))
117 alSetError(Context
, AL_INVALID_VALUE
);
120 ALCdevice
*device
= Context
->Device
;
123 // Create all the new Buffers
126 ALbuffer
*buffer
= calloc(1, sizeof(ALbuffer
));
129 alSetError(Context
, AL_OUT_OF_MEMORY
);
130 alDeleteBuffers(i
, buffers
);
134 buffer
->buffer
= (ALuint
)ALTHUNK_ADDENTRY(buffer
);
135 err
= InsertUIntMapEntry(&device
->BufferMap
, buffer
->buffer
, buffer
);
136 if(err
!= AL_NO_ERROR
)
138 ALTHUNK_REMOVEENTRY(buffer
->buffer
);
139 memset(buffer
, 0, sizeof(ALbuffer
));
142 alSetError(Context
, err
);
143 alDeleteBuffers(i
, buffers
);
146 buffers
[i
++] = buffer
->buffer
;
150 ProcessContext(Context
);
154 * alDeleteBuffers(ALsizei n, ALuint *buffers)
156 * Deletes the n AL Buffers pointed to by buffers
158 AL_API ALvoid AL_APIENTRY
alDeleteBuffers(ALsizei n
, const ALuint
*buffers
)
166 Context
= GetContextSuspended();
170 device
= Context
->Device
;
171 /* Check we are actually Deleting some Buffers */
173 alSetError(Context
, AL_INVALID_VALUE
);
178 /* Check that all the buffers are valid and can actually be deleted */
184 /* Check for valid Buffer ID */
185 if((ALBuf
=LookupBuffer(device
->BufferMap
, buffers
[i
])) == NULL
)
187 alSetError(Context
, AL_INVALID_NAME
);
191 else if(ALBuf
->refcount
!= 0)
193 /* Buffer still in use, cannot be deleted */
194 alSetError(Context
, AL_INVALID_OPERATION
);
201 /* If all the Buffers were valid (and have Reference Counts of 0), then we can delete them */
206 if((ALBuf
=LookupBuffer(device
->BufferMap
, buffers
[i
])) == NULL
)
209 /* Release the memory used to store audio data */
212 /* Release buffer structure */
213 RemoveUIntMapKey(&device
->BufferMap
, ALBuf
->buffer
);
214 ALTHUNK_REMOVEENTRY(ALBuf
->buffer
);
216 memset(ALBuf
, 0, sizeof(ALbuffer
));
221 ProcessContext(Context
);
225 * alIsBuffer(ALuint buffer)
227 * Checks if buffer is a valid Buffer Name
229 AL_API ALboolean AL_APIENTRY
alIsBuffer(ALuint buffer
)
234 Context
= GetContextSuspended();
235 if(!Context
) return AL_FALSE
;
237 result
= ((!buffer
|| LookupBuffer(Context
->Device
->BufferMap
, buffer
)) ?
240 ProcessContext(Context
);
246 * alBufferData(ALuint buffer,ALenum format,const ALvoid *data,ALsizei size,ALsizei freq)
248 * Fill buffer with audio data
250 AL_API ALvoid AL_APIENTRY
alBufferData(ALuint buffer
,ALenum format
,const ALvoid
*data
,ALsizei size
,ALsizei freq
)
258 Context
= GetContextSuspended();
261 if(Context
->SampleSource
)
265 if(Context
->SampleSource
->state
== MAPPED
)
267 alSetError(Context
, AL_INVALID_OPERATION
);
268 ProcessContext(Context
);
272 offset
= (const ALubyte
*)data
- (ALubyte
*)NULL
;
273 data
= Context
->SampleSource
->data
+ offset
;
276 device
= Context
->Device
;
277 if((ALBuf
=LookupBuffer(device
->BufferMap
, buffer
)) == NULL
)
278 alSetError(Context
, AL_INVALID_NAME
);
279 else if(size
< 0 || freq
< 0)
280 alSetError(Context
, AL_INVALID_VALUE
);
281 else if(ALBuf
->refcount
!= 0)
282 alSetError(Context
, AL_INVALID_VALUE
);
285 case AL_FORMAT_MONO8
:
286 case AL_FORMAT_MONO16
:
287 case AL_FORMAT_MONO_FLOAT32
:
288 case AL_FORMAT_STEREO8
:
289 case AL_FORMAT_STEREO16
:
290 case AL_FORMAT_STEREO_FLOAT32
:
291 case AL_FORMAT_QUAD8_LOKI
:
292 case AL_FORMAT_QUAD16_LOKI
:
293 case AL_FORMAT_QUAD8
:
294 case AL_FORMAT_QUAD16
:
295 case AL_FORMAT_QUAD32
:
296 case AL_FORMAT_REAR8
:
297 case AL_FORMAT_REAR16
:
298 case AL_FORMAT_REAR32
:
299 case AL_FORMAT_51CHN8
:
300 case AL_FORMAT_51CHN16
:
301 case AL_FORMAT_51CHN32
:
302 case AL_FORMAT_61CHN8
:
303 case AL_FORMAT_61CHN16
:
304 case AL_FORMAT_61CHN32
:
305 case AL_FORMAT_71CHN8
:
306 case AL_FORMAT_71CHN16
:
307 case AL_FORMAT_71CHN32
:
308 err
= LoadData(ALBuf
, data
, size
, freq
, format
, format
);
309 if(err
!= AL_NO_ERROR
)
310 alSetError(Context
, err
);
313 case AL_FORMAT_MONO_DOUBLE_EXT
:
314 err
= LoadData(ALBuf
, data
, size
, freq
, format
, AL_FORMAT_MONO_FLOAT32
);
315 if(err
!= AL_NO_ERROR
)
316 alSetError(Context
, err
);
318 case AL_FORMAT_STEREO_DOUBLE_EXT
:
319 err
= LoadData(ALBuf
, data
, size
, freq
, format
, AL_FORMAT_STEREO_FLOAT32
);
320 if(err
!= AL_NO_ERROR
)
321 alSetError(Context
, err
);
324 case AL_FORMAT_MONO_MULAW
:
325 case AL_FORMAT_STEREO_MULAW
:
326 case AL_FORMAT_QUAD_MULAW
:
327 case AL_FORMAT_51CHN_MULAW
:
328 case AL_FORMAT_61CHN_MULAW
:
329 case AL_FORMAT_71CHN_MULAW
: {
330 ALuint Channels
= ((format
==AL_FORMAT_MONO_MULAW
) ? 1 :
331 ((format
==AL_FORMAT_STEREO_MULAW
) ? 2 :
332 ((format
==AL_FORMAT_QUAD_MULAW
) ? 4 :
333 ((format
==AL_FORMAT_51CHN_MULAW
) ? 6 :
334 ((format
==AL_FORMAT_61CHN_MULAW
) ? 7 : 8)))));
335 ALenum NewFormat
= ((Channels
==1) ? AL_FORMAT_MONO16
:
336 ((Channels
==2) ? AL_FORMAT_STEREO16
:
337 ((Channels
==4) ? AL_FORMAT_QUAD16
:
338 ((Channels
==6) ? AL_FORMAT_51CHN16
:
339 ((Channels
==7) ? AL_FORMAT_61CHN16
:
340 AL_FORMAT_71CHN16
)))));
341 err
= LoadData(ALBuf
, data
, size
, freq
, format
, NewFormat
);
342 if(err
!= AL_NO_ERROR
)
343 alSetError(Context
, err
);
346 case AL_FORMAT_REAR_MULAW
:
347 err
= LoadData(ALBuf
, data
, size
, freq
, format
, AL_FORMAT_REAR16
);
348 if(err
!= AL_NO_ERROR
)
349 alSetError(Context
, err
);
352 case AL_FORMAT_MONO_IMA4
:
353 case AL_FORMAT_STEREO_IMA4
: {
354 ALuint Channels
= ((format
==AL_FORMAT_MONO_IMA4
) ? 1 : 2);
355 ALenum NewFormat
= ((Channels
==1) ? AL_FORMAT_MONO16
:
357 ALuint NewBytes
= aluBytesFromFormat(NewFormat
);
360 /* Here is where things vary:
361 * nVidia and Apple use 64+1 sample frames per block => block_size=36*chans bytes
362 * Most PC sound software uses 2040+1 sample frames per block -> block_size=1024*chans bytes
364 if((size
%(36*Channels
)) != 0)
366 alSetError(Context
, AL_INVALID_VALUE
);
374 if(newsize
> INT_MAX
)
376 alSetError(Context
, AL_OUT_OF_MEMORY
);
379 temp
= realloc(ALBuf
->data
, newsize
);
383 ALBuf
->size
= newsize
;
385 ConvertDataIMA4(ALBuf
->data
, data
, Channels
, newsize
/(65*Channels
*NewBytes
));
387 ALBuf
->Frequency
= freq
;
388 DecomposeFormat(NewFormat
, &ALBuf
->FmtChannels
, &ALBuf
->FmtType
);
390 ALBuf
->LoopStart
= 0;
391 ALBuf
->LoopEnd
= newsize
/ Channels
/ NewBytes
;
393 ALBuf
->OriginalChannels
= ((Channels
==1) ? SrcFmtMono
:
395 ALBuf
->OriginalType
= SrcFmtIMA4
;
396 ALBuf
->OriginalSize
= size
;
397 ALBuf
->OriginalAlign
= 36 * Channels
;
400 alSetError(Context
, AL_OUT_OF_MEMORY
);
404 alSetError(Context
, AL_INVALID_ENUM
);
408 ProcessContext(Context
);
412 * alBufferSubDataSOFT(ALuint buffer,ALenum format,const ALvoid *data,ALsizei offset,ALsizei length)
414 * Update buffer's audio data
416 AL_API ALvoid AL_APIENTRY
alBufferSubDataSOFT(ALuint buffer
,ALenum format
,const ALvoid
*data
,ALsizei offset
,ALsizei length
)
422 Context
= GetContextSuspended();
425 if(Context
->SampleSource
)
429 if(Context
->SampleSource
->state
== MAPPED
)
431 alSetError(Context
, AL_INVALID_OPERATION
);
432 ProcessContext(Context
);
436 offset
= (const ALubyte
*)data
- (ALubyte
*)NULL
;
437 data
= Context
->SampleSource
->data
+ offset
;
440 device
= Context
->Device
;
441 if((ALBuf
=LookupBuffer(device
->BufferMap
, buffer
)) == NULL
)
442 alSetError(Context
, AL_INVALID_NAME
);
443 else if(length
< 0 || offset
< 0 || (length
> 0 && data
== NULL
))
444 alSetError(Context
, AL_INVALID_VALUE
);
445 else if(offset
> ALBuf
->OriginalSize
||
446 length
> ALBuf
->OriginalSize
-offset
||
447 (offset
%ALBuf
->OriginalAlign
) != 0 ||
448 (length
%ALBuf
->OriginalAlign
) != 0)
449 alSetError(Context
, AL_INVALID_VALUE
);
452 case AL_FORMAT_MONO8
:
453 case AL_FORMAT_MONO16
:
454 case AL_FORMAT_MONO_FLOAT32
:
455 case AL_FORMAT_MONO_DOUBLE_EXT
:
456 case AL_FORMAT_MONO_MULAW
:
457 case AL_FORMAT_STEREO8
:
458 case AL_FORMAT_STEREO16
:
459 case AL_FORMAT_STEREO_FLOAT32
:
460 case AL_FORMAT_STEREO_DOUBLE_EXT
:
461 case AL_FORMAT_STEREO_MULAW
:
462 case AL_FORMAT_QUAD8_LOKI
:
463 case AL_FORMAT_QUAD16_LOKI
:
464 case AL_FORMAT_QUAD8
:
465 case AL_FORMAT_QUAD16
:
466 case AL_FORMAT_QUAD32
:
467 case AL_FORMAT_QUAD_MULAW
:
468 case AL_FORMAT_REAR8
:
469 case AL_FORMAT_REAR16
:
470 case AL_FORMAT_REAR32
:
471 case AL_FORMAT_REAR_MULAW
:
472 case AL_FORMAT_51CHN8
:
473 case AL_FORMAT_51CHN16
:
474 case AL_FORMAT_51CHN32
:
475 case AL_FORMAT_51CHN_MULAW
:
476 case AL_FORMAT_61CHN8
:
477 case AL_FORMAT_61CHN16
:
478 case AL_FORMAT_61CHN32
:
479 case AL_FORMAT_61CHN_MULAW
:
480 case AL_FORMAT_71CHN8
:
481 case AL_FORMAT_71CHN16
:
482 case AL_FORMAT_71CHN32
:
483 case AL_FORMAT_71CHN_MULAW
: {
484 enum SrcFmtChannels SrcChannels
;
485 enum SrcFmtType SrcType
;
487 DecomposeInputFormat(format
, &SrcChannels
, &SrcType
);
488 if(SrcChannels
!= ALBuf
->OriginalChannels
|| SrcType
!= ALBuf
->OriginalType
)
489 alSetError(Context
, AL_INVALID_ENUM
);
492 ALuint OldBytes
= BytesFromFmt(SrcType
);
493 ALuint Bytes
= BytesFromFmt(ALBuf
->FmtType
);
499 ConvertData(&((ALubyte
*)ALBuf
->data
)[offset
], ALBuf
->FmtType
,
500 data
, SrcType
, length
);
504 case AL_FORMAT_MONO_IMA4
:
505 case AL_FORMAT_STEREO_IMA4
: {
506 enum SrcFmtChannels SrcChannels
;
507 enum SrcFmtType SrcType
;
509 DecomposeInputFormat(format
, &SrcChannels
, &SrcType
);
510 if(SrcChannels
!= ALBuf
->OriginalChannels
|| SrcType
!= SrcFmtIMA4
)
511 alSetError(Context
, AL_INVALID_ENUM
);
514 ALuint Channels
= ChannelsFromFmt(ALBuf
->FmtChannels
);
515 ALuint Bytes
= BytesFromFmt(ALBuf
->FmtType
);
517 /* offset -> byte offset, length -> block count */
521 length
/= ALBuf
->OriginalAlign
;
523 ConvertDataIMA4(&((ALubyte
*)ALBuf
->data
)[offset
], data
, Channels
, length
);
528 alSetError(Context
, AL_INVALID_ENUM
);
532 ProcessContext(Context
);
535 AL_API ALvoid AL_APIENTRY
alBufferSubDataEXT(ALuint buffer
,ALenum format
,const ALvoid
*data
,ALsizei offset
,ALsizei length
)
537 alBufferSubDataSOFT(buffer
, format
, data
, offset
, length
);
541 AL_API
void AL_APIENTRY
alBufferf(ALuint buffer
, ALenum eParam
, ALfloat flValue
)
543 ALCcontext
*pContext
;
548 pContext
= GetContextSuspended();
549 if(!pContext
) return;
551 device
= pContext
->Device
;
552 if(LookupBuffer(device
->BufferMap
, buffer
) == NULL
)
553 alSetError(pContext
, AL_INVALID_NAME
);
559 alSetError(pContext
, AL_INVALID_ENUM
);
564 ProcessContext(pContext
);
568 AL_API
void AL_APIENTRY
alBuffer3f(ALuint buffer
, ALenum eParam
, ALfloat flValue1
, ALfloat flValue2
, ALfloat flValue3
)
570 ALCcontext
*pContext
;
577 pContext
= GetContextSuspended();
578 if(!pContext
) return;
580 device
= pContext
->Device
;
581 if(LookupBuffer(device
->BufferMap
, buffer
) == NULL
)
582 alSetError(pContext
, AL_INVALID_NAME
);
588 alSetError(pContext
, AL_INVALID_ENUM
);
593 ProcessContext(pContext
);
597 AL_API
void AL_APIENTRY
alBufferfv(ALuint buffer
, ALenum eParam
, const ALfloat
* flValues
)
599 ALCcontext
*pContext
;
602 pContext
= GetContextSuspended();
603 if(!pContext
) return;
605 device
= pContext
->Device
;
607 alSetError(pContext
, AL_INVALID_VALUE
);
608 else if(LookupBuffer(device
->BufferMap
, buffer
) == NULL
)
609 alSetError(pContext
, AL_INVALID_NAME
);
615 alSetError(pContext
, AL_INVALID_ENUM
);
620 ProcessContext(pContext
);
624 AL_API
void AL_APIENTRY
alBufferi(ALuint buffer
, ALenum eParam
, ALint lValue
)
626 ALCcontext
*pContext
;
631 pContext
= GetContextSuspended();
632 if(!pContext
) return;
634 device
= pContext
->Device
;
635 if(LookupBuffer(device
->BufferMap
, buffer
) == NULL
)
636 alSetError(pContext
, AL_INVALID_NAME
);
642 alSetError(pContext
, AL_INVALID_ENUM
);
647 ProcessContext(pContext
);
651 AL_API
void AL_APIENTRY
alBuffer3i( ALuint buffer
, ALenum eParam
, ALint lValue1
, ALint lValue2
, ALint lValue3
)
653 ALCcontext
*pContext
;
660 pContext
= GetContextSuspended();
661 if(!pContext
) return;
663 device
= pContext
->Device
;
664 if(LookupBuffer(device
->BufferMap
, buffer
) == NULL
)
665 alSetError(pContext
, AL_INVALID_NAME
);
671 alSetError(pContext
, AL_INVALID_ENUM
);
676 ProcessContext(pContext
);
680 AL_API
void AL_APIENTRY
alBufferiv(ALuint buffer
, ALenum eParam
, const ALint
* plValues
)
682 ALCcontext
*pContext
;
686 pContext
= GetContextSuspended();
687 if(!pContext
) return;
689 device
= pContext
->Device
;
691 alSetError(pContext
, AL_INVALID_VALUE
);
692 else if((ALBuf
=LookupBuffer(device
->BufferMap
, buffer
)) == NULL
)
693 alSetError(pContext
, AL_INVALID_NAME
);
699 if(ALBuf
->refcount
> 0)
700 alSetError(pContext
, AL_INVALID_OPERATION
);
701 else if(plValues
[0] < 0 || plValues
[1] < 0 ||
702 plValues
[0] >= plValues
[1] || ALBuf
->size
== 0)
703 alSetError(pContext
, AL_INVALID_VALUE
);
706 ALint maxlen
= ALBuf
->size
/
707 FrameSizeFromFmt(ALBuf
->FmtChannels
, ALBuf
->FmtType
);
708 if(plValues
[0] > maxlen
|| plValues
[1] > maxlen
)
709 alSetError(pContext
, AL_INVALID_VALUE
);
712 ALBuf
->LoopStart
= plValues
[0];
713 ALBuf
->LoopEnd
= plValues
[1];
719 alSetError(pContext
, AL_INVALID_ENUM
);
724 ProcessContext(pContext
);
728 AL_API ALvoid AL_APIENTRY
alGetBufferf(ALuint buffer
, ALenum eParam
, ALfloat
*pflValue
)
730 ALCcontext
*pContext
;
733 pContext
= GetContextSuspended();
734 if(!pContext
) return;
736 device
= pContext
->Device
;
738 alSetError(pContext
, AL_INVALID_VALUE
);
739 else if(LookupBuffer(device
->BufferMap
, buffer
) == NULL
)
740 alSetError(pContext
, AL_INVALID_NAME
);
746 alSetError(pContext
, AL_INVALID_ENUM
);
751 ProcessContext(pContext
);
755 AL_API
void AL_APIENTRY
alGetBuffer3f(ALuint buffer
, ALenum eParam
, ALfloat
* pflValue1
, ALfloat
* pflValue2
, ALfloat
* pflValue3
)
757 ALCcontext
*pContext
;
760 pContext
= GetContextSuspended();
761 if(!pContext
) return;
763 device
= pContext
->Device
;
764 if(!pflValue1
|| !pflValue2
|| !pflValue3
)
765 alSetError(pContext
, AL_INVALID_VALUE
);
766 else if(LookupBuffer(device
->BufferMap
, buffer
) == NULL
)
767 alSetError(pContext
, AL_INVALID_NAME
);
773 alSetError(pContext
, AL_INVALID_ENUM
);
778 ProcessContext(pContext
);
782 AL_API
void AL_APIENTRY
alGetBufferfv(ALuint buffer
, ALenum eParam
, ALfloat
* pflValues
)
784 ALCcontext
*pContext
;
787 pContext
= GetContextSuspended();
788 if(!pContext
) return;
790 device
= pContext
->Device
;
792 alSetError(pContext
, AL_INVALID_VALUE
);
793 else if(LookupBuffer(device
->BufferMap
, buffer
) == NULL
)
794 alSetError(pContext
, AL_INVALID_NAME
);
800 alSetError(pContext
, AL_INVALID_ENUM
);
805 ProcessContext(pContext
);
809 AL_API ALvoid AL_APIENTRY
alGetBufferi(ALuint buffer
, ALenum eParam
, ALint
*plValue
)
811 ALCcontext
*pContext
;
815 pContext
= GetContextSuspended();
816 if(!pContext
) return;
818 device
= pContext
->Device
;
820 alSetError(pContext
, AL_INVALID_VALUE
);
821 else if((pBuffer
=LookupBuffer(device
->BufferMap
, buffer
)) == NULL
)
822 alSetError(pContext
, AL_INVALID_NAME
);
828 *plValue
= pBuffer
->Frequency
;
832 *plValue
= BytesFromFmt(pBuffer
->FmtType
) * 8;
836 *plValue
= ChannelsFromFmt(pBuffer
->FmtChannels
);
840 *plValue
= pBuffer
->size
;
844 alSetError(pContext
, AL_INVALID_ENUM
);
849 ProcessContext(pContext
);
853 AL_API
void AL_APIENTRY
alGetBuffer3i(ALuint buffer
, ALenum eParam
, ALint
* plValue1
, ALint
* plValue2
, ALint
* plValue3
)
855 ALCcontext
*pContext
;
858 pContext
= GetContextSuspended();
859 if(!pContext
) return;
861 device
= pContext
->Device
;
862 if(!plValue1
|| !plValue2
|| !plValue3
)
863 alSetError(pContext
, AL_INVALID_VALUE
);
864 else if(LookupBuffer(device
->BufferMap
, buffer
) == NULL
)
865 alSetError(pContext
, AL_INVALID_NAME
);
871 alSetError(pContext
, AL_INVALID_ENUM
);
876 ProcessContext(pContext
);
880 AL_API
void AL_APIENTRY
alGetBufferiv(ALuint buffer
, ALenum eParam
, ALint
* plValues
)
882 ALCcontext
*pContext
;
886 pContext
= GetContextSuspended();
887 if(!pContext
) return;
889 device
= pContext
->Device
;
891 alSetError(pContext
, AL_INVALID_VALUE
);
892 else if((ALBuf
=LookupBuffer(device
->BufferMap
, buffer
)) == NULL
)
893 alSetError(pContext
, AL_INVALID_NAME
);
902 alGetBufferi(buffer
, eParam
, plValues
);
906 plValues
[0] = ALBuf
->LoopStart
;
907 plValues
[1] = ALBuf
->LoopEnd
;
911 alSetError(pContext
, AL_INVALID_ENUM
);
916 ProcessContext(pContext
);
920 static void ConvertDataIMA4(ALvoid
*dst
, const ALvoid
*src
, ALint chans
, ALsizei len
)
922 const ALubyte
*IMAData
;
923 ALint Sample
[2],Index
[2];
931 for(i
= 0;i
< len
;i
++)
933 for(c
= 0;c
< chans
;c
++)
935 Sample
[c
] = *(IMAData
++);
936 Sample
[c
] |= *(IMAData
++) << 8;
937 Sample
[c
] = (Sample
[c
]^0x8000) - 32768;
938 Index
[c
] = *(IMAData
++);
939 Index
[c
] |= *(IMAData
++) << 8;
940 Index
[c
] = (Index
[c
]^0x8000) - 32768;
942 Index
[c
] = ((Index
[c
]<0) ? 0 : Index
[c
]);
943 Index
[c
] = ((Index
[c
]>88) ? 88 : Index
[c
]);
945 ((ALshort
*)dst
)[i
*65*chans
+ c
] = Sample
[c
];
948 for(j
= 1;j
< 65;j
+= 8)
950 for(c
= 0;c
< chans
;c
++)
952 IMACode
[c
] = *(IMAData
++);
953 IMACode
[c
] |= *(IMAData
++) << 8;
954 IMACode
[c
] |= *(IMAData
++) << 16;
955 IMACode
[c
] |= *(IMAData
++) << 24;
960 for(c
= 0;c
< chans
;c
++)
962 Sample
[c
] += ((g_IMAStep_size
[Index
[c
]]*g_IMACodeword_4
[IMACode
[c
]&15])/8);
963 Index
[c
] += g_IMAIndex_adjust_4
[IMACode
[c
]&15];
965 if(Sample
[c
] < -32768) Sample
[c
] = -32768;
966 else if(Sample
[c
] > 32767) Sample
[c
] = 32767;
968 if(Index
[c
]<0) Index
[c
] = 0;
969 else if(Index
[c
]>88) Index
[c
] = 88;
971 ((ALshort
*)dst
)[(i
*65+j
+k
)*chans
+ c
] = Sample
[c
];
980 typedef ALubyte ALmulaw
;
982 static __inline ALbyte
Conv_ALbyte_ALbyte(ALbyte val
)
984 static __inline ALbyte
Conv_ALbyte_ALubyte(ALubyte val
)
986 static __inline ALbyte
Conv_ALbyte_ALshort(ALshort val
)
988 static __inline ALbyte
Conv_ALbyte_ALushort(ALushort val
)
989 { return (val
>>8)-128; }
990 static __inline ALbyte
Conv_ALbyte_ALint(ALint val
)
992 static __inline ALbyte
Conv_ALbyte_ALuint(ALuint val
)
993 { return (val
>>24)-128; }
994 static __inline ALbyte
Conv_ALbyte_ALfloat(ALfloat val
)
996 if(val
>= 1.0f
) return 127;
997 if(val
<= -1.0f
) return -128;
998 return (ALint
)(val
* 127.0f
);
1000 static __inline ALbyte
Conv_ALbyte_ALdouble(ALdouble val
)
1002 if(val
>= 1.0) return 127;
1003 if(val
<= -1.0) return -128;
1004 return (ALint
)(val
* 127.0);
1006 static __inline ALbyte
Conv_ALbyte_ALmulaw(ALmulaw val
)
1007 { return muLawDecompressionTable
[val
]>>8; }
1009 static __inline ALubyte
Conv_ALubyte_ALbyte(ALbyte val
)
1010 { return val
^0x80; }
1011 static __inline ALubyte
Conv_ALubyte_ALubyte(ALubyte val
)
1013 static __inline ALubyte
Conv_ALubyte_ALshort(ALshort val
)
1014 { return (val
>>8)+128; }
1015 static __inline ALubyte
Conv_ALubyte_ALushort(ALushort val
)
1017 static __inline ALubyte
Conv_ALubyte_ALint(ALint val
)
1018 { return (val
>>24)+128; }
1019 static __inline ALubyte
Conv_ALubyte_ALuint(ALuint val
)
1021 static __inline ALubyte
Conv_ALubyte_ALfloat(ALfloat val
)
1023 if(val
>= 1.0f
) return 255;
1024 if(val
<= -1.0f
) return 0;
1025 return (ALint
)(val
* 127.0f
) + 128;
1027 static __inline ALubyte
Conv_ALubyte_ALdouble(ALdouble val
)
1029 if(val
>= 1.0) return 255;
1030 if(val
<= -1.0) return 0;
1031 return (ALint
)(val
* 127.0) + 128;
1033 static __inline ALubyte
Conv_ALubyte_ALmulaw(ALmulaw val
)
1034 { return (muLawDecompressionTable
[val
]>>8)+128; }
1036 static __inline ALshort
Conv_ALshort_ALbyte(ALbyte val
)
1038 static __inline ALshort
Conv_ALshort_ALubyte(ALubyte val
)
1039 { return (val
-128)<<8; }
1040 static __inline ALshort
Conv_ALshort_ALshort(ALshort val
)
1042 static __inline ALshort
Conv_ALshort_ALushort(ALushort val
)
1043 { return val
^0x8000; }
1044 static __inline ALshort
Conv_ALshort_ALint(ALint val
)
1046 static __inline ALshort
Conv_ALshort_ALuint(ALuint val
)
1047 { return (val
>>16)-32768; }
1048 static __inline ALshort
Conv_ALshort_ALfloat(ALfloat val
)
1050 if(val
>= 1.0f
) return 32767;
1051 if(val
<= -1.0f
) return -32768;
1052 return (ALint
)(val
* 32767.0f
);
1054 static __inline ALshort
Conv_ALshort_ALdouble(ALdouble val
)
1056 if(val
>= 1.0) return 32767;
1057 if(val
<= -1.0) return -32768;
1058 return (ALint
)(val
* 32767.0);
1060 static __inline ALshort
Conv_ALshort_ALmulaw(ALmulaw val
)
1061 { return muLawDecompressionTable
[val
]; }
1063 static __inline ALushort
Conv_ALushort_ALbyte(ALbyte val
)
1064 { return (val
+128)<<8; }
1065 static __inline ALushort
Conv_ALushort_ALubyte(ALubyte val
)
1067 static __inline ALushort
Conv_ALushort_ALshort(ALshort val
)
1068 { return val
^0x8000; }
1069 static __inline ALushort
Conv_ALushort_ALushort(ALushort val
)
1071 static __inline ALushort
Conv_ALushort_ALint(ALint val
)
1072 { return (val
>>16)+32768; }
1073 static __inline ALushort
Conv_ALushort_ALuint(ALuint val
)
1075 static __inline ALushort
Conv_ALushort_ALfloat(ALfloat val
)
1077 if(val
>= 1.0f
) return 65535;
1078 if(val
<= -1.0f
) return 0;
1079 return (ALint
)(val
* 32767.0f
) + 32768;
1081 static __inline ALushort
Conv_ALushort_ALdouble(ALdouble val
)
1083 if(val
>= 1.0) return 65535;
1084 if(val
<= -1.0) return 0;
1085 return (ALint
)(val
* 32767.0) + 32768;
1087 static __inline ALushort
Conv_ALushort_ALmulaw(ALmulaw val
)
1088 { return muLawDecompressionTable
[val
]^0x8000; }
1090 static __inline ALint
Conv_ALint_ALbyte(ALbyte val
)
1092 static __inline ALint
Conv_ALint_ALubyte(ALubyte val
)
1093 { return (val
-128)<<24; }
1094 static __inline ALint
Conv_ALint_ALshort(ALshort val
)
1096 static __inline ALint
Conv_ALint_ALushort(ALushort val
)
1097 { return (val
-32768)<<16; }
1098 static __inline ALint
Conv_ALint_ALint(ALint val
)
1100 static __inline ALint
Conv_ALint_ALuint(ALuint val
)
1101 { return val
-2147483648u; }
1102 static __inline ALint
Conv_ALint_ALfloat(ALfloat val
)
1104 if(val
>= 1.0f
) return 2147483647;
1105 if(val
<= -1.0f
) return -2147483648u;
1106 return (ALint
)(val
* 2147483647.0);
1108 static __inline ALint
Conv_ALint_ALdouble(ALdouble val
)
1110 if(val
>= 1.0) return 2147483647;
1111 if(val
<= -1.0) return -2147483648u;
1112 return (ALint
)(val
* 2147483647.0);
1114 static __inline ALint
Conv_ALint_ALmulaw(ALmulaw val
)
1115 { return muLawDecompressionTable
[val
]<<16; }
1117 static __inline ALuint
Conv_ALuint_ALbyte(ALbyte val
)
1118 { return (val
+128)<<24; }
1119 static __inline ALuint
Conv_ALuint_ALubyte(ALubyte val
)
1121 static __inline ALuint
Conv_ALuint_ALshort(ALshort val
)
1122 { return (val
+32768)<<16; }
1123 static __inline ALuint
Conv_ALuint_ALushort(ALushort val
)
1125 static __inline ALuint
Conv_ALuint_ALint(ALint val
)
1126 { return val
+2147483648u; }
1127 static __inline ALuint
Conv_ALuint_ALuint(ALuint val
)
1129 static __inline ALuint
Conv_ALuint_ALfloat(ALfloat val
)
1131 if(val
>= 1.0f
) return 4294967295u;
1132 if(val
<= -1.0f
) return 0;
1133 return (ALint
)(val
* 2147483647.0) + 2147483648u;
1135 static __inline ALuint
Conv_ALuint_ALdouble(ALdouble val
)
1137 if(val
>= 1.0) return 4294967295u;
1138 if(val
<= -1.0) return 0;
1139 return (ALint
)(val
* 2147483647.0) + 2147483648u;
1141 static __inline ALuint
Conv_ALuint_ALmulaw(ALmulaw val
)
1142 { return (muLawDecompressionTable
[val
]+32768)<<16; }
1144 static __inline ALfloat
Conv_ALfloat_ALbyte(ALbyte val
)
1145 { return val
* (1.0f
/127.0f
); }
1146 static __inline ALfloat
Conv_ALfloat_ALubyte(ALubyte val
)
1147 { return (val
-128) * (1.0f
/127.0f
); }
1148 static __inline ALfloat
Conv_ALfloat_ALshort(ALshort val
)
1149 { return val
* (1.0f
/32767.0f
); }
1150 static __inline ALfloat
Conv_ALfloat_ALushort(ALushort val
)
1151 { return (val
-32768) * (1.0f
/32767.0f
); }
1152 static __inline ALfloat
Conv_ALfloat_ALint(ALint val
)
1153 { return val
* (1.0/2147483647.0); }
1154 static __inline ALfloat
Conv_ALfloat_ALuint(ALuint val
)
1155 { return (ALint
)(val
-2147483648u) * (1.0/2147483647.0); }
1156 static __inline ALfloat
Conv_ALfloat_ALfloat(ALfloat val
)
1158 static __inline ALfloat
Conv_ALfloat_ALdouble(ALdouble val
)
1160 static __inline ALfloat
Conv_ALfloat_ALmulaw(ALmulaw val
)
1161 { return muLawDecompressionTable
[val
] * (1.0f
/32767.0f
); }
1163 static __inline ALdouble
Conv_ALdouble_ALbyte(ALbyte val
)
1164 { return val
* (1.0/127.0); }
1165 static __inline ALdouble
Conv_ALdouble_ALubyte(ALubyte val
)
1166 { return (val
-128) * (1.0/127.0); }
1167 static __inline ALdouble
Conv_ALdouble_ALshort(ALshort val
)
1168 { return val
* (1.0/32767.0); }
1169 static __inline ALdouble
Conv_ALdouble_ALushort(ALushort val
)
1170 { return (val
-32768) * (1.0/32767.0); }
1171 static __inline ALdouble
Conv_ALdouble_ALint(ALint val
)
1172 { return val
* (1.0/214748364.0); }
1173 static __inline ALdouble
Conv_ALdouble_ALuint(ALuint val
)
1174 { return (ALint
)(val
-2147483648u) * (1.0/2147483647.0); }
1175 static __inline ALdouble
Conv_ALdouble_ALfloat(ALfloat val
)
1177 static __inline ALdouble
Conv_ALdouble_ALdouble(ALdouble val
)
1179 static __inline ALdouble
Conv_ALdouble_ALmulaw(ALmulaw val
)
1180 { return muLawDecompressionTable
[val
] * (1.0/32767.0); }
1183 #define DECL_TEMPLATE(T1, T2) \
1184 static void Convert_##T1##_##T2(T1 *dst, const T2 *src, ALuint len) \
1187 for(i = 0;i < len;i++) \
1188 *(dst++) = Conv_##T1##_##T2(*(src++)); \
1191 DECL_TEMPLATE(ALbyte
, ALbyte
)
1192 DECL_TEMPLATE(ALbyte
, ALubyte
)
1193 DECL_TEMPLATE(ALbyte
, ALshort
)
1194 DECL_TEMPLATE(ALbyte
, ALushort
)
1195 DECL_TEMPLATE(ALbyte
, ALint
)
1196 DECL_TEMPLATE(ALbyte
, ALuint
)
1197 DECL_TEMPLATE(ALbyte
, ALfloat
)
1198 DECL_TEMPLATE(ALbyte
, ALdouble
)
1199 DECL_TEMPLATE(ALbyte
, ALmulaw
)
1201 DECL_TEMPLATE(ALubyte
, ALbyte
)
1202 DECL_TEMPLATE(ALubyte
, ALubyte
)
1203 DECL_TEMPLATE(ALubyte
, ALshort
)
1204 DECL_TEMPLATE(ALubyte
, ALushort
)
1205 DECL_TEMPLATE(ALubyte
, ALint
)
1206 DECL_TEMPLATE(ALubyte
, ALuint
)
1207 DECL_TEMPLATE(ALubyte
, ALfloat
)
1208 DECL_TEMPLATE(ALubyte
, ALdouble
)
1209 DECL_TEMPLATE(ALubyte
, ALmulaw
)
1211 DECL_TEMPLATE(ALshort
, ALbyte
)
1212 DECL_TEMPLATE(ALshort
, ALubyte
)
1213 DECL_TEMPLATE(ALshort
, ALshort
)
1214 DECL_TEMPLATE(ALshort
, ALushort
)
1215 DECL_TEMPLATE(ALshort
, ALint
)
1216 DECL_TEMPLATE(ALshort
, ALuint
)
1217 DECL_TEMPLATE(ALshort
, ALfloat
)
1218 DECL_TEMPLATE(ALshort
, ALdouble
)
1219 DECL_TEMPLATE(ALshort
, ALmulaw
)
1221 DECL_TEMPLATE(ALushort
, ALbyte
)
1222 DECL_TEMPLATE(ALushort
, ALubyte
)
1223 DECL_TEMPLATE(ALushort
, ALshort
)
1224 DECL_TEMPLATE(ALushort
, ALushort
)
1225 DECL_TEMPLATE(ALushort
, ALint
)
1226 DECL_TEMPLATE(ALushort
, ALuint
)
1227 DECL_TEMPLATE(ALushort
, ALfloat
)
1228 DECL_TEMPLATE(ALushort
, ALdouble
)
1229 DECL_TEMPLATE(ALushort
, ALmulaw
)
1231 DECL_TEMPLATE(ALint
, ALbyte
)
1232 DECL_TEMPLATE(ALint
, ALubyte
)
1233 DECL_TEMPLATE(ALint
, ALshort
)
1234 DECL_TEMPLATE(ALint
, ALushort
)
1235 DECL_TEMPLATE(ALint
, ALint
)
1236 DECL_TEMPLATE(ALint
, ALuint
)
1237 DECL_TEMPLATE(ALint
, ALfloat
)
1238 DECL_TEMPLATE(ALint
, ALdouble
)
1239 DECL_TEMPLATE(ALint
, ALmulaw
)
1241 DECL_TEMPLATE(ALuint
, ALbyte
)
1242 DECL_TEMPLATE(ALuint
, ALubyte
)
1243 DECL_TEMPLATE(ALuint
, ALshort
)
1244 DECL_TEMPLATE(ALuint
, ALushort
)
1245 DECL_TEMPLATE(ALuint
, ALint
)
1246 DECL_TEMPLATE(ALuint
, ALuint
)
1247 DECL_TEMPLATE(ALuint
, ALfloat
)
1248 DECL_TEMPLATE(ALuint
, ALdouble
)
1249 DECL_TEMPLATE(ALuint
, ALmulaw
)
1251 DECL_TEMPLATE(ALfloat
, ALbyte
)
1252 DECL_TEMPLATE(ALfloat
, ALubyte
)
1253 DECL_TEMPLATE(ALfloat
, ALshort
)
1254 DECL_TEMPLATE(ALfloat
, ALushort
)
1255 DECL_TEMPLATE(ALfloat
, ALint
)
1256 DECL_TEMPLATE(ALfloat
, ALuint
)
1257 DECL_TEMPLATE(ALfloat
, ALfloat
)
1258 DECL_TEMPLATE(ALfloat
, ALdouble
)
1259 DECL_TEMPLATE(ALfloat
, ALmulaw
)
1261 DECL_TEMPLATE(ALdouble
, ALbyte
)
1262 DECL_TEMPLATE(ALdouble
, ALubyte
)
1263 DECL_TEMPLATE(ALdouble
, ALshort
)
1264 DECL_TEMPLATE(ALdouble
, ALushort
)
1265 DECL_TEMPLATE(ALdouble
, ALint
)
1266 DECL_TEMPLATE(ALdouble
, ALuint
)
1267 DECL_TEMPLATE(ALdouble
, ALfloat
)
1268 DECL_TEMPLATE(ALdouble
, ALdouble
)
1269 DECL_TEMPLATE(ALdouble
, ALmulaw
)
1271 #undef DECL_TEMPLATE
1273 #define DECL_TEMPLATE(T) \
1274 static void Convert_##T(T *dst, const ALvoid *src, enum SrcFmtType srcType, \
1280 Convert_##T##_ALbyte(dst, src, len); \
1283 Convert_##T##_ALubyte(dst, src, len); \
1286 Convert_##T##_ALshort(dst, src, len); \
1288 case SrcFmtUShort: \
1289 Convert_##T##_ALushort(dst, src, len); \
1292 Convert_##T##_ALint(dst, src, len); \
1295 Convert_##T##_ALuint(dst, src, len); \
1298 Convert_##T##_ALfloat(dst, src, len); \
1300 case SrcFmtDouble: \
1301 Convert_##T##_ALdouble(dst, src, len); \
1304 Convert_##T##_ALmulaw(dst, src, len); \
1307 break; /* not handled here */ \
1311 DECL_TEMPLATE(ALbyte
)
1312 DECL_TEMPLATE(ALubyte
)
1313 DECL_TEMPLATE(ALshort
)
1314 DECL_TEMPLATE(ALushort
)
1315 DECL_TEMPLATE(ALint
)
1316 DECL_TEMPLATE(ALuint
)
1317 DECL_TEMPLATE(ALfloat
)
1318 DECL_TEMPLATE(ALdouble
)
1320 #undef DECL_TEMPLATE
1326 * Loads the specified data into the buffer, using the specified formats.
1327 * Currently, the new format must have the same channel configuration as the
1328 * original format. This does NOT handle compressed formats (eg. IMA4).
1330 static ALenum
LoadData(ALbuffer
*ALBuf
, const ALvoid
*data
, ALsizei size
, ALuint freq
, ALenum OrigFormat
, ALenum NewFormat
)
1332 ALuint NewBytes
= aluBytesFromFormat(NewFormat
);
1333 ALuint NewChannels
= aluChannelsFromFormat(NewFormat
);
1334 ALuint OrigBytes
= aluBytesFromFormat(OrigFormat
);
1335 ALuint OrigChannels
= aluChannelsFromFormat(OrigFormat
);
1336 enum SrcFmtChannels SrcChannels
;
1337 enum FmtChannels DstChannels
;
1338 enum SrcFmtType SrcType
;
1339 enum FmtType DstType
;
1343 assert(NewChannels
== OrigChannels
);
1345 DecomposeInputFormat(OrigFormat
, &SrcChannels
, &SrcType
);
1346 DecomposeFormat(NewFormat
, &DstChannels
, &DstType
);
1348 if((size
%(OrigBytes
*OrigChannels
)) != 0)
1349 return AL_INVALID_VALUE
;
1351 newsize
= size
/ OrigBytes
;
1352 newsize
*= NewBytes
;
1353 if(newsize
> INT_MAX
)
1354 return AL_OUT_OF_MEMORY
;
1356 temp
= realloc(ALBuf
->data
, newsize
);
1357 if(!temp
) return AL_OUT_OF_MEMORY
;
1359 ALBuf
->size
= newsize
;
1363 // Samples are converted here
1364 ConvertData(ALBuf
->data
, DstType
, data
, SrcType
, newsize
/NewBytes
);
1367 ALBuf
->Frequency
= freq
;
1368 ALBuf
->FmtType
= DstType
;
1369 ALBuf
->FmtChannels
= DstChannels
;
1371 ALBuf
->LoopStart
= 0;
1372 ALBuf
->LoopEnd
= newsize
/ NewChannels
/ NewBytes
;
1374 ALBuf
->OriginalChannels
= SrcChannels
;
1375 ALBuf
->OriginalType
= SrcType
;
1376 ALBuf
->OriginalSize
= size
;
1377 ALBuf
->OriginalAlign
= OrigBytes
* OrigChannels
;
1382 static void ConvertData(ALvoid
*dst
, enum FmtType dstType
, const ALvoid
*src
, enum SrcFmtType srcType
, ALsizei len
)
1386 (void)Convert_ALbyte
;
1388 Convert_ALubyte(dst
, src
, srcType
, len
);
1391 Convert_ALshort(dst
, src
, srcType
, len
);
1393 (void)Convert_ALushort
;
1394 (void)Convert_ALint
;
1395 (void)Convert_ALuint
;
1397 Convert_ALfloat(dst
, src
, srcType
, len
);
1399 (void)Convert_ALdouble
;
1404 ALuint
BytesFromSrcFmt(enum SrcFmtType type
)
1408 case SrcFmtByte
: return sizeof(ALbyte
);
1409 case SrcFmtUByte
: return sizeof(ALubyte
);
1410 case SrcFmtShort
: return sizeof(ALshort
);
1411 case SrcFmtUShort
: return sizeof(ALushort
);
1412 case SrcFmtInt
: return sizeof(ALint
);
1413 case SrcFmtUInt
: return sizeof(ALuint
);
1414 case SrcFmtFloat
: return sizeof(ALfloat
);
1415 case SrcFmtDouble
: return sizeof(ALdouble
);
1416 case SrcFmtMulaw
: return sizeof(ALubyte
);
1417 case SrcFmtIMA4
: break; /* not handled here */
1421 ALuint
ChannelsFromSrcFmt(enum SrcFmtChannels chans
)
1425 case SrcFmtMono
: return 1;
1426 case SrcFmtStereo
: return 2;
1427 case SrcFmtRear
: return 2;
1428 case SrcFmtQuad
: return 4;
1429 case SrcFmtX51
: return 6;
1430 case SrcFmtX61
: return 7;
1431 case SrcFmtX71
: return 8;
1435 void DecomposeInputFormat(ALenum format
, enum SrcFmtChannels
*chans
,
1436 enum SrcFmtType
*type
)
1440 case AL_FORMAT_MONO8
:
1441 *chans
= SrcFmtMono
;
1442 *type
= SrcFmtUByte
;
1444 case AL_FORMAT_MONO16
:
1445 *chans
= SrcFmtMono
;
1446 *type
= SrcFmtShort
;
1448 case AL_FORMAT_MONO_FLOAT32
:
1449 *chans
= SrcFmtMono
;
1450 *type
= SrcFmtFloat
;
1452 case AL_FORMAT_MONO_DOUBLE_EXT
:
1453 *chans
= SrcFmtMono
;
1454 *type
= SrcFmtDouble
;
1456 case AL_FORMAT_MONO_IMA4
:
1457 *chans
= SrcFmtMono
;
1460 case AL_FORMAT_STEREO8
:
1461 *chans
= SrcFmtStereo
;
1462 *type
= SrcFmtUByte
;
1464 case AL_FORMAT_STEREO16
:
1465 *chans
= SrcFmtStereo
;
1466 *type
= SrcFmtShort
;
1468 case AL_FORMAT_STEREO_FLOAT32
:
1469 *chans
= SrcFmtStereo
;
1470 *type
= SrcFmtFloat
;
1472 case AL_FORMAT_STEREO_DOUBLE_EXT
:
1473 *chans
= SrcFmtStereo
;
1474 *type
= SrcFmtDouble
;
1476 case AL_FORMAT_STEREO_IMA4
:
1477 *chans
= SrcFmtStereo
;
1480 case AL_FORMAT_QUAD8_LOKI
:
1481 case AL_FORMAT_QUAD8
:
1482 *chans
= SrcFmtQuad
;
1483 *type
= SrcFmtUByte
;
1485 case AL_FORMAT_QUAD16_LOKI
:
1486 case AL_FORMAT_QUAD16
:
1487 *chans
= SrcFmtQuad
;
1488 *type
= SrcFmtShort
;
1490 case AL_FORMAT_QUAD32
:
1491 *chans
= SrcFmtQuad
;
1492 *type
= SrcFmtFloat
;
1494 case AL_FORMAT_REAR8
:
1495 *chans
= SrcFmtRear
;
1496 *type
= SrcFmtUByte
;
1498 case AL_FORMAT_REAR16
:
1499 *chans
= SrcFmtRear
;
1500 *type
= SrcFmtShort
;
1502 case AL_FORMAT_REAR32
:
1503 *chans
= SrcFmtRear
;
1504 *type
= SrcFmtFloat
;
1506 case AL_FORMAT_51CHN8
:
1508 *type
= SrcFmtUByte
;
1510 case AL_FORMAT_51CHN16
:
1512 *type
= SrcFmtShort
;
1514 case AL_FORMAT_51CHN32
:
1516 *type
= SrcFmtFloat
;
1518 case AL_FORMAT_61CHN8
:
1520 *type
= SrcFmtUByte
;
1522 case AL_FORMAT_61CHN16
:
1524 *type
= SrcFmtShort
;
1526 case AL_FORMAT_61CHN32
:
1528 *type
= SrcFmtFloat
;
1530 case AL_FORMAT_71CHN8
:
1532 *type
= SrcFmtUByte
;
1534 case AL_FORMAT_71CHN16
:
1536 *type
= SrcFmtShort
;
1538 case AL_FORMAT_71CHN32
:
1540 *type
= SrcFmtFloat
;
1542 case AL_FORMAT_MONO_MULAW
:
1543 *chans
= SrcFmtMono
;
1544 *type
= SrcFmtMulaw
;
1546 case AL_FORMAT_STEREO_MULAW
:
1547 *chans
= SrcFmtStereo
;
1548 *type
= SrcFmtMulaw
;
1550 case AL_FORMAT_QUAD_MULAW
:
1551 *chans
= SrcFmtQuad
;
1552 *type
= SrcFmtMulaw
;
1554 case AL_FORMAT_REAR_MULAW
:
1555 *chans
= SrcFmtRear
;
1556 *type
= SrcFmtMulaw
;
1558 case AL_FORMAT_51CHN_MULAW
:
1560 *type
= SrcFmtMulaw
;
1562 case AL_FORMAT_61CHN_MULAW
:
1564 *type
= SrcFmtMulaw
;
1566 case AL_FORMAT_71CHN_MULAW
:
1568 *type
= SrcFmtMulaw
;
1572 AL_PRINT("Unhandled format specified: 0x%X\n", format
);
1577 ALuint
BytesFromFmt(enum FmtType type
)
1581 case FmtUByte
: return sizeof(ALubyte
);
1582 case FmtShort
: return sizeof(ALshort
);
1583 case FmtFloat
: return sizeof(ALfloat
);
1587 ALuint
ChannelsFromFmt(enum FmtChannels chans
)
1591 case FmtMono
: return 1;
1592 case FmtStereo
: return 2;
1593 case FmtRear
: return 2;
1594 case FmtQuad
: return 4;
1595 case FmtX51
: return 6;
1596 case FmtX61
: return 7;
1597 case FmtX71
: return 8;
1601 void DecomposeFormat(ALenum format
, enum FmtChannels
*chans
, enum FmtType
*type
)
1605 case AL_FORMAT_MONO8
:
1609 case AL_FORMAT_MONO16
:
1613 case AL_FORMAT_MONO_FLOAT32
:
1617 case AL_FORMAT_STEREO8
:
1621 case AL_FORMAT_STEREO16
:
1625 case AL_FORMAT_STEREO_FLOAT32
:
1629 case AL_FORMAT_QUAD8_LOKI
:
1630 case AL_FORMAT_QUAD8
:
1634 case AL_FORMAT_QUAD16_LOKI
:
1635 case AL_FORMAT_QUAD16
:
1639 case AL_FORMAT_QUAD32
:
1643 case AL_FORMAT_REAR8
:
1647 case AL_FORMAT_REAR16
:
1651 case AL_FORMAT_REAR32
:
1655 case AL_FORMAT_51CHN8
:
1659 case AL_FORMAT_51CHN16
:
1663 case AL_FORMAT_51CHN32
:
1667 case AL_FORMAT_61CHN8
:
1671 case AL_FORMAT_61CHN16
:
1675 case AL_FORMAT_61CHN32
:
1679 case AL_FORMAT_71CHN8
:
1683 case AL_FORMAT_71CHN16
:
1687 case AL_FORMAT_71CHN32
:
1693 AL_PRINT("Unhandled format specified: 0x%X\n", format
);
1700 * ReleaseALBuffers()
1702 * INTERNAL FN : Called by alcCloseDevice to destroy any buffers that still exist
1704 ALvoid
ReleaseALBuffers(ALCdevice
*device
)
1707 for(i
= 0;i
< device
->BufferMap
.size
;i
++)
1709 ALbuffer
*temp
= device
->BufferMap
.array
[i
].value
;
1710 device
->BufferMap
.array
[i
].value
= NULL
;
1712 // Release sample data
1715 // Release Buffer structure
1716 ALTHUNK_REMOVEENTRY(temp
->buffer
);
1717 memset(temp
, 0, sizeof(ALbuffer
));