2007-11-14 02:02:18 +00:00
|
|
|
/**
|
|
|
|
* OpenAL cross platform audio library
|
|
|
|
* Copyright (C) 1999-2007 by authors.
|
|
|
|
* This library is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU Library General Public
|
|
|
|
* License as published by the Free Software Foundation; either
|
|
|
|
* version 2 of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This library is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
* Library General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU Library General Public
|
|
|
|
* License along with this library; if not, write to the
|
|
|
|
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
|
|
* Boston, MA 02111-1307, USA.
|
|
|
|
* Or go to http://www.gnu.org/copyleft/lgpl.html
|
|
|
|
*/
|
|
|
|
|
2008-01-16 22:09:04 +00:00
|
|
|
#include "config.h"
|
|
|
|
|
2007-11-14 02:02:18 +00:00
|
|
|
#include <stdlib.h>
|
|
|
|
#include <stdio.h>
|
2008-01-06 09:15:44 +00:00
|
|
|
#include <assert.h>
|
2010-05-25 00:08:12 +00:00
|
|
|
#include <limits.h>
|
|
|
|
|
2007-11-14 02:02:18 +00:00
|
|
|
#include "alMain.h"
|
|
|
|
#include "AL/al.h"
|
|
|
|
#include "AL/alc.h"
|
|
|
|
#include "alError.h"
|
|
|
|
#include "alBuffer.h"
|
2007-12-31 09:09:57 +00:00
|
|
|
#include "alThunk.h"
|
2007-11-14 02:02:18 +00:00
|
|
|
|
|
|
|
|
2011-03-16 19:24:53 +00:00
|
|
|
static ALenum LoadData(ALbuffer *ALBuf, ALuint freq, ALenum NewFormat, ALsizei frames, enum UserFmtChannels chans, enum UserFmtType type, const ALvoid *data, ALboolean storesrc);
|
2011-03-16 20:32:57 +00:00
|
|
|
static void ConvertData(ALvoid *dst, enum UserFmtType dstType, const ALvoid *src, enum UserFmtType srcType, ALsizei numchans, ALsizei len);
|
2011-07-02 09:54:05 +00:00
|
|
|
static ALboolean IsValidType(ALenum type);
|
|
|
|
static ALboolean IsValidChannels(ALenum channels);
|
2011-09-19 02:06:19 +00:00
|
|
|
static ALboolean DecomposeUserFormat(ALenum format, enum UserFmtChannels *chans, enum UserFmtType *type);
|
|
|
|
static ALboolean DecomposeFormat(ALenum format, enum FmtChannels *chans, enum FmtType *type);
|
2007-12-29 04:25:18 +00:00
|
|
|
|
2010-11-27 23:33:33 +00:00
|
|
|
|
2007-11-14 02:02:18 +00:00
|
|
|
/*
|
2010-11-30 21:04:48 +00:00
|
|
|
* Global Variables
|
|
|
|
*/
|
2007-11-14 02:02:18 +00:00
|
|
|
|
2010-11-30 21:04:48 +00:00
|
|
|
/* IMA ADPCM Stepsize table */
|
2010-12-01 22:19:57 +00:00
|
|
|
static const long IMAStep_size[89] = {
|
2010-11-30 21:04:48 +00:00
|
|
|
7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 19,
|
|
|
|
21, 23, 25, 28, 31, 34, 37, 41, 45, 50, 55,
|
|
|
|
60, 66, 73, 80, 88, 97, 107, 118, 130, 143, 157,
|
|
|
|
173, 190, 209, 230, 253, 279, 307, 337, 371, 408, 449,
|
|
|
|
494, 544, 598, 658, 724, 796, 876, 963, 1060, 1166, 1282,
|
|
|
|
1411, 1552, 1707, 1878, 2066, 2272, 2499, 2749, 3024, 3327, 3660,
|
|
|
|
4026, 4428, 4871, 5358, 5894, 6484, 7132, 7845, 8630, 9493,10442,
|
|
|
|
11487,12635,13899,15289,16818,18500,20350,22358,24633,27086,29794,
|
|
|
|
32767
|
2007-11-14 02:02:18 +00:00
|
|
|
};
|
|
|
|
|
2010-11-30 21:04:48 +00:00
|
|
|
/* IMA4 ADPCM Codeword decode table */
|
2010-12-01 22:19:57 +00:00
|
|
|
static const long IMA4Codeword[16] = {
|
2007-11-14 02:02:18 +00:00
|
|
|
1, 3, 5, 7, 9, 11, 13, 15,
|
|
|
|
-1,-3,-5,-7,-9,-11,-13,-15,
|
|
|
|
};
|
|
|
|
|
2010-11-30 21:04:48 +00:00
|
|
|
/* IMA4 ADPCM Step index adjust decode table */
|
2010-12-01 22:19:57 +00:00
|
|
|
static const long IMA4Index_adjust[16] = {
|
2007-11-14 02:02:18 +00:00
|
|
|
-1,-1,-1,-1, 2, 4, 6, 8,
|
|
|
|
-1,-1,-1,-1, 2, 4, 6, 8
|
|
|
|
};
|
|
|
|
|
2010-12-02 04:34:29 +00:00
|
|
|
/* A quick'n'dirty lookup table to decode a muLaw-encoded byte sample into a
|
|
|
|
* signed 16-bit sample */
|
2010-03-14 05:03:34 +00:00
|
|
|
static const ALshort muLawDecompressionTable[256] = {
|
|
|
|
-32124,-31100,-30076,-29052,-28028,-27004,-25980,-24956,
|
|
|
|
-23932,-22908,-21884,-20860,-19836,-18812,-17788,-16764,
|
|
|
|
-15996,-15484,-14972,-14460,-13948,-13436,-12924,-12412,
|
|
|
|
-11900,-11388,-10876,-10364, -9852, -9340, -8828, -8316,
|
|
|
|
-7932, -7676, -7420, -7164, -6908, -6652, -6396, -6140,
|
|
|
|
-5884, -5628, -5372, -5116, -4860, -4604, -4348, -4092,
|
|
|
|
-3900, -3772, -3644, -3516, -3388, -3260, -3132, -3004,
|
|
|
|
-2876, -2748, -2620, -2492, -2364, -2236, -2108, -1980,
|
|
|
|
-1884, -1820, -1756, -1692, -1628, -1564, -1500, -1436,
|
|
|
|
-1372, -1308, -1244, -1180, -1116, -1052, -988, -924,
|
|
|
|
-876, -844, -812, -780, -748, -716, -684, -652,
|
|
|
|
-620, -588, -556, -524, -492, -460, -428, -396,
|
|
|
|
-372, -356, -340, -324, -308, -292, -276, -260,
|
|
|
|
-244, -228, -212, -196, -180, -164, -148, -132,
|
|
|
|
-120, -112, -104, -96, -88, -80, -72, -64,
|
|
|
|
-56, -48, -40, -32, -24, -16, -8, 0,
|
|
|
|
32124, 31100, 30076, 29052, 28028, 27004, 25980, 24956,
|
|
|
|
23932, 22908, 21884, 20860, 19836, 18812, 17788, 16764,
|
|
|
|
15996, 15484, 14972, 14460, 13948, 13436, 12924, 12412,
|
|
|
|
11900, 11388, 10876, 10364, 9852, 9340, 8828, 8316,
|
|
|
|
7932, 7676, 7420, 7164, 6908, 6652, 6396, 6140,
|
|
|
|
5884, 5628, 5372, 5116, 4860, 4604, 4348, 4092,
|
|
|
|
3900, 3772, 3644, 3516, 3388, 3260, 3132, 3004,
|
|
|
|
2876, 2748, 2620, 2492, 2364, 2236, 2108, 1980,
|
|
|
|
1884, 1820, 1756, 1692, 1628, 1564, 1500, 1436,
|
|
|
|
1372, 1308, 1244, 1180, 1116, 1052, 988, 924,
|
|
|
|
876, 844, 812, 780, 748, 716, 684, 652,
|
|
|
|
620, 588, 556, 524, 492, 460, 428, 396,
|
|
|
|
372, 356, 340, 324, 308, 292, 276, 260,
|
|
|
|
244, 228, 212, 196, 180, 164, 148, 132,
|
|
|
|
120, 112, 104, 96, 88, 80, 72, 64,
|
|
|
|
56, 48, 40, 32, 24, 16, 8, 0
|
|
|
|
};
|
|
|
|
|
2010-12-02 04:34:29 +00:00
|
|
|
/* Values used when encoding a muLaw sample */
|
2010-11-30 09:20:40 +00:00
|
|
|
static const int muLawBias = 0x84;
|
|
|
|
static const int muLawClip = 32635;
|
2011-10-01 11:55:03 +00:00
|
|
|
static const char muLawCompressTable[256] = {
|
2010-11-30 09:20:40 +00:00
|
|
|
0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3,
|
|
|
|
4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
|
|
|
|
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
|
|
|
|
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
|
|
|
|
6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
|
|
|
|
6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
|
|
|
|
6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
|
|
|
|
6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
|
|
|
|
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
|
|
|
|
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
|
|
|
|
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
|
|
|
|
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
|
|
|
|
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
|
|
|
|
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
|
|
|
|
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
|
|
|
|
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7
|
|
|
|
};
|
|
|
|
|
2011-09-11 09:37:52 +00:00
|
|
|
|
2011-10-01 11:55:03 +00:00
|
|
|
/* A quick'n'dirty lookup table to decode an aLaw-encoded byte sample into a
|
|
|
|
* signed 16-bit sample */
|
|
|
|
static const ALshort aLawDecompressionTable[256] = {
|
|
|
|
-5504, -5248, -6016, -5760, -4480, -4224, -4992, -4736,
|
|
|
|
-7552, -7296, -8064, -7808, -6528, -6272, -7040, -6784,
|
|
|
|
-2752, -2624, -3008, -2880, -2240, -2112, -2496, -2368,
|
|
|
|
-3776, -3648, -4032, -3904, -3264, -3136, -3520, -3392,
|
|
|
|
-22016,-20992,-24064,-23040,-17920,-16896,-19968,-18944,
|
|
|
|
-30208,-29184,-32256,-31232,-26112,-25088,-28160,-27136,
|
|
|
|
-11008,-10496,-12032,-11520, -8960, -8448, -9984, -9472,
|
|
|
|
-15104,-14592,-16128,-15616,-13056,-12544,-14080,-13568,
|
|
|
|
-344, -328, -376, -360, -280, -264, -312, -296,
|
|
|
|
-472, -456, -504, -488, -408, -392, -440, -424,
|
|
|
|
-88, -72, -120, -104, -24, -8, -56, -40,
|
|
|
|
-216, -200, -248, -232, -152, -136, -184, -168,
|
|
|
|
-1376, -1312, -1504, -1440, -1120, -1056, -1248, -1184,
|
|
|
|
-1888, -1824, -2016, -1952, -1632, -1568, -1760, -1696,
|
|
|
|
-688, -656, -752, -720, -560, -528, -624, -592,
|
|
|
|
-944, -912, -1008, -976, -816, -784, -880, -848,
|
|
|
|
5504, 5248, 6016, 5760, 4480, 4224, 4992, 4736,
|
|
|
|
7552, 7296, 8064, 7808, 6528, 6272, 7040, 6784,
|
|
|
|
2752, 2624, 3008, 2880, 2240, 2112, 2496, 2368,
|
|
|
|
3776, 3648, 4032, 3904, 3264, 3136, 3520, 3392,
|
|
|
|
22016, 20992, 24064, 23040, 17920, 16896, 19968, 18944,
|
|
|
|
30208, 29184, 32256, 31232, 26112, 25088, 28160, 27136,
|
|
|
|
11008, 10496, 12032, 11520, 8960, 8448, 9984, 9472,
|
|
|
|
15104, 14592, 16128, 15616, 13056, 12544, 14080, 13568,
|
|
|
|
344, 328, 376, 360, 280, 264, 312, 296,
|
|
|
|
472, 456, 504, 488, 408, 392, 440, 424,
|
|
|
|
88, 72, 120, 104, 24, 8, 56, 40,
|
|
|
|
216, 200, 248, 232, 152, 136, 184, 168,
|
|
|
|
1376, 1312, 1504, 1440, 1120, 1056, 1248, 1184,
|
|
|
|
1888, 1824, 2016, 1952, 1632, 1568, 1760, 1696,
|
|
|
|
688, 656, 752, 720, 560, 528, 624, 592,
|
|
|
|
944, 912, 1008, 976, 816, 784, 880, 848
|
|
|
|
};
|
|
|
|
|
|
|
|
/* Values used when encoding an aLaw sample */
|
|
|
|
static const int aLawClip = 32635;
|
|
|
|
static const char aLawCompressTable[128] = {
|
|
|
|
1,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,
|
|
|
|
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
|
|
|
|
6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
|
|
|
|
6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
|
|
|
|
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
|
|
|
|
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
|
|
|
|
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
|
|
|
|
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2007-11-14 02:02:18 +00:00
|
|
|
/*
|
2010-11-25 20:07:12 +00:00
|
|
|
* alGenBuffers(ALsizei n, ALuint *buffers)
|
|
|
|
*
|
2010-12-02 04:34:29 +00:00
|
|
|
* Generates n AL Buffers, and stores the Buffers Names in the array pointed
|
|
|
|
* to by buffers
|
2010-11-25 20:07:12 +00:00
|
|
|
*/
|
2010-05-02 02:59:41 +00:00
|
|
|
AL_API ALvoid AL_APIENTRY alGenBuffers(ALsizei n, ALuint *buffers)
|
2007-11-14 02:02:18 +00:00
|
|
|
{
|
|
|
|
ALCcontext *Context;
|
|
|
|
ALsizei i=0;
|
|
|
|
|
2011-08-31 08:13:02 +00:00
|
|
|
Context = GetContextRef();
|
2009-08-16 23:02:13 +00:00
|
|
|
if(!Context) return;
|
2007-11-14 02:02:18 +00:00
|
|
|
|
2010-12-02 04:34:29 +00:00
|
|
|
/* Check that we are actually generating some Buffers */
|
2010-09-21 22:12:08 +00:00
|
|
|
if(n < 0 || IsBadWritePtr((void*)buffers, n * sizeof(ALuint)))
|
2010-09-07 23:33:17 +00:00
|
|
|
alSetError(Context, AL_INVALID_VALUE);
|
|
|
|
else
|
2007-11-14 02:02:18 +00:00
|
|
|
{
|
2009-08-15 16:14:08 +00:00
|
|
|
ALCdevice *device = Context->Device;
|
2010-05-02 02:59:41 +00:00
|
|
|
ALenum err;
|
2009-08-15 16:14:08 +00:00
|
|
|
|
2010-09-21 22:12:08 +00:00
|
|
|
// Create all the new Buffers
|
|
|
|
while(i < n)
|
2007-11-14 02:02:18 +00:00
|
|
|
{
|
2010-09-21 22:12:08 +00:00
|
|
|
ALbuffer *buffer = calloc(1, sizeof(ALbuffer));
|
|
|
|
if(!buffer)
|
2007-11-14 02:02:18 +00:00
|
|
|
{
|
2010-09-21 22:12:08 +00:00
|
|
|
alSetError(Context, AL_OUT_OF_MEMORY);
|
|
|
|
alDeleteBuffers(i, buffers);
|
|
|
|
break;
|
|
|
|
}
|
2011-09-11 10:57:40 +00:00
|
|
|
RWLockInit(&buffer->lock);
|
2010-09-21 22:12:08 +00:00
|
|
|
|
2011-08-22 14:40:14 +00:00
|
|
|
err = NewThunkEntry(&buffer->buffer);
|
2011-06-18 06:59:25 +00:00
|
|
|
if(err == AL_NO_ERROR)
|
|
|
|
err = InsertUIntMapEntry(&device->BufferMap, buffer->buffer, buffer);
|
2010-09-21 22:12:08 +00:00
|
|
|
if(err != AL_NO_ERROR)
|
|
|
|
{
|
2011-08-22 14:40:14 +00:00
|
|
|
FreeThunkEntry(buffer->buffer);
|
2010-09-21 22:12:08 +00:00
|
|
|
memset(buffer, 0, sizeof(ALbuffer));
|
|
|
|
free(buffer);
|
|
|
|
|
|
|
|
alSetError(Context, err);
|
|
|
|
alDeleteBuffers(i, buffers);
|
|
|
|
break;
|
2008-01-16 00:30:43 +00:00
|
|
|
}
|
2011-09-11 04:21:07 +00:00
|
|
|
|
2010-09-21 22:12:08 +00:00
|
|
|
buffers[i++] = buffer->buffer;
|
2007-11-14 02:02:18 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-08-31 08:13:02 +00:00
|
|
|
ALCcontext_DecRef(Context);
|
2007-11-14 02:02:18 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
2010-11-25 20:07:12 +00:00
|
|
|
* alDeleteBuffers(ALsizei n, ALuint *buffers)
|
|
|
|
*
|
|
|
|
* Deletes the n AL Buffers pointed to by buffers
|
|
|
|
*/
|
2010-09-21 23:54:33 +00:00
|
|
|
AL_API ALvoid AL_APIENTRY alDeleteBuffers(ALsizei n, const ALuint *buffers)
|
2007-11-14 02:02:18 +00:00
|
|
|
{
|
|
|
|
ALCcontext *Context;
|
2010-09-21 23:54:33 +00:00
|
|
|
ALCdevice *device;
|
2007-11-14 02:02:18 +00:00
|
|
|
ALbuffer *ALBuf;
|
|
|
|
ALsizei i;
|
|
|
|
|
2011-08-31 08:13:02 +00:00
|
|
|
Context = GetContextRef();
|
2009-08-16 23:02:13 +00:00
|
|
|
if(!Context) return;
|
2007-11-14 02:02:18 +00:00
|
|
|
|
2010-09-21 23:54:33 +00:00
|
|
|
device = Context->Device;
|
|
|
|
/* Check we are actually Deleting some Buffers */
|
2010-05-25 02:52:27 +00:00
|
|
|
if(n < 0)
|
|
|
|
alSetError(Context, AL_INVALID_VALUE);
|
|
|
|
else
|
2007-11-14 02:02:18 +00:00
|
|
|
{
|
2010-09-21 23:54:33 +00:00
|
|
|
/* Check that all the buffers are valid and can actually be deleted */
|
2010-09-07 23:33:17 +00:00
|
|
|
for(i = 0;i < n;i++)
|
2007-11-14 02:02:18 +00:00
|
|
|
{
|
2010-09-21 23:54:33 +00:00
|
|
|
if(!buffers[i])
|
2010-03-17 03:23:46 +00:00
|
|
|
continue;
|
|
|
|
|
2010-11-25 20:07:12 +00:00
|
|
|
/* Check for valid Buffer ID */
|
2011-09-25 01:34:45 +00:00
|
|
|
if((ALBuf=LookupBuffer(device, buffers[i])) == NULL)
|
2008-07-11 16:12:11 +00:00
|
|
|
{
|
2010-03-17 00:35:51 +00:00
|
|
|
alSetError(Context, AL_INVALID_NAME);
|
2011-08-31 08:13:02 +00:00
|
|
|
n = 0;
|
2010-09-21 23:54:33 +00:00
|
|
|
break;
|
|
|
|
}
|
2011-08-30 06:05:47 +00:00
|
|
|
else if(ALBuf->ref != 0)
|
2010-09-21 23:54:33 +00:00
|
|
|
{
|
|
|
|
/* Buffer still in use, cannot be deleted */
|
|
|
|
alSetError(Context, AL_INVALID_OPERATION);
|
2011-08-31 08:13:02 +00:00
|
|
|
n = 0;
|
2010-03-17 03:23:46 +00:00
|
|
|
break;
|
2008-07-11 16:12:11 +00:00
|
|
|
}
|
|
|
|
}
|
2007-11-14 02:02:18 +00:00
|
|
|
|
2010-09-21 23:54:33 +00:00
|
|
|
for(i = 0;i < n;i++)
|
2008-07-11 16:12:11 +00:00
|
|
|
{
|
2011-09-25 01:34:45 +00:00
|
|
|
if((ALBuf=RemoveBuffer(device, buffers[i])) == NULL)
|
2010-09-21 23:54:33 +00:00
|
|
|
continue;
|
2011-08-31 08:13:02 +00:00
|
|
|
FreeThunkEntry(ALBuf->buffer);
|
2010-09-21 23:54:33 +00:00
|
|
|
|
|
|
|
/* Release the memory used to store audio data */
|
|
|
|
free(ALBuf->data);
|
|
|
|
|
|
|
|
/* Release buffer structure */
|
|
|
|
memset(ALBuf, 0, sizeof(ALbuffer));
|
|
|
|
free(ALBuf);
|
2007-11-14 02:02:18 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-08-31 08:13:02 +00:00
|
|
|
ALCcontext_DecRef(Context);
|
2007-11-14 02:02:18 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
2010-11-25 20:07:12 +00:00
|
|
|
* alIsBuffer(ALuint buffer)
|
|
|
|
*
|
|
|
|
* Checks if buffer is a valid Buffer Name
|
|
|
|
*/
|
2010-05-19 18:06:13 +00:00
|
|
|
AL_API ALboolean AL_APIENTRY alIsBuffer(ALuint buffer)
|
2007-11-14 02:02:18 +00:00
|
|
|
{
|
|
|
|
ALCcontext *Context;
|
2010-05-19 18:06:13 +00:00
|
|
|
ALboolean result;
|
2007-11-14 02:02:18 +00:00
|
|
|
|
2011-08-31 06:28:38 +00:00
|
|
|
Context = GetContextRef();
|
2009-08-16 23:02:13 +00:00
|
|
|
if(!Context) return AL_FALSE;
|
2007-11-14 02:02:18 +00:00
|
|
|
|
2011-09-25 01:34:45 +00:00
|
|
|
result = ((!buffer || LookupBuffer(Context->Device, buffer)) ?
|
2010-05-19 18:06:13 +00:00
|
|
|
AL_TRUE : AL_FALSE);
|
2007-11-14 02:02:18 +00:00
|
|
|
|
2011-08-30 07:04:02 +00:00
|
|
|
ALCcontext_DecRef(Context);
|
2007-11-14 02:02:18 +00:00
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
2010-12-02 04:34:29 +00:00
|
|
|
* alBufferData(ALuint buffer, ALenum format, const ALvoid *data,
|
|
|
|
* ALsizei size, ALsizei freq)
|
2010-11-25 20:07:12 +00:00
|
|
|
*
|
|
|
|
* Fill buffer with audio data
|
|
|
|
*/
|
2010-03-19 21:34:18 +00:00
|
|
|
AL_API ALvoid AL_APIENTRY alBufferData(ALuint buffer,ALenum format,const ALvoid *data,ALsizei size,ALsizei freq)
|
2007-11-14 02:02:18 +00:00
|
|
|
{
|
2010-12-04 06:33:41 +00:00
|
|
|
enum UserFmtChannels SrcChannels;
|
|
|
|
enum UserFmtType SrcType;
|
2007-11-14 02:02:18 +00:00
|
|
|
ALCcontext *Context;
|
2010-03-17 03:23:46 +00:00
|
|
|
ALCdevice *device;
|
2012-01-27 00:49:11 +00:00
|
|
|
ALuint FrameSize;
|
|
|
|
ALenum NewFormat;
|
2007-11-14 02:02:18 +00:00
|
|
|
ALbuffer *ALBuf;
|
2010-03-17 00:35:51 +00:00
|
|
|
ALenum err;
|
2007-11-14 02:02:18 +00:00
|
|
|
|
2011-09-11 09:37:52 +00:00
|
|
|
Context = GetContextRef();
|
2009-08-16 23:02:13 +00:00
|
|
|
if(!Context) return;
|
2007-11-14 02:02:18 +00:00
|
|
|
|
2010-03-17 03:23:46 +00:00
|
|
|
device = Context->Device;
|
2011-09-25 01:34:45 +00:00
|
|
|
if((ALBuf=LookupBuffer(device, buffer)) == NULL)
|
2010-11-25 20:07:12 +00:00
|
|
|
alSetError(Context, AL_INVALID_NAME);
|
2010-11-30 05:55:47 +00:00
|
|
|
else if(size < 0 || freq < 0)
|
|
|
|
alSetError(Context, AL_INVALID_VALUE);
|
2010-12-04 06:33:41 +00:00
|
|
|
else if(DecomposeUserFormat(format, &SrcChannels, &SrcType) == AL_FALSE)
|
2010-11-30 05:55:47 +00:00
|
|
|
alSetError(Context, AL_INVALID_ENUM);
|
|
|
|
else switch(SrcType)
|
2007-11-14 02:02:18 +00:00
|
|
|
{
|
2010-12-04 06:33:41 +00:00
|
|
|
case UserFmtByte:
|
|
|
|
case UserFmtUByte:
|
|
|
|
case UserFmtShort:
|
|
|
|
case UserFmtUShort:
|
|
|
|
case UserFmtInt:
|
|
|
|
case UserFmtUInt:
|
2012-01-27 00:49:11 +00:00
|
|
|
case UserFmtFloat:
|
|
|
|
FrameSize = FrameSizeFromUserFmt(SrcChannels, SrcType);
|
2011-03-16 17:00:24 +00:00
|
|
|
if((size%FrameSize) != 0)
|
|
|
|
err = AL_INVALID_VALUE;
|
|
|
|
else
|
|
|
|
err = LoadData(ALBuf, freq, format, size/FrameSize,
|
2011-03-16 19:24:53 +00:00
|
|
|
SrcChannels, SrcType, data, AL_TRUE);
|
2010-09-23 06:38:06 +00:00
|
|
|
if(err != AL_NO_ERROR)
|
|
|
|
alSetError(Context, err);
|
2012-01-27 00:49:11 +00:00
|
|
|
break;
|
2010-11-25 03:41:25 +00:00
|
|
|
|
2011-04-27 01:17:50 +00:00
|
|
|
case UserFmtByte3:
|
|
|
|
case UserFmtUByte3:
|
2012-01-27 00:49:11 +00:00
|
|
|
case UserFmtDouble:
|
|
|
|
FrameSize = FrameSizeFromUserFmt(SrcChannels, SrcType);
|
|
|
|
NewFormat = AL_FORMAT_MONO_FLOAT32;
|
2010-11-30 08:32:13 +00:00
|
|
|
switch(SrcChannels)
|
|
|
|
{
|
2010-12-04 06:33:41 +00:00
|
|
|
case UserFmtMono: NewFormat = AL_FORMAT_MONO_FLOAT32; break;
|
|
|
|
case UserFmtStereo: NewFormat = AL_FORMAT_STEREO_FLOAT32; break;
|
|
|
|
case UserFmtRear: NewFormat = AL_FORMAT_REAR32; break;
|
|
|
|
case UserFmtQuad: NewFormat = AL_FORMAT_QUAD32; break;
|
|
|
|
case UserFmtX51: NewFormat = AL_FORMAT_51CHN32; break;
|
|
|
|
case UserFmtX61: NewFormat = AL_FORMAT_61CHN32; break;
|
|
|
|
case UserFmtX71: NewFormat = AL_FORMAT_71CHN32; break;
|
2010-11-30 08:32:13 +00:00
|
|
|
}
|
2011-03-16 17:00:24 +00:00
|
|
|
if((size%FrameSize) != 0)
|
|
|
|
err = AL_INVALID_VALUE;
|
|
|
|
else
|
|
|
|
err = LoadData(ALBuf, freq, NewFormat, size/FrameSize,
|
2011-03-16 19:24:53 +00:00
|
|
|
SrcChannels, SrcType, data, AL_TRUE);
|
2010-11-29 07:07:57 +00:00
|
|
|
if(err != AL_NO_ERROR)
|
|
|
|
alSetError(Context, err);
|
2012-01-27 00:49:11 +00:00
|
|
|
break;
|
2010-11-29 07:07:57 +00:00
|
|
|
|
2010-12-04 06:33:41 +00:00
|
|
|
case UserFmtMulaw:
|
2011-10-01 11:55:03 +00:00
|
|
|
case UserFmtAlaw:
|
2012-01-27 00:49:11 +00:00
|
|
|
FrameSize = FrameSizeFromUserFmt(SrcChannels, SrcType);
|
|
|
|
NewFormat = AL_FORMAT_MONO16;
|
|
|
|
switch(SrcChannels)
|
|
|
|
{
|
|
|
|
case UserFmtMono: NewFormat = AL_FORMAT_MONO16; break;
|
|
|
|
case UserFmtStereo: NewFormat = AL_FORMAT_STEREO16; break;
|
|
|
|
case UserFmtRear: NewFormat = AL_FORMAT_REAR16; break;
|
|
|
|
case UserFmtQuad: NewFormat = AL_FORMAT_QUAD16; break;
|
|
|
|
case UserFmtX51: NewFormat = AL_FORMAT_51CHN16; break;
|
|
|
|
case UserFmtX61: NewFormat = AL_FORMAT_61CHN16; break;
|
|
|
|
case UserFmtX71: NewFormat = AL_FORMAT_71CHN16; break;
|
|
|
|
}
|
|
|
|
if((size%FrameSize) != 0)
|
|
|
|
err = AL_INVALID_VALUE;
|
|
|
|
else
|
|
|
|
err = LoadData(ALBuf, freq, NewFormat, size/FrameSize,
|
|
|
|
SrcChannels, SrcType, data, AL_TRUE);
|
|
|
|
if(err != AL_NO_ERROR)
|
|
|
|
alSetError(Context, err);
|
|
|
|
break;
|
|
|
|
|
2012-04-17 06:09:36 +00:00
|
|
|
case UserFmtIMA4:
|
2011-03-16 17:00:24 +00:00
|
|
|
/* Here is where things vary:
|
|
|
|
* nVidia and Apple use 64+1 sample frames per block -> block_size=36 bytes per channel
|
|
|
|
* Most PC sound software uses 2040+1 sample frames per block -> block_size=1024 bytes per channel
|
|
|
|
*/
|
2012-04-17 06:09:36 +00:00
|
|
|
FrameSize = ChannelsFromUserFmt(SrcChannels) * 36;
|
|
|
|
NewFormat = AL_FORMAT_MONO16;
|
2010-11-30 07:46:49 +00:00
|
|
|
switch(SrcChannels)
|
2010-11-30 05:55:47 +00:00
|
|
|
{
|
2010-12-04 06:33:41 +00:00
|
|
|
case UserFmtMono: NewFormat = AL_FORMAT_MONO16; break;
|
|
|
|
case UserFmtStereo: NewFormat = AL_FORMAT_STEREO16; break;
|
|
|
|
case UserFmtRear: NewFormat = AL_FORMAT_REAR16; break;
|
|
|
|
case UserFmtQuad: NewFormat = AL_FORMAT_QUAD16; break;
|
|
|
|
case UserFmtX51: NewFormat = AL_FORMAT_51CHN16; break;
|
|
|
|
case UserFmtX61: NewFormat = AL_FORMAT_61CHN16; break;
|
|
|
|
case UserFmtX71: NewFormat = AL_FORMAT_71CHN16; break;
|
2010-11-30 05:55:47 +00:00
|
|
|
}
|
2011-03-16 17:00:24 +00:00
|
|
|
if((size%FrameSize) != 0)
|
|
|
|
err = AL_INVALID_VALUE;
|
|
|
|
else
|
2012-01-27 00:49:11 +00:00
|
|
|
err = LoadData(ALBuf, freq, NewFormat, size/FrameSize*65,
|
2011-03-16 19:24:53 +00:00
|
|
|
SrcChannels, SrcType, data, AL_TRUE);
|
2010-11-28 06:55:20 +00:00
|
|
|
if(err != AL_NO_ERROR)
|
|
|
|
alSetError(Context, err);
|
2012-04-17 06:09:36 +00:00
|
|
|
break;
|
2007-11-14 02:02:18 +00:00
|
|
|
}
|
|
|
|
|
2011-09-11 09:37:52 +00:00
|
|
|
ALCcontext_DecRef(Context);
|
2007-11-14 02:02:18 +00:00
|
|
|
}
|
|
|
|
|
2008-11-11 13:57:32 +00:00
|
|
|
/*
|
2010-12-02 04:34:29 +00:00
|
|
|
* alBufferSubDataSOFT(ALuint buffer, ALenum format, const ALvoid *data,
|
|
|
|
* ALsizei offset, ALsizei length)
|
2010-11-25 20:07:12 +00:00
|
|
|
*
|
|
|
|
* Update buffer's audio data
|
|
|
|
*/
|
2010-09-21 16:43:35 +00:00
|
|
|
AL_API ALvoid AL_APIENTRY alBufferSubDataSOFT(ALuint buffer,ALenum format,const ALvoid *data,ALsizei offset,ALsizei length)
|
2008-11-11 13:57:32 +00:00
|
|
|
{
|
2010-12-04 06:33:41 +00:00
|
|
|
enum UserFmtChannels SrcChannels;
|
|
|
|
enum UserFmtType SrcType;
|
2008-11-11 13:57:32 +00:00
|
|
|
ALCcontext *Context;
|
2010-03-17 03:23:46 +00:00
|
|
|
ALCdevice *device;
|
|
|
|
ALbuffer *ALBuf;
|
2008-11-11 13:57:32 +00:00
|
|
|
|
2011-09-11 09:37:52 +00:00
|
|
|
Context = GetContextRef();
|
2009-08-16 23:02:13 +00:00
|
|
|
if(!Context) return;
|
2008-11-11 13:57:32 +00:00
|
|
|
|
2010-09-23 00:19:35 +00:00
|
|
|
device = Context->Device;
|
2011-09-25 01:34:45 +00:00
|
|
|
if((ALBuf=LookupBuffer(device, buffer)) == NULL)
|
2010-09-23 00:19:35 +00:00
|
|
|
alSetError(Context, AL_INVALID_NAME);
|
|
|
|
else if(length < 0 || offset < 0 || (length > 0 && data == NULL))
|
|
|
|
alSetError(Context, AL_INVALID_VALUE);
|
2011-09-11 09:37:52 +00:00
|
|
|
else if(DecomposeUserFormat(format, &SrcChannels, &SrcType) == AL_FALSE)
|
2010-11-30 06:01:54 +00:00
|
|
|
alSetError(Context, AL_INVALID_ENUM);
|
|
|
|
else
|
2010-09-23 00:19:35 +00:00
|
|
|
{
|
2011-10-02 02:52:07 +00:00
|
|
|
ALuint original_align;
|
|
|
|
|
2011-09-11 10:57:40 +00:00
|
|
|
WriteLock(&ALBuf->lock);
|
2011-10-02 02:52:07 +00:00
|
|
|
|
|
|
|
original_align = ((ALBuf->OriginalType == UserFmtIMA4) ?
|
|
|
|
(ChannelsFromUserFmt(ALBuf->OriginalChannels)*36) :
|
|
|
|
FrameSizeFromUserFmt(ALBuf->OriginalChannels,
|
|
|
|
ALBuf->OriginalType));
|
|
|
|
|
2011-09-11 09:37:52 +00:00
|
|
|
if(SrcChannels != ALBuf->OriginalChannels || SrcType != ALBuf->OriginalType)
|
|
|
|
alSetError(Context, AL_INVALID_ENUM);
|
|
|
|
else if(offset > ALBuf->OriginalSize ||
|
|
|
|
length > ALBuf->OriginalSize-offset ||
|
2011-10-02 02:52:07 +00:00
|
|
|
(offset%original_align) != 0 ||
|
|
|
|
(length%original_align) != 0)
|
2011-09-11 09:37:52 +00:00
|
|
|
alSetError(Context, AL_INVALID_VALUE);
|
2010-11-30 06:01:54 +00:00
|
|
|
else
|
|
|
|
{
|
2011-09-11 09:37:52 +00:00
|
|
|
ALuint Channels = ChannelsFromFmt(ALBuf->FmtChannels);
|
|
|
|
ALuint Bytes = BytesFromFmt(ALBuf->FmtType);
|
|
|
|
if(SrcType == UserFmtIMA4)
|
|
|
|
{
|
2012-01-27 00:49:11 +00:00
|
|
|
/* offset -> byte offset, length -> sample count */
|
2011-09-11 09:37:52 +00:00
|
|
|
offset /= 36;
|
|
|
|
offset *= 65;
|
|
|
|
offset *= Bytes;
|
2011-10-02 02:52:07 +00:00
|
|
|
length /= original_align;
|
2012-01-27 00:49:11 +00:00
|
|
|
length *= 65;
|
2011-09-11 09:37:52 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
ALuint OldBytes = BytesFromUserFmt(SrcType);
|
2010-09-23 00:19:35 +00:00
|
|
|
|
2011-09-11 09:37:52 +00:00
|
|
|
offset /= OldBytes;
|
|
|
|
offset *= Bytes;
|
|
|
|
length /= OldBytes * Channels;
|
|
|
|
}
|
|
|
|
ConvertData(&((ALubyte*)ALBuf->data)[offset], ALBuf->FmtType,
|
|
|
|
data, SrcType, Channels, length);
|
2010-11-30 06:01:54 +00:00
|
|
|
}
|
2011-09-11 10:57:40 +00:00
|
|
|
WriteUnlock(&ALBuf->lock);
|
2008-11-11 13:57:32 +00:00
|
|
|
}
|
|
|
|
|
2011-09-11 09:37:52 +00:00
|
|
|
ALCcontext_DecRef(Context);
|
2008-11-11 13:57:32 +00:00
|
|
|
}
|
|
|
|
|
2007-11-14 02:02:18 +00:00
|
|
|
|
2011-03-16 18:29:22 +00:00
|
|
|
AL_API void AL_APIENTRY alBufferSamplesSOFT(ALuint buffer,
|
2011-10-02 14:31:26 +00:00
|
|
|
ALuint samplerate, ALenum internalformat, ALsizei samples,
|
2011-03-16 18:29:22 +00:00
|
|
|
ALenum channels, ALenum type, const ALvoid *data)
|
|
|
|
{
|
|
|
|
ALCcontext *Context;
|
|
|
|
ALCdevice *device;
|
|
|
|
ALbuffer *ALBuf;
|
|
|
|
ALenum err;
|
|
|
|
|
2011-09-11 09:37:52 +00:00
|
|
|
Context = GetContextRef();
|
2011-03-16 18:29:22 +00:00
|
|
|
if(!Context) return;
|
|
|
|
|
|
|
|
device = Context->Device;
|
2011-09-25 01:34:45 +00:00
|
|
|
if((ALBuf=LookupBuffer(device, buffer)) == NULL)
|
2011-03-16 18:29:22 +00:00
|
|
|
alSetError(Context, AL_INVALID_NAME);
|
2011-10-02 14:31:26 +00:00
|
|
|
else if(samples < 0 || samplerate == 0)
|
2011-03-16 18:29:22 +00:00
|
|
|
alSetError(Context, AL_INVALID_VALUE);
|
|
|
|
else if(IsValidType(type) == AL_FALSE || IsValidChannels(channels) == AL_FALSE)
|
|
|
|
alSetError(Context, AL_INVALID_ENUM);
|
|
|
|
else
|
|
|
|
{
|
2012-01-27 00:49:11 +00:00
|
|
|
err = LoadData(ALBuf, samplerate, internalformat, samples,
|
|
|
|
channels, type, data, AL_FALSE);
|
2011-03-16 18:29:22 +00:00
|
|
|
if(err != AL_NO_ERROR)
|
|
|
|
alSetError(Context, err);
|
|
|
|
}
|
|
|
|
|
2011-09-11 09:37:52 +00:00
|
|
|
ALCcontext_DecRef(Context);
|
2011-03-16 18:29:22 +00:00
|
|
|
}
|
|
|
|
|
2011-03-16 19:13:17 +00:00
|
|
|
AL_API void AL_APIENTRY alBufferSubSamplesSOFT(ALuint buffer,
|
2011-10-02 14:31:26 +00:00
|
|
|
ALsizei offset, ALsizei samples,
|
2011-03-16 19:13:17 +00:00
|
|
|
ALenum channels, ALenum type, const ALvoid *data)
|
|
|
|
{
|
|
|
|
ALCcontext *Context;
|
|
|
|
ALCdevice *device;
|
|
|
|
ALbuffer *ALBuf;
|
|
|
|
|
2011-09-11 09:37:52 +00:00
|
|
|
Context = GetContextRef();
|
2011-03-16 19:13:17 +00:00
|
|
|
if(!Context) return;
|
|
|
|
|
|
|
|
device = Context->Device;
|
2011-09-25 01:34:45 +00:00
|
|
|
if((ALBuf=LookupBuffer(device, buffer)) == NULL)
|
2011-03-16 19:13:17 +00:00
|
|
|
alSetError(Context, AL_INVALID_NAME);
|
2011-10-02 14:31:26 +00:00
|
|
|
else if(samples < 0 || offset < 0 || (samples > 0 && data == NULL))
|
2011-03-16 19:13:17 +00:00
|
|
|
alSetError(Context, AL_INVALID_VALUE);
|
2011-09-11 09:37:52 +00:00
|
|
|
else if(IsValidType(type) == AL_FALSE)
|
2011-03-16 19:13:17 +00:00
|
|
|
alSetError(Context, AL_INVALID_ENUM);
|
|
|
|
else
|
|
|
|
{
|
2011-09-11 09:37:52 +00:00
|
|
|
ALuint FrameSize;
|
|
|
|
|
2011-09-11 10:57:40 +00:00
|
|
|
WriteLock(&ALBuf->lock);
|
2011-09-11 09:37:52 +00:00
|
|
|
FrameSize = FrameSizeFromFmt(ALBuf->FmtChannels, ALBuf->FmtType);
|
|
|
|
if(channels != (ALenum)ALBuf->FmtChannels)
|
|
|
|
alSetError(Context, AL_INVALID_ENUM);
|
2011-10-03 17:07:50 +00:00
|
|
|
else if(offset > ALBuf->SampleLen || samples > ALBuf->SampleLen-offset)
|
2011-03-16 19:13:17 +00:00
|
|
|
alSetError(Context, AL_INVALID_VALUE);
|
|
|
|
else
|
|
|
|
{
|
|
|
|
/* offset -> byte offset */
|
|
|
|
offset *= FrameSize;
|
2011-03-16 20:32:57 +00:00
|
|
|
ConvertData(&((ALubyte*)ALBuf->data)[offset], ALBuf->FmtType,
|
|
|
|
data, type,
|
2011-10-02 14:31:26 +00:00
|
|
|
ChannelsFromFmt(ALBuf->FmtChannels), samples);
|
2011-03-16 19:13:17 +00:00
|
|
|
}
|
2011-09-11 10:57:40 +00:00
|
|
|
WriteUnlock(&ALBuf->lock);
|
2011-03-16 19:13:17 +00:00
|
|
|
}
|
|
|
|
|
2011-09-11 09:37:52 +00:00
|
|
|
ALCcontext_DecRef(Context);
|
2011-03-16 19:13:17 +00:00
|
|
|
}
|
|
|
|
|
2011-03-16 19:56:39 +00:00
|
|
|
AL_API void AL_APIENTRY alGetBufferSamplesSOFT(ALuint buffer,
|
2011-10-02 14:31:26 +00:00
|
|
|
ALsizei offset, ALsizei samples,
|
2011-03-16 19:56:39 +00:00
|
|
|
ALenum channels, ALenum type, ALvoid *data)
|
|
|
|
{
|
|
|
|
ALCcontext *Context;
|
|
|
|
ALCdevice *device;
|
|
|
|
ALbuffer *ALBuf;
|
|
|
|
|
2011-09-11 09:37:52 +00:00
|
|
|
Context = GetContextRef();
|
2011-03-16 19:56:39 +00:00
|
|
|
if(!Context) return;
|
|
|
|
|
|
|
|
device = Context->Device;
|
2011-09-25 01:34:45 +00:00
|
|
|
if((ALBuf=LookupBuffer(device, buffer)) == NULL)
|
2011-03-16 19:56:39 +00:00
|
|
|
alSetError(Context, AL_INVALID_NAME);
|
2011-10-02 14:31:26 +00:00
|
|
|
else if(samples < 0 || offset < 0 || (samples > 0 && data == NULL))
|
2011-03-16 19:56:39 +00:00
|
|
|
alSetError(Context, AL_INVALID_VALUE);
|
2011-09-11 09:37:52 +00:00
|
|
|
else if(IsValidType(type) == AL_FALSE)
|
2011-03-16 19:56:39 +00:00
|
|
|
alSetError(Context, AL_INVALID_ENUM);
|
|
|
|
else
|
|
|
|
{
|
2011-09-11 09:37:52 +00:00
|
|
|
ALuint FrameSize;
|
|
|
|
|
2011-09-11 10:57:40 +00:00
|
|
|
ReadLock(&ALBuf->lock);
|
2011-09-11 09:37:52 +00:00
|
|
|
FrameSize = FrameSizeFromFmt(ALBuf->FmtChannels, ALBuf->FmtType);
|
|
|
|
if(channels != (ALenum)ALBuf->FmtChannels)
|
|
|
|
alSetError(Context, AL_INVALID_ENUM);
|
2011-10-03 17:07:50 +00:00
|
|
|
else if(offset > ALBuf->SampleLen || samples > ALBuf->SampleLen-offset)
|
2011-03-16 19:56:39 +00:00
|
|
|
alSetError(Context, AL_INVALID_VALUE);
|
2011-10-02 14:31:26 +00:00
|
|
|
else if(type == UserFmtIMA4 && (samples%65) != 0)
|
2011-03-16 19:56:39 +00:00
|
|
|
alSetError(Context, AL_INVALID_VALUE);
|
|
|
|
else
|
|
|
|
{
|
|
|
|
/* offset -> byte offset */
|
|
|
|
offset *= FrameSize;
|
2011-03-16 20:32:57 +00:00
|
|
|
ConvertData(data, type,
|
|
|
|
&((ALubyte*)ALBuf->data)[offset], ALBuf->FmtType,
|
2011-10-02 14:31:26 +00:00
|
|
|
ChannelsFromFmt(ALBuf->FmtChannels), samples);
|
2011-03-16 19:56:39 +00:00
|
|
|
}
|
2011-09-11 10:57:40 +00:00
|
|
|
ReadUnlock(&ALBuf->lock);
|
2011-03-16 19:56:39 +00:00
|
|
|
}
|
|
|
|
|
2011-09-11 09:37:52 +00:00
|
|
|
ALCcontext_DecRef(Context);
|
2011-03-16 19:56:39 +00:00
|
|
|
}
|
|
|
|
|
2011-03-16 20:57:00 +00:00
|
|
|
AL_API ALboolean AL_APIENTRY alIsBufferFormatSupportedSOFT(ALenum format)
|
|
|
|
{
|
|
|
|
enum FmtChannels DstChannels;
|
|
|
|
enum FmtType DstType;
|
|
|
|
ALCcontext *Context;
|
|
|
|
ALboolean ret;
|
|
|
|
|
2011-09-11 09:37:52 +00:00
|
|
|
Context = GetContextRef();
|
2011-03-16 20:57:00 +00:00
|
|
|
if(!Context) return AL_FALSE;
|
|
|
|
|
|
|
|
ret = DecomposeFormat(format, &DstChannels, &DstType);
|
|
|
|
|
2011-09-11 09:37:52 +00:00
|
|
|
ALCcontext_DecRef(Context);
|
2011-03-16 20:57:00 +00:00
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2011-03-16 18:29:22 +00:00
|
|
|
|
2010-03-19 21:34:18 +00:00
|
|
|
AL_API void AL_APIENTRY alBufferf(ALuint buffer, ALenum eParam, ALfloat flValue)
|
2007-11-14 02:02:18 +00:00
|
|
|
{
|
|
|
|
ALCcontext *pContext;
|
2010-03-17 03:23:46 +00:00
|
|
|
ALCdevice *device;
|
2007-11-14 02:02:18 +00:00
|
|
|
|
|
|
|
(void)flValue;
|
|
|
|
|
2011-09-11 09:37:52 +00:00
|
|
|
pContext = GetContextRef();
|
2009-08-16 23:02:13 +00:00
|
|
|
if(!pContext) return;
|
2007-11-14 02:02:18 +00:00
|
|
|
|
2010-03-17 03:23:46 +00:00
|
|
|
device = pContext->Device;
|
2011-09-25 01:34:45 +00:00
|
|
|
if(LookupBuffer(device, buffer) == NULL)
|
2010-05-25 02:52:27 +00:00
|
|
|
alSetError(pContext, AL_INVALID_NAME);
|
2010-09-07 23:36:42 +00:00
|
|
|
else
|
2007-11-14 02:02:18 +00:00
|
|
|
{
|
|
|
|
switch(eParam)
|
|
|
|
{
|
|
|
|
default:
|
2010-03-17 00:35:51 +00:00
|
|
|
alSetError(pContext, AL_INVALID_ENUM);
|
2007-11-14 02:02:18 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-09-11 09:37:52 +00:00
|
|
|
ALCcontext_DecRef(pContext);
|
2007-11-14 02:02:18 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2010-03-19 21:34:18 +00:00
|
|
|
AL_API void AL_APIENTRY alBuffer3f(ALuint buffer, ALenum eParam, ALfloat flValue1, ALfloat flValue2, ALfloat flValue3)
|
2007-11-14 02:02:18 +00:00
|
|
|
{
|
|
|
|
ALCcontext *pContext;
|
2010-03-17 03:23:46 +00:00
|
|
|
ALCdevice *device;
|
2007-11-14 02:02:18 +00:00
|
|
|
|
|
|
|
(void)flValue1;
|
|
|
|
(void)flValue2;
|
|
|
|
(void)flValue3;
|
|
|
|
|
2011-09-11 09:37:52 +00:00
|
|
|
pContext = GetContextRef();
|
2009-08-16 23:02:13 +00:00
|
|
|
if(!pContext) return;
|
2007-11-14 02:02:18 +00:00
|
|
|
|
2010-03-17 03:23:46 +00:00
|
|
|
device = pContext->Device;
|
2011-09-25 01:34:45 +00:00
|
|
|
if(LookupBuffer(device, buffer) == NULL)
|
2010-05-25 02:52:27 +00:00
|
|
|
alSetError(pContext, AL_INVALID_NAME);
|
|
|
|
else
|
2007-11-14 02:02:18 +00:00
|
|
|
{
|
|
|
|
switch(eParam)
|
|
|
|
{
|
|
|
|
default:
|
2010-03-17 00:35:51 +00:00
|
|
|
alSetError(pContext, AL_INVALID_ENUM);
|
2007-11-14 02:02:18 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-09-11 09:37:52 +00:00
|
|
|
ALCcontext_DecRef(pContext);
|
2007-11-14 02:02:18 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2010-03-19 21:34:18 +00:00
|
|
|
AL_API void AL_APIENTRY alBufferfv(ALuint buffer, ALenum eParam, const ALfloat* flValues)
|
2007-11-14 02:02:18 +00:00
|
|
|
{
|
|
|
|
ALCcontext *pContext;
|
2010-03-17 03:23:46 +00:00
|
|
|
ALCdevice *device;
|
2007-11-14 02:02:18 +00:00
|
|
|
|
2011-09-11 09:37:52 +00:00
|
|
|
pContext = GetContextRef();
|
2009-08-16 23:02:13 +00:00
|
|
|
if(!pContext) return;
|
2007-11-14 02:02:18 +00:00
|
|
|
|
2010-03-17 03:23:46 +00:00
|
|
|
device = pContext->Device;
|
2010-05-25 02:52:27 +00:00
|
|
|
if(!flValues)
|
|
|
|
alSetError(pContext, AL_INVALID_VALUE);
|
2011-09-25 01:34:45 +00:00
|
|
|
else if(LookupBuffer(device, buffer) == NULL)
|
2010-05-25 02:52:27 +00:00
|
|
|
alSetError(pContext, AL_INVALID_NAME);
|
|
|
|
else
|
2007-11-14 02:02:18 +00:00
|
|
|
{
|
|
|
|
switch(eParam)
|
|
|
|
{
|
|
|
|
default:
|
2010-03-17 00:35:51 +00:00
|
|
|
alSetError(pContext, AL_INVALID_ENUM);
|
2007-11-14 02:02:18 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-09-11 09:37:52 +00:00
|
|
|
ALCcontext_DecRef(pContext);
|
2007-11-14 02:02:18 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2010-03-19 21:34:18 +00:00
|
|
|
AL_API void AL_APIENTRY alBufferi(ALuint buffer, ALenum eParam, ALint lValue)
|
2007-11-14 02:02:18 +00:00
|
|
|
{
|
|
|
|
ALCcontext *pContext;
|
2010-03-17 03:23:46 +00:00
|
|
|
ALCdevice *device;
|
2007-11-14 02:02:18 +00:00
|
|
|
|
|
|
|
(void)lValue;
|
|
|
|
|
2011-09-11 09:37:52 +00:00
|
|
|
pContext = GetContextRef();
|
2009-08-16 23:02:13 +00:00
|
|
|
if(!pContext) return;
|
2007-11-14 02:02:18 +00:00
|
|
|
|
2010-03-17 03:23:46 +00:00
|
|
|
device = pContext->Device;
|
2011-09-25 01:34:45 +00:00
|
|
|
if(LookupBuffer(device, buffer) == NULL)
|
2010-05-25 02:52:27 +00:00
|
|
|
alSetError(pContext, AL_INVALID_NAME);
|
|
|
|
else
|
2007-11-14 02:02:18 +00:00
|
|
|
{
|
|
|
|
switch(eParam)
|
|
|
|
{
|
|
|
|
default:
|
2010-03-17 00:35:51 +00:00
|
|
|
alSetError(pContext, AL_INVALID_ENUM);
|
2007-11-14 02:02:18 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-09-11 09:37:52 +00:00
|
|
|
ALCcontext_DecRef(pContext);
|
2007-11-14 02:02:18 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2010-03-19 21:34:18 +00:00
|
|
|
AL_API void AL_APIENTRY alBuffer3i( ALuint buffer, ALenum eParam, ALint lValue1, ALint lValue2, ALint lValue3)
|
2007-11-14 02:02:18 +00:00
|
|
|
{
|
|
|
|
ALCcontext *pContext;
|
2010-03-17 03:23:46 +00:00
|
|
|
ALCdevice *device;
|
2007-11-14 02:02:18 +00:00
|
|
|
|
|
|
|
(void)lValue1;
|
|
|
|
(void)lValue2;
|
|
|
|
(void)lValue3;
|
|
|
|
|
2011-09-11 09:37:52 +00:00
|
|
|
pContext = GetContextRef();
|
2009-08-16 23:02:13 +00:00
|
|
|
if(!pContext) return;
|
2007-11-14 02:02:18 +00:00
|
|
|
|
2010-03-17 03:23:46 +00:00
|
|
|
device = pContext->Device;
|
2011-09-25 01:34:45 +00:00
|
|
|
if(LookupBuffer(device, buffer) == NULL)
|
2010-05-25 02:52:27 +00:00
|
|
|
alSetError(pContext, AL_INVALID_NAME);
|
|
|
|
else
|
2007-11-14 02:02:18 +00:00
|
|
|
{
|
|
|
|
switch(eParam)
|
|
|
|
{
|
|
|
|
default:
|
2010-03-17 00:35:51 +00:00
|
|
|
alSetError(pContext, AL_INVALID_ENUM);
|
2007-11-14 02:02:18 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-09-11 09:37:52 +00:00
|
|
|
ALCcontext_DecRef(pContext);
|
2007-11-14 02:02:18 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2010-03-19 21:34:18 +00:00
|
|
|
AL_API void AL_APIENTRY alBufferiv(ALuint buffer, ALenum eParam, const ALint* plValues)
|
2007-11-14 02:02:18 +00:00
|
|
|
{
|
|
|
|
ALCcontext *pContext;
|
2010-03-17 03:23:46 +00:00
|
|
|
ALCdevice *device;
|
2010-05-13 09:03:48 +00:00
|
|
|
ALbuffer *ALBuf;
|
2007-11-14 02:02:18 +00:00
|
|
|
|
2011-09-11 09:37:52 +00:00
|
|
|
pContext = GetContextRef();
|
2009-08-16 23:02:13 +00:00
|
|
|
if(!pContext) return;
|
2007-11-14 02:02:18 +00:00
|
|
|
|
2010-03-17 03:23:46 +00:00
|
|
|
device = pContext->Device;
|
2010-05-25 02:02:36 +00:00
|
|
|
if(!plValues)
|
|
|
|
alSetError(pContext, AL_INVALID_VALUE);
|
2011-09-25 01:34:45 +00:00
|
|
|
else if((ALBuf=LookupBuffer(device, buffer)) == NULL)
|
2010-05-25 02:02:36 +00:00
|
|
|
alSetError(pContext, AL_INVALID_NAME);
|
|
|
|
else
|
2007-11-14 02:02:18 +00:00
|
|
|
{
|
|
|
|
switch(eParam)
|
|
|
|
{
|
2011-02-10 06:54:12 +00:00
|
|
|
case AL_LOOP_POINTS_SOFT:
|
2011-09-11 10:57:40 +00:00
|
|
|
WriteLock(&ALBuf->lock);
|
2011-08-30 06:05:47 +00:00
|
|
|
if(ALBuf->ref != 0)
|
2010-05-13 09:03:48 +00:00
|
|
|
alSetError(pContext, AL_INVALID_OPERATION);
|
2011-10-03 17:07:50 +00:00
|
|
|
else if(plValues[0] >= plValues[1] || plValues[0] < 0 ||
|
|
|
|
plValues[1] > ALBuf->SampleLen)
|
2010-05-13 09:03:48 +00:00
|
|
|
alSetError(pContext, AL_INVALID_VALUE);
|
|
|
|
else
|
|
|
|
{
|
2011-10-03 17:07:50 +00:00
|
|
|
ALBuf->LoopStart = plValues[0];
|
|
|
|
ALBuf->LoopEnd = plValues[1];
|
2010-05-13 09:03:48 +00:00
|
|
|
}
|
2011-09-11 10:57:40 +00:00
|
|
|
WriteUnlock(&ALBuf->lock);
|
2010-05-13 09:03:48 +00:00
|
|
|
break;
|
|
|
|
|
2007-11-14 02:02:18 +00:00
|
|
|
default:
|
2010-03-17 00:35:51 +00:00
|
|
|
alSetError(pContext, AL_INVALID_ENUM);
|
2007-11-14 02:02:18 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-09-11 09:37:52 +00:00
|
|
|
ALCcontext_DecRef(pContext);
|
2007-11-14 02:02:18 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2010-03-19 21:34:18 +00:00
|
|
|
AL_API ALvoid AL_APIENTRY alGetBufferf(ALuint buffer, ALenum eParam, ALfloat *pflValue)
|
2007-11-14 02:02:18 +00:00
|
|
|
{
|
|
|
|
ALCcontext *pContext;
|
2010-03-17 03:23:46 +00:00
|
|
|
ALCdevice *device;
|
Add buffer properties to get the internal format, and the length in bytes, samples, and seconds
The provided buffer lengths correspond to the source offsets, in that the byte
length specifies the end of the byte offset (ie, when the buffer is used for a
static source, the offset will range between 0 (inclusive) and the byte length
(exclusive)). Although an application could use the AL_SIZE, AL_CHANNELS,
AL_BITS, and AL_FREQUENCY properties to find the length in samples and seconds,
the byte length cannot be reliably calculated this way.
2011-10-01 13:19:55 +00:00
|
|
|
ALbuffer *pBuffer;
|
2007-11-14 02:02:18 +00:00
|
|
|
|
2011-09-11 09:37:52 +00:00
|
|
|
pContext = GetContextRef();
|
2009-08-16 23:02:13 +00:00
|
|
|
if(!pContext) return;
|
2007-11-14 02:02:18 +00:00
|
|
|
|
2010-05-25 02:52:27 +00:00
|
|
|
device = pContext->Device;
|
|
|
|
if(!pflValue)
|
|
|
|
alSetError(pContext, AL_INVALID_VALUE);
|
Add buffer properties to get the internal format, and the length in bytes, samples, and seconds
The provided buffer lengths correspond to the source offsets, in that the byte
length specifies the end of the byte offset (ie, when the buffer is used for a
static source, the offset will range between 0 (inclusive) and the byte length
(exclusive)). Although an application could use the AL_SIZE, AL_CHANNELS,
AL_BITS, and AL_FREQUENCY properties to find the length in samples and seconds,
the byte length cannot be reliably calculated this way.
2011-10-01 13:19:55 +00:00
|
|
|
else if((pBuffer=LookupBuffer(device, buffer)) == NULL)
|
2010-05-25 02:52:27 +00:00
|
|
|
alSetError(pContext, AL_INVALID_NAME);
|
|
|
|
else
|
2007-11-14 02:02:18 +00:00
|
|
|
{
|
2010-05-25 02:52:27 +00:00
|
|
|
switch(eParam)
|
2007-11-14 02:02:18 +00:00
|
|
|
{
|
2012-01-10 08:41:05 +00:00
|
|
|
case AL_SEC_LENGTH_SOFT:
|
Add buffer properties to get the internal format, and the length in bytes, samples, and seconds
The provided buffer lengths correspond to the source offsets, in that the byte
length specifies the end of the byte offset (ie, when the buffer is used for a
static source, the offset will range between 0 (inclusive) and the byte length
(exclusive)). Although an application could use the AL_SIZE, AL_CHANNELS,
AL_BITS, and AL_FREQUENCY properties to find the length in samples and seconds,
the byte length cannot be reliably calculated this way.
2011-10-01 13:19:55 +00:00
|
|
|
ReadLock(&pBuffer->lock);
|
2011-10-03 17:07:50 +00:00
|
|
|
if(pBuffer->SampleLen != 0)
|
|
|
|
*pflValue = pBuffer->SampleLen / (ALfloat)pBuffer->Frequency;
|
2011-10-01 15:37:42 +00:00
|
|
|
else
|
|
|
|
*pflValue = 0.0f;
|
Add buffer properties to get the internal format, and the length in bytes, samples, and seconds
The provided buffer lengths correspond to the source offsets, in that the byte
length specifies the end of the byte offset (ie, when the buffer is used for a
static source, the offset will range between 0 (inclusive) and the byte length
(exclusive)). Although an application could use the AL_SIZE, AL_CHANNELS,
AL_BITS, and AL_FREQUENCY properties to find the length in samples and seconds,
the byte length cannot be reliably calculated this way.
2011-10-01 13:19:55 +00:00
|
|
|
ReadUnlock(&pBuffer->lock);
|
|
|
|
break;
|
|
|
|
|
2010-05-25 02:52:27 +00:00
|
|
|
default:
|
|
|
|
alSetError(pContext, AL_INVALID_ENUM);
|
|
|
|
break;
|
2007-11-14 02:02:18 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-09-11 09:37:52 +00:00
|
|
|
ALCcontext_DecRef(pContext);
|
2007-11-14 02:02:18 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2010-03-19 21:34:18 +00:00
|
|
|
AL_API void AL_APIENTRY alGetBuffer3f(ALuint buffer, ALenum eParam, ALfloat* pflValue1, ALfloat* pflValue2, ALfloat* pflValue3)
|
2007-11-14 02:02:18 +00:00
|
|
|
{
|
|
|
|
ALCcontext *pContext;
|
2010-03-17 03:23:46 +00:00
|
|
|
ALCdevice *device;
|
2007-11-14 02:02:18 +00:00
|
|
|
|
2011-09-11 09:37:52 +00:00
|
|
|
pContext = GetContextRef();
|
2009-08-16 23:02:13 +00:00
|
|
|
if(!pContext) return;
|
2007-11-14 02:02:18 +00:00
|
|
|
|
2010-05-25 02:52:27 +00:00
|
|
|
device = pContext->Device;
|
|
|
|
if(!pflValue1 || !pflValue2 || !pflValue3)
|
|
|
|
alSetError(pContext, AL_INVALID_VALUE);
|
2011-09-25 01:34:45 +00:00
|
|
|
else if(LookupBuffer(device, buffer) == NULL)
|
2010-05-25 02:52:27 +00:00
|
|
|
alSetError(pContext, AL_INVALID_NAME);
|
|
|
|
else
|
2007-11-14 02:02:18 +00:00
|
|
|
{
|
2010-05-25 02:52:27 +00:00
|
|
|
switch(eParam)
|
2007-11-14 02:02:18 +00:00
|
|
|
{
|
2010-05-25 02:52:27 +00:00
|
|
|
default:
|
|
|
|
alSetError(pContext, AL_INVALID_ENUM);
|
|
|
|
break;
|
2007-11-14 02:02:18 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-09-11 09:37:52 +00:00
|
|
|
ALCcontext_DecRef(pContext);
|
2007-11-14 02:02:18 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2010-03-19 21:34:18 +00:00
|
|
|
AL_API void AL_APIENTRY alGetBufferfv(ALuint buffer, ALenum eParam, ALfloat* pflValues)
|
2007-11-14 02:02:18 +00:00
|
|
|
{
|
|
|
|
ALCcontext *pContext;
|
2010-03-17 03:23:46 +00:00
|
|
|
ALCdevice *device;
|
2007-11-14 02:02:18 +00:00
|
|
|
|
Add buffer properties to get the internal format, and the length in bytes, samples, and seconds
The provided buffer lengths correspond to the source offsets, in that the byte
length specifies the end of the byte offset (ie, when the buffer is used for a
static source, the offset will range between 0 (inclusive) and the byte length
(exclusive)). Although an application could use the AL_SIZE, AL_CHANNELS,
AL_BITS, and AL_FREQUENCY properties to find the length in samples and seconds,
the byte length cannot be reliably calculated this way.
2011-10-01 13:19:55 +00:00
|
|
|
switch(eParam)
|
|
|
|
{
|
2012-01-10 08:41:05 +00:00
|
|
|
case AL_SEC_LENGTH_SOFT:
|
Add buffer properties to get the internal format, and the length in bytes, samples, and seconds
The provided buffer lengths correspond to the source offsets, in that the byte
length specifies the end of the byte offset (ie, when the buffer is used for a
static source, the offset will range between 0 (inclusive) and the byte length
(exclusive)). Although an application could use the AL_SIZE, AL_CHANNELS,
AL_BITS, and AL_FREQUENCY properties to find the length in samples and seconds,
the byte length cannot be reliably calculated this way.
2011-10-01 13:19:55 +00:00
|
|
|
alGetBufferf(buffer, eParam, pflValues);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2011-09-11 09:37:52 +00:00
|
|
|
pContext = GetContextRef();
|
2009-08-16 23:02:13 +00:00
|
|
|
if(!pContext) return;
|
2007-11-14 02:02:18 +00:00
|
|
|
|
2010-05-25 02:52:27 +00:00
|
|
|
device = pContext->Device;
|
|
|
|
if(!pflValues)
|
|
|
|
alSetError(pContext, AL_INVALID_VALUE);
|
2011-09-25 01:34:45 +00:00
|
|
|
else if(LookupBuffer(device, buffer) == NULL)
|
2010-05-25 02:52:27 +00:00
|
|
|
alSetError(pContext, AL_INVALID_NAME);
|
|
|
|
else
|
2007-11-14 02:02:18 +00:00
|
|
|
{
|
2010-05-25 02:52:27 +00:00
|
|
|
switch(eParam)
|
2007-11-14 02:02:18 +00:00
|
|
|
{
|
2010-05-25 02:52:27 +00:00
|
|
|
default:
|
|
|
|
alSetError(pContext, AL_INVALID_ENUM);
|
|
|
|
break;
|
2007-11-14 02:02:18 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-09-11 09:37:52 +00:00
|
|
|
ALCcontext_DecRef(pContext);
|
2007-11-14 02:02:18 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2010-03-19 21:34:18 +00:00
|
|
|
AL_API ALvoid AL_APIENTRY alGetBufferi(ALuint buffer, ALenum eParam, ALint *plValue)
|
2007-11-14 02:02:18 +00:00
|
|
|
{
|
|
|
|
ALCcontext *pContext;
|
2010-03-17 03:23:46 +00:00
|
|
|
ALbuffer *pBuffer;
|
|
|
|
ALCdevice *device;
|
2007-11-14 02:02:18 +00:00
|
|
|
|
2011-09-11 09:37:52 +00:00
|
|
|
pContext = GetContextRef();
|
2009-08-16 23:02:13 +00:00
|
|
|
if(!pContext) return;
|
2007-11-14 02:02:18 +00:00
|
|
|
|
2010-05-25 02:52:27 +00:00
|
|
|
device = pContext->Device;
|
|
|
|
if(!plValue)
|
|
|
|
alSetError(pContext, AL_INVALID_VALUE);
|
2011-09-25 01:34:45 +00:00
|
|
|
else if((pBuffer=LookupBuffer(device, buffer)) == NULL)
|
2010-05-25 02:52:27 +00:00
|
|
|
alSetError(pContext, AL_INVALID_NAME);
|
|
|
|
else
|
2007-11-14 02:02:18 +00:00
|
|
|
{
|
2010-05-25 02:52:27 +00:00
|
|
|
switch(eParam)
|
2007-11-14 02:02:18 +00:00
|
|
|
{
|
2010-05-25 02:52:27 +00:00
|
|
|
case AL_FREQUENCY:
|
2010-11-28 21:08:51 +00:00
|
|
|
*plValue = pBuffer->Frequency;
|
2010-05-25 02:52:27 +00:00
|
|
|
break;
|
2007-11-14 02:02:18 +00:00
|
|
|
|
2010-05-25 02:52:27 +00:00
|
|
|
case AL_BITS:
|
2010-11-28 20:53:35 +00:00
|
|
|
*plValue = BytesFromFmt(pBuffer->FmtType) * 8;
|
2010-05-25 02:52:27 +00:00
|
|
|
break;
|
2007-11-14 02:02:18 +00:00
|
|
|
|
2010-05-25 02:52:27 +00:00
|
|
|
case AL_CHANNELS:
|
2010-11-28 20:53:35 +00:00
|
|
|
*plValue = ChannelsFromFmt(pBuffer->FmtChannels);
|
2010-05-25 02:52:27 +00:00
|
|
|
break;
|
2007-11-14 02:02:18 +00:00
|
|
|
|
2010-05-25 02:52:27 +00:00
|
|
|
case AL_SIZE:
|
2011-10-03 17:07:50 +00:00
|
|
|
ReadLock(&pBuffer->lock);
|
|
|
|
*plValue = pBuffer->SampleLen *
|
|
|
|
FrameSizeFromFmt(pBuffer->FmtChannels, pBuffer->FmtType);
|
|
|
|
ReadUnlock(&pBuffer->lock);
|
2010-05-25 02:52:27 +00:00
|
|
|
break;
|
2007-11-14 02:02:18 +00:00
|
|
|
|
2012-01-10 08:41:05 +00:00
|
|
|
case AL_INTERNAL_FORMAT_SOFT:
|
Add buffer properties to get the internal format, and the length in bytes, samples, and seconds
The provided buffer lengths correspond to the source offsets, in that the byte
length specifies the end of the byte offset (ie, when the buffer is used for a
static source, the offset will range between 0 (inclusive) and the byte length
(exclusive)). Although an application could use the AL_SIZE, AL_CHANNELS,
AL_BITS, and AL_FREQUENCY properties to find the length in samples and seconds,
the byte length cannot be reliably calculated this way.
2011-10-01 13:19:55 +00:00
|
|
|
*plValue = pBuffer->Format;
|
|
|
|
break;
|
|
|
|
|
2012-01-10 08:41:05 +00:00
|
|
|
case AL_BYTE_LENGTH_SOFT:
|
Add buffer properties to get the internal format, and the length in bytes, samples, and seconds
The provided buffer lengths correspond to the source offsets, in that the byte
length specifies the end of the byte offset (ie, when the buffer is used for a
static source, the offset will range between 0 (inclusive) and the byte length
(exclusive)). Although an application could use the AL_SIZE, AL_CHANNELS,
AL_BITS, and AL_FREQUENCY properties to find the length in samples and seconds,
the byte length cannot be reliably calculated this way.
2011-10-01 13:19:55 +00:00
|
|
|
*plValue = pBuffer->OriginalSize;
|
|
|
|
break;
|
|
|
|
|
2012-01-10 08:41:05 +00:00
|
|
|
case AL_SAMPLE_LENGTH_SOFT:
|
2011-10-03 17:07:50 +00:00
|
|
|
*plValue = pBuffer->SampleLen;
|
Add buffer properties to get the internal format, and the length in bytes, samples, and seconds
The provided buffer lengths correspond to the source offsets, in that the byte
length specifies the end of the byte offset (ie, when the buffer is used for a
static source, the offset will range between 0 (inclusive) and the byte length
(exclusive)). Although an application could use the AL_SIZE, AL_CHANNELS,
AL_BITS, and AL_FREQUENCY properties to find the length in samples and seconds,
the byte length cannot be reliably calculated this way.
2011-10-01 13:19:55 +00:00
|
|
|
break;
|
|
|
|
|
2010-05-25 02:52:27 +00:00
|
|
|
default:
|
|
|
|
alSetError(pContext, AL_INVALID_ENUM);
|
|
|
|
break;
|
2007-11-14 02:02:18 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-09-11 09:37:52 +00:00
|
|
|
ALCcontext_DecRef(pContext);
|
2007-11-14 02:02:18 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2010-03-19 21:34:18 +00:00
|
|
|
AL_API void AL_APIENTRY alGetBuffer3i(ALuint buffer, ALenum eParam, ALint* plValue1, ALint* plValue2, ALint* plValue3)
|
2007-11-14 02:02:18 +00:00
|
|
|
{
|
|
|
|
ALCcontext *pContext;
|
2010-03-17 03:23:46 +00:00
|
|
|
ALCdevice *device;
|
2007-11-14 02:02:18 +00:00
|
|
|
|
2011-09-11 09:37:52 +00:00
|
|
|
pContext = GetContextRef();
|
2009-08-16 23:02:13 +00:00
|
|
|
if(!pContext) return;
|
2007-11-14 02:02:18 +00:00
|
|
|
|
2010-05-25 02:52:27 +00:00
|
|
|
device = pContext->Device;
|
|
|
|
if(!plValue1 || !plValue2 || !plValue3)
|
|
|
|
alSetError(pContext, AL_INVALID_VALUE);
|
2011-09-25 01:34:45 +00:00
|
|
|
else if(LookupBuffer(device, buffer) == NULL)
|
2010-05-25 02:52:27 +00:00
|
|
|
alSetError(pContext, AL_INVALID_NAME);
|
|
|
|
else
|
2007-11-14 02:02:18 +00:00
|
|
|
{
|
2010-05-25 02:52:27 +00:00
|
|
|
switch(eParam)
|
2007-11-14 02:02:18 +00:00
|
|
|
{
|
2010-05-25 02:52:27 +00:00
|
|
|
default:
|
|
|
|
alSetError(pContext, AL_INVALID_ENUM);
|
|
|
|
break;
|
2007-11-14 02:02:18 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-09-11 09:37:52 +00:00
|
|
|
ALCcontext_DecRef(pContext);
|
2007-11-14 02:02:18 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2010-03-19 21:34:18 +00:00
|
|
|
AL_API void AL_APIENTRY alGetBufferiv(ALuint buffer, ALenum eParam, ALint* plValues)
|
2007-11-14 02:02:18 +00:00
|
|
|
{
|
|
|
|
ALCcontext *pContext;
|
2010-03-17 03:23:46 +00:00
|
|
|
ALCdevice *device;
|
2010-05-13 09:03:48 +00:00
|
|
|
ALbuffer *ALBuf;
|
2007-11-14 02:02:18 +00:00
|
|
|
|
2011-06-16 16:14:41 +00:00
|
|
|
switch(eParam)
|
|
|
|
{
|
|
|
|
case AL_FREQUENCY:
|
|
|
|
case AL_BITS:
|
|
|
|
case AL_CHANNELS:
|
|
|
|
case AL_SIZE:
|
2012-01-10 08:41:05 +00:00
|
|
|
case AL_INTERNAL_FORMAT_SOFT:
|
|
|
|
case AL_BYTE_LENGTH_SOFT:
|
|
|
|
case AL_SAMPLE_LENGTH_SOFT:
|
2011-06-16 16:14:41 +00:00
|
|
|
alGetBufferi(buffer, eParam, plValues);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2011-09-11 09:37:52 +00:00
|
|
|
pContext = GetContextRef();
|
2009-08-16 23:02:13 +00:00
|
|
|
if(!pContext) return;
|
2007-11-14 02:02:18 +00:00
|
|
|
|
2010-05-25 02:52:27 +00:00
|
|
|
device = pContext->Device;
|
|
|
|
if(!plValues)
|
|
|
|
alSetError(pContext, AL_INVALID_VALUE);
|
2011-09-25 01:34:45 +00:00
|
|
|
else if((ALBuf=LookupBuffer(device, buffer)) == NULL)
|
2010-05-25 02:52:27 +00:00
|
|
|
alSetError(pContext, AL_INVALID_NAME);
|
|
|
|
else
|
2007-11-14 02:02:18 +00:00
|
|
|
{
|
2010-05-25 02:52:27 +00:00
|
|
|
switch(eParam)
|
2007-11-14 02:02:18 +00:00
|
|
|
{
|
2011-02-10 06:54:12 +00:00
|
|
|
case AL_LOOP_POINTS_SOFT:
|
2011-09-11 10:57:40 +00:00
|
|
|
ReadLock(&ALBuf->lock);
|
2010-05-25 02:52:27 +00:00
|
|
|
plValues[0] = ALBuf->LoopStart;
|
|
|
|
plValues[1] = ALBuf->LoopEnd;
|
2011-09-11 10:57:40 +00:00
|
|
|
ReadUnlock(&ALBuf->lock);
|
2010-05-25 02:52:27 +00:00
|
|
|
break;
|
2010-05-13 09:03:48 +00:00
|
|
|
|
2010-05-25 02:52:27 +00:00
|
|
|
default:
|
|
|
|
alSetError(pContext, AL_INVALID_ENUM);
|
|
|
|
break;
|
2007-11-14 02:02:18 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-09-11 09:37:52 +00:00
|
|
|
ALCcontext_DecRef(pContext);
|
2007-11-14 02:02:18 +00:00
|
|
|
}
|
|
|
|
|
2007-12-29 04:25:18 +00:00
|
|
|
|
2010-11-30 09:20:40 +00:00
|
|
|
typedef ALubyte ALmulaw;
|
2011-10-01 11:55:03 +00:00
|
|
|
typedef ALubyte ALalaw;
|
2011-03-21 16:42:03 +00:00
|
|
|
typedef ALubyte ALima4;
|
2011-04-27 01:17:50 +00:00
|
|
|
typedef struct {
|
|
|
|
ALbyte b[3];
|
|
|
|
} ALbyte3;
|
2012-02-07 16:05:01 +00:00
|
|
|
extern ALbyte ALbyte3_size_is_not_3[(sizeof(ALbyte3)==sizeof(ALbyte[3]))?1:-1];
|
2011-04-27 01:17:50 +00:00
|
|
|
typedef struct {
|
|
|
|
ALubyte b[3];
|
|
|
|
} ALubyte3;
|
2012-02-07 16:05:01 +00:00
|
|
|
extern ALbyte ALubyte3_size_is_not_3[(sizeof(ALubyte3)==sizeof(ALubyte[3]))?1:-1];
|
2010-11-30 09:20:40 +00:00
|
|
|
|
2010-11-30 09:26:43 +00:00
|
|
|
static __inline ALshort DecodeMuLaw(ALmulaw val)
|
|
|
|
{ return muLawDecompressionTable[val]; }
|
|
|
|
|
2010-11-30 09:20:40 +00:00
|
|
|
static ALmulaw EncodeMuLaw(ALshort val)
|
|
|
|
{
|
|
|
|
ALint mant, exp, sign;
|
|
|
|
|
|
|
|
sign = (val>>8) & 0x80;
|
2010-12-01 10:24:39 +00:00
|
|
|
if(sign)
|
|
|
|
{
|
|
|
|
/* -32768 doesn't properly negate on a short; it results in itself.
|
|
|
|
* So clamp to -32767 */
|
2011-08-17 01:33:10 +00:00
|
|
|
val = maxi(val, -32767);
|
2010-12-01 10:24:39 +00:00
|
|
|
val = -val;
|
|
|
|
}
|
2010-11-30 09:20:40 +00:00
|
|
|
|
2011-08-17 01:33:10 +00:00
|
|
|
val = mini(val, muLawClip);
|
2010-11-30 09:20:40 +00:00
|
|
|
val += muLawBias;
|
|
|
|
|
|
|
|
exp = muLawCompressTable[(val>>7) & 0xff];
|
|
|
|
mant = (val >> (exp+3)) & 0x0f;
|
|
|
|
|
|
|
|
return ~(sign | (exp<<4) | mant);
|
|
|
|
}
|
|
|
|
|
2011-10-01 11:55:03 +00:00
|
|
|
static __inline ALshort DecodeALaw(ALalaw val)
|
|
|
|
{ return aLawDecompressionTable[val]; }
|
|
|
|
|
|
|
|
static ALalaw EncodeALaw(ALshort val)
|
|
|
|
{
|
|
|
|
ALint mant, exp, sign;
|
|
|
|
|
|
|
|
sign = ((~val) >> 8) & 0x80;
|
|
|
|
if(!sign)
|
|
|
|
{
|
|
|
|
val = maxi(val, -32767);
|
|
|
|
val = -val;
|
|
|
|
}
|
|
|
|
val = mini(val, aLawClip);
|
|
|
|
|
|
|
|
if(val >= 256)
|
|
|
|
{
|
|
|
|
exp = aLawCompressTable[(val>>8) & 0x7f];
|
|
|
|
mant = (val >> (exp+3)) & 0x0f;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
exp = 0;
|
|
|
|
mant = val >> 4;
|
|
|
|
}
|
|
|
|
|
|
|
|
return ((exp<<4) | mant) ^ (sign^0x55);
|
|
|
|
}
|
|
|
|
|
2011-03-21 16:42:03 +00:00
|
|
|
static void DecodeIMA4Block(ALshort *dst, const ALima4 *src, ALint numchans)
|
2008-11-02 08:24:57 +00:00
|
|
|
{
|
2010-12-02 02:36:07 +00:00
|
|
|
ALint sample[MAXCHANNELS], index[MAXCHANNELS];
|
|
|
|
ALuint code[MAXCHANNELS];
|
2010-11-30 06:55:46 +00:00
|
|
|
ALsizei j,k,c;
|
2008-11-02 23:30:56 +00:00
|
|
|
|
2010-11-30 06:55:46 +00:00
|
|
|
for(c = 0;c < numchans;c++)
|
2008-11-02 08:24:57 +00:00
|
|
|
{
|
2010-12-01 22:19:57 +00:00
|
|
|
sample[c] = *(src++);
|
|
|
|
sample[c] |= *(src++) << 8;
|
|
|
|
sample[c] = (sample[c]^0x8000) - 32768;
|
|
|
|
index[c] = *(src++);
|
|
|
|
index[c] |= *(src++) << 8;
|
|
|
|
index[c] = (index[c]^0x8000) - 32768;
|
2008-11-02 08:24:57 +00:00
|
|
|
|
2011-08-17 01:33:10 +00:00
|
|
|
index[c] = clampi(index[c], 0, 88);
|
2008-11-02 08:24:57 +00:00
|
|
|
|
2010-12-01 22:19:57 +00:00
|
|
|
dst[c] = sample[c];
|
2010-11-30 06:55:46 +00:00
|
|
|
}
|
2008-11-02 08:24:57 +00:00
|
|
|
|
2010-11-30 06:55:46 +00:00
|
|
|
j = 1;
|
|
|
|
while(j < 65)
|
|
|
|
{
|
|
|
|
for(c = 0;c < numchans;c++)
|
2008-11-02 08:24:57 +00:00
|
|
|
{
|
2010-12-01 22:19:57 +00:00
|
|
|
code[c] = *(src++);
|
|
|
|
code[c] |= *(src++) << 8;
|
|
|
|
code[c] |= *(src++) << 16;
|
|
|
|
code[c] |= *(src++) << 24;
|
2010-11-30 06:55:46 +00:00
|
|
|
}
|
2008-11-02 08:24:57 +00:00
|
|
|
|
2010-11-30 06:55:46 +00:00
|
|
|
for(k = 0;k < 8;k++,j++)
|
|
|
|
{
|
|
|
|
for(c = 0;c < numchans;c++)
|
2008-11-02 08:24:57 +00:00
|
|
|
{
|
2010-12-01 22:19:57 +00:00
|
|
|
int nibble = code[c]&0xf;
|
|
|
|
code[c] >>= 4;
|
2008-11-02 08:24:57 +00:00
|
|
|
|
2010-12-01 22:19:57 +00:00
|
|
|
sample[c] += IMA4Codeword[nibble] * IMAStep_size[index[c]] / 8;
|
2011-08-17 01:33:10 +00:00
|
|
|
sample[c] = clampi(sample[c], -32768, 32767);
|
2008-11-02 08:24:57 +00:00
|
|
|
|
2010-12-01 22:19:57 +00:00
|
|
|
index[c] += IMA4Index_adjust[nibble];
|
2011-08-17 01:33:10 +00:00
|
|
|
index[c] = clampi(index[c], 0, 88);
|
2008-11-02 08:24:57 +00:00
|
|
|
|
2010-12-01 22:19:57 +00:00
|
|
|
dst[j*numchans + c] = sample[c];
|
2008-11-02 08:24:57 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2007-11-14 02:02:18 +00:00
|
|
|
|
2011-03-21 16:42:03 +00:00
|
|
|
static void EncodeIMA4Block(ALima4 *dst, const ALshort *src, ALint *sample, ALint *index, ALint numchans)
|
2010-12-05 11:34:19 +00:00
|
|
|
{
|
|
|
|
ALsizei j,k,c;
|
|
|
|
|
|
|
|
for(c = 0;c < numchans;c++)
|
|
|
|
{
|
|
|
|
int diff = src[c] - sample[c];
|
|
|
|
int step = IMAStep_size[index[c]];
|
|
|
|
int nibble;
|
|
|
|
|
|
|
|
nibble = 0;
|
|
|
|
if(diff < 0)
|
|
|
|
{
|
|
|
|
nibble = 0x8;
|
|
|
|
diff = -diff;
|
|
|
|
}
|
|
|
|
|
2011-08-17 01:33:10 +00:00
|
|
|
diff = mini(step*2, diff);
|
2010-12-05 11:34:19 +00:00
|
|
|
nibble |= (diff*8/step - 1) / 2;
|
|
|
|
|
|
|
|
sample[c] += IMA4Codeword[nibble] * step / 8;
|
2011-08-17 01:33:10 +00:00
|
|
|
sample[c] = clampi(sample[c], -32768, 32767);
|
2010-12-05 11:34:19 +00:00
|
|
|
|
|
|
|
index[c] += IMA4Index_adjust[nibble];
|
2011-08-17 01:33:10 +00:00
|
|
|
index[c] = clampi(index[c], 0, 88);
|
2010-12-05 11:34:19 +00:00
|
|
|
|
|
|
|
*(dst++) = sample[c] & 0xff;
|
|
|
|
*(dst++) = (sample[c]>>8) & 0xff;
|
|
|
|
*(dst++) = index[c] & 0xff;
|
|
|
|
*(dst++) = (index[c]>>8) & 0xff;
|
|
|
|
}
|
|
|
|
|
|
|
|
j = 1;
|
|
|
|
while(j < 65)
|
|
|
|
{
|
|
|
|
for(c = 0;c < numchans;c++)
|
|
|
|
{
|
|
|
|
for(k = 0;k < 8;k++)
|
|
|
|
{
|
|
|
|
int diff = src[(j+k)*numchans + c] - sample[c];
|
|
|
|
int step = IMAStep_size[index[c]];
|
|
|
|
int nibble;
|
|
|
|
|
|
|
|
nibble = 0;
|
|
|
|
if(diff < 0)
|
|
|
|
{
|
|
|
|
nibble = 0x8;
|
|
|
|
diff = -diff;
|
|
|
|
}
|
|
|
|
|
2011-08-17 01:33:10 +00:00
|
|
|
diff = mini(step*2, diff);
|
2010-12-05 11:34:19 +00:00
|
|
|
nibble |= (diff*8/step - 1) / 2;
|
|
|
|
|
|
|
|
sample[c] += IMA4Codeword[nibble] * step / 8;
|
2011-08-17 01:33:10 +00:00
|
|
|
sample[c] = clampi(sample[c], -32768, 32767);
|
2010-12-05 11:34:19 +00:00
|
|
|
|
|
|
|
index[c] += IMA4Index_adjust[nibble];
|
2011-08-17 01:33:10 +00:00
|
|
|
index[c] = clampi(index[c], 0, 88);
|
2010-12-05 11:34:19 +00:00
|
|
|
|
|
|
|
if(!(k&1)) *dst = nibble;
|
|
|
|
else *(dst++) |= nibble<<4;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
j += 8;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-04-27 22:46:30 +00:00
|
|
|
|
2011-04-27 01:17:50 +00:00
|
|
|
static __inline ALint DecodeByte3(ALbyte3 val)
|
2011-04-27 22:46:30 +00:00
|
|
|
{
|
|
|
|
if(IS_LITTLE_ENDIAN)
|
|
|
|
return (val.b[2]<<16) | (((ALubyte)val.b[1])<<8) | ((ALubyte)val.b[0]);
|
|
|
|
return (val.b[0]<<16) | (((ALubyte)val.b[1])<<8) | ((ALubyte)val.b[2]);
|
|
|
|
}
|
2011-04-27 01:17:50 +00:00
|
|
|
|
|
|
|
static __inline ALbyte3 EncodeByte3(ALint val)
|
|
|
|
{
|
2011-04-27 22:46:30 +00:00
|
|
|
if(IS_LITTLE_ENDIAN)
|
|
|
|
{
|
|
|
|
ALbyte3 ret = {{ val, val>>8, val>>16 }};
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
ALbyte3 ret = {{ val>>16, val>>8, val }};
|
|
|
|
return ret;
|
|
|
|
}
|
2011-04-27 01:17:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static __inline ALint DecodeUByte3(ALubyte3 val)
|
2011-04-27 22:46:30 +00:00
|
|
|
{
|
|
|
|
if(IS_LITTLE_ENDIAN)
|
|
|
|
return (val.b[2]<<16) | (val.b[1]<<8) | (val.b[0]);
|
|
|
|
return (val.b[0]<<16) | (val.b[1]<<8) | val.b[2];
|
|
|
|
}
|
2011-04-27 01:17:50 +00:00
|
|
|
|
|
|
|
static __inline ALubyte3 EncodeUByte3(ALint val)
|
|
|
|
{
|
2011-04-27 22:46:30 +00:00
|
|
|
if(IS_LITTLE_ENDIAN)
|
|
|
|
{
|
|
|
|
ALubyte3 ret = {{ val, val>>8, val>>16 }};
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
ALubyte3 ret = {{ val>>16, val>>8, val }};
|
|
|
|
return ret;
|
|
|
|
}
|
2011-04-27 01:17:50 +00:00
|
|
|
}
|
|
|
|
|
2010-11-27 23:33:33 +00:00
|
|
|
|
2010-11-28 04:33:37 +00:00
|
|
|
static __inline ALbyte Conv_ALbyte_ALbyte(ALbyte val)
|
|
|
|
{ return val; }
|
|
|
|
static __inline ALbyte Conv_ALbyte_ALubyte(ALubyte val)
|
2010-12-10 01:37:57 +00:00
|
|
|
{ return val-128; }
|
2010-11-28 04:33:37 +00:00
|
|
|
static __inline ALbyte Conv_ALbyte_ALshort(ALshort val)
|
|
|
|
{ return val>>8; }
|
|
|
|
static __inline ALbyte Conv_ALbyte_ALushort(ALushort val)
|
|
|
|
{ return (val>>8)-128; }
|
2010-11-30 01:00:22 +00:00
|
|
|
static __inline ALbyte Conv_ALbyte_ALint(ALint val)
|
|
|
|
{ return val>>24; }
|
|
|
|
static __inline ALbyte Conv_ALbyte_ALuint(ALuint val)
|
|
|
|
{ return (val>>24)-128; }
|
2010-11-28 04:33:37 +00:00
|
|
|
static __inline ALbyte Conv_ALbyte_ALfloat(ALfloat val)
|
|
|
|
{
|
2010-12-09 13:06:29 +00:00
|
|
|
if(val > 1.0f) return 127;
|
|
|
|
if(val < -1.0f) return -128;
|
2010-11-28 04:33:37 +00:00
|
|
|
return (ALint)(val * 127.0f);
|
|
|
|
}
|
|
|
|
static __inline ALbyte Conv_ALbyte_ALdouble(ALdouble val)
|
|
|
|
{
|
2010-12-09 13:06:29 +00:00
|
|
|
if(val > 1.0) return 127;
|
|
|
|
if(val < -1.0) return -128;
|
2010-11-28 04:33:37 +00:00
|
|
|
return (ALint)(val * 127.0);
|
|
|
|
}
|
2010-11-28 06:00:24 +00:00
|
|
|
static __inline ALbyte Conv_ALbyte_ALmulaw(ALmulaw val)
|
2010-11-30 09:26:43 +00:00
|
|
|
{ return Conv_ALbyte_ALshort(DecodeMuLaw(val)); }
|
2011-10-01 11:55:03 +00:00
|
|
|
static __inline ALbyte Conv_ALbyte_ALalaw(ALalaw val)
|
|
|
|
{ return Conv_ALbyte_ALshort(DecodeALaw(val)); }
|
2011-04-27 01:17:50 +00:00
|
|
|
static __inline ALbyte Conv_ALbyte_ALbyte3(ALbyte3 val)
|
|
|
|
{ return DecodeByte3(val)>>16; }
|
|
|
|
static __inline ALbyte Conv_ALbyte_ALubyte3(ALubyte3 val)
|
|
|
|
{ return (DecodeUByte3(val)>>16)-128; }
|
2010-11-28 04:33:37 +00:00
|
|
|
|
|
|
|
static __inline ALubyte Conv_ALubyte_ALbyte(ALbyte val)
|
2010-12-10 01:37:57 +00:00
|
|
|
{ return val+128; }
|
2010-11-28 04:33:37 +00:00
|
|
|
static __inline ALubyte Conv_ALubyte_ALubyte(ALubyte val)
|
|
|
|
{ return val; }
|
|
|
|
static __inline ALubyte Conv_ALubyte_ALshort(ALshort val)
|
|
|
|
{ return (val>>8)+128; }
|
|
|
|
static __inline ALubyte Conv_ALubyte_ALushort(ALushort val)
|
|
|
|
{ return val>>8; }
|
2010-11-30 01:00:22 +00:00
|
|
|
static __inline ALubyte Conv_ALubyte_ALint(ALint val)
|
|
|
|
{ return (val>>24)+128; }
|
|
|
|
static __inline ALubyte Conv_ALubyte_ALuint(ALuint val)
|
|
|
|
{ return val>>24; }
|
2010-11-28 04:33:37 +00:00
|
|
|
static __inline ALubyte Conv_ALubyte_ALfloat(ALfloat val)
|
|
|
|
{
|
2010-12-09 13:06:29 +00:00
|
|
|
if(val > 1.0f) return 255;
|
|
|
|
if(val < -1.0f) return 0;
|
2010-11-28 04:33:37 +00:00
|
|
|
return (ALint)(val * 127.0f) + 128;
|
|
|
|
}
|
|
|
|
static __inline ALubyte Conv_ALubyte_ALdouble(ALdouble val)
|
|
|
|
{
|
2010-12-09 13:06:29 +00:00
|
|
|
if(val > 1.0) return 255;
|
|
|
|
if(val < -1.0) return 0;
|
2010-11-28 04:33:37 +00:00
|
|
|
return (ALint)(val * 127.0) + 128;
|
|
|
|
}
|
2010-11-28 06:00:24 +00:00
|
|
|
static __inline ALubyte Conv_ALubyte_ALmulaw(ALmulaw val)
|
2010-11-30 09:26:43 +00:00
|
|
|
{ return Conv_ALubyte_ALshort(DecodeMuLaw(val)); }
|
2011-10-01 11:55:03 +00:00
|
|
|
static __inline ALubyte Conv_ALubyte_ALalaw(ALalaw val)
|
|
|
|
{ return Conv_ALubyte_ALshort(DecodeALaw(val)); }
|
2011-04-27 01:17:50 +00:00
|
|
|
static __inline ALubyte Conv_ALubyte_ALbyte3(ALbyte3 val)
|
|
|
|
{ return (DecodeByte3(val)>>16)+128; }
|
|
|
|
static __inline ALubyte Conv_ALubyte_ALubyte3(ALubyte3 val)
|
|
|
|
{ return DecodeUByte3(val)>>16; }
|
2010-11-28 04:33:37 +00:00
|
|
|
|
|
|
|
static __inline ALshort Conv_ALshort_ALbyte(ALbyte val)
|
|
|
|
{ return val<<8; }
|
|
|
|
static __inline ALshort Conv_ALshort_ALubyte(ALubyte val)
|
|
|
|
{ return (val-128)<<8; }
|
|
|
|
static __inline ALshort Conv_ALshort_ALshort(ALshort val)
|
|
|
|
{ return val; }
|
|
|
|
static __inline ALshort Conv_ALshort_ALushort(ALushort val)
|
2010-12-10 01:37:57 +00:00
|
|
|
{ return val-32768; }
|
2010-11-30 01:00:22 +00:00
|
|
|
static __inline ALshort Conv_ALshort_ALint(ALint val)
|
|
|
|
{ return val>>16; }
|
|
|
|
static __inline ALshort Conv_ALshort_ALuint(ALuint val)
|
|
|
|
{ return (val>>16)-32768; }
|
2010-11-28 04:33:37 +00:00
|
|
|
static __inline ALshort Conv_ALshort_ALfloat(ALfloat val)
|
|
|
|
{
|
2010-12-09 13:06:29 +00:00
|
|
|
if(val > 1.0f) return 32767;
|
|
|
|
if(val < -1.0f) return -32768;
|
2010-11-28 04:33:37 +00:00
|
|
|
return (ALint)(val * 32767.0f);
|
|
|
|
}
|
|
|
|
static __inline ALshort Conv_ALshort_ALdouble(ALdouble val)
|
|
|
|
{
|
2010-12-09 13:06:29 +00:00
|
|
|
if(val > 1.0) return 32767;
|
|
|
|
if(val < -1.0) return -32768;
|
2010-11-28 04:33:37 +00:00
|
|
|
return (ALint)(val * 32767.0);
|
|
|
|
}
|
2010-11-28 06:00:24 +00:00
|
|
|
static __inline ALshort Conv_ALshort_ALmulaw(ALmulaw val)
|
2010-11-30 09:26:43 +00:00
|
|
|
{ return Conv_ALshort_ALshort(DecodeMuLaw(val)); }
|
2011-10-01 11:55:03 +00:00
|
|
|
static __inline ALshort Conv_ALshort_ALalaw(ALalaw val)
|
|
|
|
{ return Conv_ALshort_ALshort(DecodeALaw(val)); }
|
2011-04-27 01:17:50 +00:00
|
|
|
static __inline ALshort Conv_ALshort_ALbyte3(ALbyte3 val)
|
|
|
|
{ return DecodeByte3(val)>>8; }
|
|
|
|
static __inline ALshort Conv_ALshort_ALubyte3(ALubyte3 val)
|
|
|
|
{ return (DecodeUByte3(val)>>8)-32768; }
|
2010-11-28 04:33:37 +00:00
|
|
|
|
|
|
|
static __inline ALushort Conv_ALushort_ALbyte(ALbyte val)
|
|
|
|
{ return (val+128)<<8; }
|
|
|
|
static __inline ALushort Conv_ALushort_ALubyte(ALubyte val)
|
|
|
|
{ return val<<8; }
|
|
|
|
static __inline ALushort Conv_ALushort_ALshort(ALshort val)
|
2010-12-10 01:37:57 +00:00
|
|
|
{ return val+32768; }
|
2010-11-28 04:33:37 +00:00
|
|
|
static __inline ALushort Conv_ALushort_ALushort(ALushort val)
|
|
|
|
{ return val; }
|
2010-11-30 01:00:22 +00:00
|
|
|
static __inline ALushort Conv_ALushort_ALint(ALint val)
|
|
|
|
{ return (val>>16)+32768; }
|
|
|
|
static __inline ALushort Conv_ALushort_ALuint(ALuint val)
|
|
|
|
{ return val>>16; }
|
2010-11-28 04:33:37 +00:00
|
|
|
static __inline ALushort Conv_ALushort_ALfloat(ALfloat val)
|
|
|
|
{
|
2010-12-09 13:06:29 +00:00
|
|
|
if(val > 1.0f) return 65535;
|
|
|
|
if(val < -1.0f) return 0;
|
2010-11-28 04:33:37 +00:00
|
|
|
return (ALint)(val * 32767.0f) + 32768;
|
|
|
|
}
|
|
|
|
static __inline ALushort Conv_ALushort_ALdouble(ALdouble val)
|
|
|
|
{
|
2010-12-09 13:06:29 +00:00
|
|
|
if(val > 1.0) return 65535;
|
|
|
|
if(val < -1.0) return 0;
|
2010-11-28 04:33:37 +00:00
|
|
|
return (ALint)(val * 32767.0) + 32768;
|
|
|
|
}
|
2010-11-28 06:00:24 +00:00
|
|
|
static __inline ALushort Conv_ALushort_ALmulaw(ALmulaw val)
|
2010-11-30 09:26:43 +00:00
|
|
|
{ return Conv_ALushort_ALshort(DecodeMuLaw(val)); }
|
2011-10-01 11:55:03 +00:00
|
|
|
static __inline ALushort Conv_ALushort_ALalaw(ALalaw val)
|
|
|
|
{ return Conv_ALushort_ALshort(DecodeALaw(val)); }
|
2011-04-27 01:17:50 +00:00
|
|
|
static __inline ALushort Conv_ALushort_ALbyte3(ALbyte3 val)
|
|
|
|
{ return (DecodeByte3(val)>>8)+32768; }
|
|
|
|
static __inline ALushort Conv_ALushort_ALubyte3(ALubyte3 val)
|
|
|
|
{ return DecodeUByte3(val)>>8; }
|
2010-11-28 04:33:37 +00:00
|
|
|
|
2010-11-30 01:00:22 +00:00
|
|
|
static __inline ALint Conv_ALint_ALbyte(ALbyte val)
|
|
|
|
{ return val<<24; }
|
|
|
|
static __inline ALint Conv_ALint_ALubyte(ALubyte val)
|
|
|
|
{ return (val-128)<<24; }
|
|
|
|
static __inline ALint Conv_ALint_ALshort(ALshort val)
|
|
|
|
{ return val<<16; }
|
|
|
|
static __inline ALint Conv_ALint_ALushort(ALushort val)
|
|
|
|
{ return (val-32768)<<16; }
|
|
|
|
static __inline ALint Conv_ALint_ALint(ALint val)
|
|
|
|
{ return val; }
|
|
|
|
static __inline ALint Conv_ALint_ALuint(ALuint val)
|
2010-12-10 01:37:57 +00:00
|
|
|
{ return val-2147483648u; }
|
2010-11-30 01:00:22 +00:00
|
|
|
static __inline ALint Conv_ALint_ALfloat(ALfloat val)
|
|
|
|
{
|
2010-12-09 13:06:29 +00:00
|
|
|
if(val > 1.0f) return 2147483647;
|
2010-12-10 06:47:06 +00:00
|
|
|
if(val < -1.0f) return -2147483647-1;
|
2010-11-30 01:00:22 +00:00
|
|
|
return (ALint)(val * 2147483647.0);
|
|
|
|
}
|
|
|
|
static __inline ALint Conv_ALint_ALdouble(ALdouble val)
|
|
|
|
{
|
2010-12-09 13:06:29 +00:00
|
|
|
if(val > 1.0) return 2147483647;
|
2010-12-10 06:47:06 +00:00
|
|
|
if(val < -1.0) return -2147483647-1;
|
2010-11-30 01:00:22 +00:00
|
|
|
return (ALint)(val * 2147483647.0);
|
|
|
|
}
|
|
|
|
static __inline ALint Conv_ALint_ALmulaw(ALmulaw val)
|
2010-11-30 09:26:43 +00:00
|
|
|
{ return Conv_ALint_ALshort(DecodeMuLaw(val)); }
|
2011-10-01 11:55:03 +00:00
|
|
|
static __inline ALint Conv_ALint_ALalaw(ALalaw val)
|
|
|
|
{ return Conv_ALint_ALshort(DecodeALaw(val)); }
|
2011-04-27 01:17:50 +00:00
|
|
|
static __inline ALint Conv_ALint_ALbyte3(ALbyte3 val)
|
|
|
|
{ return DecodeByte3(val)<<8; }
|
|
|
|
static __inline ALint Conv_ALint_ALubyte3(ALubyte3 val)
|
|
|
|
{ return (DecodeUByte3(val)-8388608)<<8; }
|
2010-11-30 01:00:22 +00:00
|
|
|
|
|
|
|
static __inline ALuint Conv_ALuint_ALbyte(ALbyte val)
|
|
|
|
{ return (val+128)<<24; }
|
|
|
|
static __inline ALuint Conv_ALuint_ALubyte(ALubyte val)
|
|
|
|
{ return val<<24; }
|
|
|
|
static __inline ALuint Conv_ALuint_ALshort(ALshort val)
|
|
|
|
{ return (val+32768)<<16; }
|
|
|
|
static __inline ALuint Conv_ALuint_ALushort(ALushort val)
|
|
|
|
{ return val<<16; }
|
|
|
|
static __inline ALuint Conv_ALuint_ALint(ALint val)
|
2010-12-10 01:37:57 +00:00
|
|
|
{ return val+2147483648u; }
|
2010-11-30 01:00:22 +00:00
|
|
|
static __inline ALuint Conv_ALuint_ALuint(ALuint val)
|
|
|
|
{ return val; }
|
|
|
|
static __inline ALuint Conv_ALuint_ALfloat(ALfloat val)
|
|
|
|
{
|
2010-12-09 13:06:29 +00:00
|
|
|
if(val > 1.0f) return 4294967295u;
|
|
|
|
if(val < -1.0f) return 0;
|
2010-11-30 01:00:22 +00:00
|
|
|
return (ALint)(val * 2147483647.0) + 2147483648u;
|
|
|
|
}
|
|
|
|
static __inline ALuint Conv_ALuint_ALdouble(ALdouble val)
|
|
|
|
{
|
2010-12-09 13:06:29 +00:00
|
|
|
if(val > 1.0) return 4294967295u;
|
|
|
|
if(val < -1.0) return 0;
|
2010-11-30 01:00:22 +00:00
|
|
|
return (ALint)(val * 2147483647.0) + 2147483648u;
|
|
|
|
}
|
|
|
|
static __inline ALuint Conv_ALuint_ALmulaw(ALmulaw val)
|
2010-11-30 09:26:43 +00:00
|
|
|
{ return Conv_ALuint_ALshort(DecodeMuLaw(val)); }
|
2011-10-01 11:55:03 +00:00
|
|
|
static __inline ALuint Conv_ALuint_ALalaw(ALalaw val)
|
|
|
|
{ return Conv_ALuint_ALshort(DecodeALaw(val)); }
|
2011-04-27 01:17:50 +00:00
|
|
|
static __inline ALuint Conv_ALuint_ALbyte3(ALbyte3 val)
|
|
|
|
{ return (DecodeByte3(val)+8388608)<<8; }
|
|
|
|
static __inline ALuint Conv_ALuint_ALubyte3(ALubyte3 val)
|
|
|
|
{ return DecodeUByte3(val)<<8; }
|
2010-11-30 01:00:22 +00:00
|
|
|
|
2010-11-28 04:33:37 +00:00
|
|
|
static __inline ALfloat Conv_ALfloat_ALbyte(ALbyte val)
|
|
|
|
{ return val * (1.0f/127.0f); }
|
|
|
|
static __inline ALfloat Conv_ALfloat_ALubyte(ALubyte val)
|
|
|
|
{ return (val-128) * (1.0f/127.0f); }
|
|
|
|
static __inline ALfloat Conv_ALfloat_ALshort(ALshort val)
|
|
|
|
{ return val * (1.0f/32767.0f); }
|
|
|
|
static __inline ALfloat Conv_ALfloat_ALushort(ALushort val)
|
|
|
|
{ return (val-32768) * (1.0f/32767.0f); }
|
2010-11-30 01:00:22 +00:00
|
|
|
static __inline ALfloat Conv_ALfloat_ALint(ALint val)
|
2011-09-22 07:35:08 +00:00
|
|
|
{ return (ALfloat)(val * (1.0/2147483647.0)); }
|
2010-11-30 01:00:22 +00:00
|
|
|
static __inline ALfloat Conv_ALfloat_ALuint(ALuint val)
|
2011-09-22 07:35:08 +00:00
|
|
|
{ return (ALfloat)((ALint)(val-2147483648u) * (1.0/2147483647.0)); }
|
2010-11-28 04:33:37 +00:00
|
|
|
static __inline ALfloat Conv_ALfloat_ALfloat(ALfloat val)
|
2011-03-05 00:18:03 +00:00
|
|
|
{ return (val==val) ? val : 0.0f; }
|
2010-11-28 04:33:37 +00:00
|
|
|
static __inline ALfloat Conv_ALfloat_ALdouble(ALdouble val)
|
2011-09-22 07:35:08 +00:00
|
|
|
{ return (val==val) ? (ALfloat)val : 0.0f; }
|
2010-11-28 06:00:24 +00:00
|
|
|
static __inline ALfloat Conv_ALfloat_ALmulaw(ALmulaw val)
|
2010-11-30 09:26:43 +00:00
|
|
|
{ return Conv_ALfloat_ALshort(DecodeMuLaw(val)); }
|
2011-10-01 11:55:03 +00:00
|
|
|
static __inline ALfloat Conv_ALfloat_ALalaw(ALalaw val)
|
|
|
|
{ return Conv_ALfloat_ALshort(DecodeALaw(val)); }
|
2011-04-27 01:17:50 +00:00
|
|
|
static __inline ALfloat Conv_ALfloat_ALbyte3(ALbyte3 val)
|
2011-09-22 07:35:08 +00:00
|
|
|
{ return (ALfloat)(DecodeByte3(val) * (1.0/8388607.0)); }
|
2011-04-27 01:17:50 +00:00
|
|
|
static __inline ALfloat Conv_ALfloat_ALubyte3(ALubyte3 val)
|
2011-09-22 07:35:08 +00:00
|
|
|
{ return (ALfloat)((DecodeUByte3(val)-8388608) * (1.0/8388607.0)); }
|
2010-11-28 04:33:37 +00:00
|
|
|
|
|
|
|
static __inline ALdouble Conv_ALdouble_ALbyte(ALbyte val)
|
|
|
|
{ return val * (1.0/127.0); }
|
|
|
|
static __inline ALdouble Conv_ALdouble_ALubyte(ALubyte val)
|
|
|
|
{ return (val-128) * (1.0/127.0); }
|
|
|
|
static __inline ALdouble Conv_ALdouble_ALshort(ALshort val)
|
|
|
|
{ return val * (1.0/32767.0); }
|
|
|
|
static __inline ALdouble Conv_ALdouble_ALushort(ALushort val)
|
|
|
|
{ return (val-32768) * (1.0/32767.0); }
|
2010-11-30 01:00:22 +00:00
|
|
|
static __inline ALdouble Conv_ALdouble_ALint(ALint val)
|
2010-11-30 20:26:37 +00:00
|
|
|
{ return val * (1.0/2147483647.0); }
|
2010-11-30 01:00:22 +00:00
|
|
|
static __inline ALdouble Conv_ALdouble_ALuint(ALuint val)
|
|
|
|
{ return (ALint)(val-2147483648u) * (1.0/2147483647.0); }
|
2010-11-28 04:33:37 +00:00
|
|
|
static __inline ALdouble Conv_ALdouble_ALfloat(ALfloat val)
|
2011-03-05 00:18:03 +00:00
|
|
|
{ return (val==val) ? val : 0.0f; }
|
2010-11-28 04:33:37 +00:00
|
|
|
static __inline ALdouble Conv_ALdouble_ALdouble(ALdouble val)
|
2011-03-05 00:18:03 +00:00
|
|
|
{ return (val==val) ? val : 0.0; }
|
2010-11-28 06:00:24 +00:00
|
|
|
static __inline ALdouble Conv_ALdouble_ALmulaw(ALmulaw val)
|
2010-11-30 09:26:43 +00:00
|
|
|
{ return Conv_ALdouble_ALshort(DecodeMuLaw(val)); }
|
2011-10-01 11:55:03 +00:00
|
|
|
static __inline ALdouble Conv_ALdouble_ALalaw(ALalaw val)
|
|
|
|
{ return Conv_ALdouble_ALshort(DecodeALaw(val)); }
|
2011-04-27 01:17:50 +00:00
|
|
|
static __inline ALdouble Conv_ALdouble_ALbyte3(ALbyte3 val)
|
2011-04-28 02:26:27 +00:00
|
|
|
{ return DecodeByte3(val) * (1.0/8388607.0); }
|
2011-04-27 01:17:50 +00:00
|
|
|
static __inline ALdouble Conv_ALdouble_ALubyte3(ALubyte3 val)
|
2011-04-28 02:26:27 +00:00
|
|
|
{ return (DecodeUByte3(val)-8388608) * (1.0/8388607.0); }
|
2010-11-28 04:33:37 +00:00
|
|
|
|
2010-11-30 09:20:40 +00:00
|
|
|
#define DECL_TEMPLATE(T) \
|
2010-12-01 02:06:54 +00:00
|
|
|
static __inline ALmulaw Conv_ALmulaw_##T(T val) \
|
2010-11-30 09:20:40 +00:00
|
|
|
{ return EncodeMuLaw(Conv_ALshort_##T(val)); }
|
|
|
|
|
|
|
|
DECL_TEMPLATE(ALbyte)
|
|
|
|
DECL_TEMPLATE(ALubyte)
|
|
|
|
DECL_TEMPLATE(ALshort)
|
|
|
|
DECL_TEMPLATE(ALushort)
|
|
|
|
DECL_TEMPLATE(ALint)
|
|
|
|
DECL_TEMPLATE(ALuint)
|
|
|
|
DECL_TEMPLATE(ALfloat)
|
|
|
|
DECL_TEMPLATE(ALdouble)
|
2010-12-10 01:37:57 +00:00
|
|
|
static __inline ALmulaw Conv_ALmulaw_ALmulaw(ALmulaw val)
|
|
|
|
{ return val; }
|
2011-10-01 11:55:03 +00:00
|
|
|
DECL_TEMPLATE(ALalaw)
|
|
|
|
DECL_TEMPLATE(ALbyte3)
|
|
|
|
DECL_TEMPLATE(ALubyte3)
|
|
|
|
|
|
|
|
#undef DECL_TEMPLATE
|
|
|
|
|
|
|
|
#define DECL_TEMPLATE(T) \
|
|
|
|
static __inline ALalaw Conv_ALalaw_##T(T val) \
|
|
|
|
{ return EncodeALaw(Conv_ALshort_##T(val)); }
|
|
|
|
|
|
|
|
DECL_TEMPLATE(ALbyte)
|
|
|
|
DECL_TEMPLATE(ALubyte)
|
|
|
|
DECL_TEMPLATE(ALshort)
|
|
|
|
DECL_TEMPLATE(ALushort)
|
|
|
|
DECL_TEMPLATE(ALint)
|
|
|
|
DECL_TEMPLATE(ALuint)
|
|
|
|
DECL_TEMPLATE(ALfloat)
|
|
|
|
DECL_TEMPLATE(ALdouble)
|
|
|
|
DECL_TEMPLATE(ALmulaw)
|
|
|
|
static __inline ALalaw Conv_ALalaw_ALalaw(ALalaw val)
|
|
|
|
{ return val; }
|
2011-04-27 01:17:50 +00:00
|
|
|
DECL_TEMPLATE(ALbyte3)
|
|
|
|
DECL_TEMPLATE(ALubyte3)
|
2010-11-30 09:20:40 +00:00
|
|
|
|
|
|
|
#undef DECL_TEMPLATE
|
2010-11-28 04:33:37 +00:00
|
|
|
|
2011-04-27 01:17:50 +00:00
|
|
|
#define DECL_TEMPLATE(T) \
|
|
|
|
static __inline ALbyte3 Conv_ALbyte3_##T(T val) \
|
|
|
|
{ return EncodeByte3(Conv_ALint_##T(val)>>8); }
|
|
|
|
|
|
|
|
DECL_TEMPLATE(ALbyte)
|
|
|
|
DECL_TEMPLATE(ALubyte)
|
|
|
|
DECL_TEMPLATE(ALshort)
|
|
|
|
DECL_TEMPLATE(ALushort)
|
|
|
|
DECL_TEMPLATE(ALint)
|
|
|
|
DECL_TEMPLATE(ALuint)
|
|
|
|
DECL_TEMPLATE(ALfloat)
|
|
|
|
DECL_TEMPLATE(ALdouble)
|
|
|
|
DECL_TEMPLATE(ALmulaw)
|
2011-10-01 11:55:03 +00:00
|
|
|
DECL_TEMPLATE(ALalaw)
|
2011-04-27 01:17:50 +00:00
|
|
|
static __inline ALbyte3 Conv_ALbyte3_ALbyte3(ALbyte3 val)
|
|
|
|
{ return val; }
|
|
|
|
DECL_TEMPLATE(ALubyte3)
|
|
|
|
|
|
|
|
#undef DECL_TEMPLATE
|
|
|
|
|
|
|
|
#define DECL_TEMPLATE(T) \
|
|
|
|
static __inline ALubyte3 Conv_ALubyte3_##T(T val) \
|
|
|
|
{ return EncodeUByte3(Conv_ALuint_##T(val)>>8); }
|
|
|
|
|
|
|
|
DECL_TEMPLATE(ALbyte)
|
|
|
|
DECL_TEMPLATE(ALubyte)
|
|
|
|
DECL_TEMPLATE(ALshort)
|
|
|
|
DECL_TEMPLATE(ALushort)
|
|
|
|
DECL_TEMPLATE(ALint)
|
|
|
|
DECL_TEMPLATE(ALuint)
|
|
|
|
DECL_TEMPLATE(ALfloat)
|
|
|
|
DECL_TEMPLATE(ALdouble)
|
|
|
|
DECL_TEMPLATE(ALmulaw)
|
2011-10-01 11:55:03 +00:00
|
|
|
DECL_TEMPLATE(ALalaw)
|
2011-04-27 01:17:50 +00:00
|
|
|
DECL_TEMPLATE(ALbyte3)
|
|
|
|
static __inline ALubyte3 Conv_ALubyte3_ALubyte3(ALubyte3 val)
|
|
|
|
{ return val; }
|
|
|
|
|
|
|
|
#undef DECL_TEMPLATE
|
|
|
|
|
|
|
|
|
2010-11-28 04:33:37 +00:00
|
|
|
#define DECL_TEMPLATE(T1, T2) \
|
2011-03-19 19:40:14 +00:00
|
|
|
static void Convert_##T1##_##T2(T1 *dst, const T2 *src, ALuint numchans, \
|
|
|
|
ALuint len) \
|
2010-11-28 04:33:37 +00:00
|
|
|
{ \
|
2011-03-19 19:40:14 +00:00
|
|
|
ALuint i, j; \
|
2010-11-28 04:33:37 +00:00
|
|
|
for(i = 0;i < len;i++) \
|
2011-03-19 19:40:14 +00:00
|
|
|
{ \
|
|
|
|
for(j = 0;j < numchans;j++) \
|
|
|
|
*(dst++) = Conv_##T1##_##T2(*(src++)); \
|
|
|
|
} \
|
2010-11-28 04:33:37 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
DECL_TEMPLATE(ALbyte, ALbyte)
|
|
|
|
DECL_TEMPLATE(ALbyte, ALubyte)
|
|
|
|
DECL_TEMPLATE(ALbyte, ALshort)
|
|
|
|
DECL_TEMPLATE(ALbyte, ALushort)
|
2010-11-30 01:00:22 +00:00
|
|
|
DECL_TEMPLATE(ALbyte, ALint)
|
|
|
|
DECL_TEMPLATE(ALbyte, ALuint)
|
2010-11-28 04:33:37 +00:00
|
|
|
DECL_TEMPLATE(ALbyte, ALfloat)
|
|
|
|
DECL_TEMPLATE(ALbyte, ALdouble)
|
2010-11-28 06:00:24 +00:00
|
|
|
DECL_TEMPLATE(ALbyte, ALmulaw)
|
2011-10-01 11:55:03 +00:00
|
|
|
DECL_TEMPLATE(ALbyte, ALalaw)
|
2011-04-27 01:17:50 +00:00
|
|
|
DECL_TEMPLATE(ALbyte, ALbyte3)
|
|
|
|
DECL_TEMPLATE(ALbyte, ALubyte3)
|
2010-11-28 06:00:24 +00:00
|
|
|
|
|
|
|
DECL_TEMPLATE(ALubyte, ALbyte)
|
|
|
|
DECL_TEMPLATE(ALubyte, ALubyte)
|
|
|
|
DECL_TEMPLATE(ALubyte, ALshort)
|
|
|
|
DECL_TEMPLATE(ALubyte, ALushort)
|
2010-11-30 01:00:22 +00:00
|
|
|
DECL_TEMPLATE(ALubyte, ALint)
|
|
|
|
DECL_TEMPLATE(ALubyte, ALuint)
|
2010-11-28 06:00:24 +00:00
|
|
|
DECL_TEMPLATE(ALubyte, ALfloat)
|
|
|
|
DECL_TEMPLATE(ALubyte, ALdouble)
|
|
|
|
DECL_TEMPLATE(ALubyte, ALmulaw)
|
2011-10-01 11:55:03 +00:00
|
|
|
DECL_TEMPLATE(ALubyte, ALalaw)
|
2011-04-27 01:17:50 +00:00
|
|
|
DECL_TEMPLATE(ALubyte, ALbyte3)
|
|
|
|
DECL_TEMPLATE(ALubyte, ALubyte3)
|
2010-11-28 04:33:37 +00:00
|
|
|
|
|
|
|
DECL_TEMPLATE(ALshort, ALbyte)
|
|
|
|
DECL_TEMPLATE(ALshort, ALubyte)
|
|
|
|
DECL_TEMPLATE(ALshort, ALshort)
|
|
|
|
DECL_TEMPLATE(ALshort, ALushort)
|
2010-11-30 01:00:22 +00:00
|
|
|
DECL_TEMPLATE(ALshort, ALint)
|
|
|
|
DECL_TEMPLATE(ALshort, ALuint)
|
2010-11-28 04:33:37 +00:00
|
|
|
DECL_TEMPLATE(ALshort, ALfloat)
|
|
|
|
DECL_TEMPLATE(ALshort, ALdouble)
|
2010-11-28 06:00:24 +00:00
|
|
|
DECL_TEMPLATE(ALshort, ALmulaw)
|
2011-10-01 11:55:03 +00:00
|
|
|
DECL_TEMPLATE(ALshort, ALalaw)
|
2011-04-27 01:17:50 +00:00
|
|
|
DECL_TEMPLATE(ALshort, ALbyte3)
|
|
|
|
DECL_TEMPLATE(ALshort, ALubyte3)
|
2010-11-28 04:33:37 +00:00
|
|
|
|
|
|
|
DECL_TEMPLATE(ALushort, ALbyte)
|
|
|
|
DECL_TEMPLATE(ALushort, ALubyte)
|
|
|
|
DECL_TEMPLATE(ALushort, ALshort)
|
|
|
|
DECL_TEMPLATE(ALushort, ALushort)
|
2010-11-30 01:00:22 +00:00
|
|
|
DECL_TEMPLATE(ALushort, ALint)
|
|
|
|
DECL_TEMPLATE(ALushort, ALuint)
|
2010-11-28 04:33:37 +00:00
|
|
|
DECL_TEMPLATE(ALushort, ALfloat)
|
|
|
|
DECL_TEMPLATE(ALushort, ALdouble)
|
2010-11-28 06:00:24 +00:00
|
|
|
DECL_TEMPLATE(ALushort, ALmulaw)
|
2011-10-01 11:55:03 +00:00
|
|
|
DECL_TEMPLATE(ALushort, ALalaw)
|
2011-04-27 01:17:50 +00:00
|
|
|
DECL_TEMPLATE(ALushort, ALbyte3)
|
|
|
|
DECL_TEMPLATE(ALushort, ALubyte3)
|
2010-11-28 04:33:37 +00:00
|
|
|
|
2010-11-30 01:00:22 +00:00
|
|
|
DECL_TEMPLATE(ALint, ALbyte)
|
|
|
|
DECL_TEMPLATE(ALint, ALubyte)
|
|
|
|
DECL_TEMPLATE(ALint, ALshort)
|
|
|
|
DECL_TEMPLATE(ALint, ALushort)
|
|
|
|
DECL_TEMPLATE(ALint, ALint)
|
|
|
|
DECL_TEMPLATE(ALint, ALuint)
|
|
|
|
DECL_TEMPLATE(ALint, ALfloat)
|
|
|
|
DECL_TEMPLATE(ALint, ALdouble)
|
|
|
|
DECL_TEMPLATE(ALint, ALmulaw)
|
2011-10-01 11:55:03 +00:00
|
|
|
DECL_TEMPLATE(ALint, ALalaw)
|
2011-04-27 01:17:50 +00:00
|
|
|
DECL_TEMPLATE(ALint, ALbyte3)
|
|
|
|
DECL_TEMPLATE(ALint, ALubyte3)
|
2010-11-30 01:00:22 +00:00
|
|
|
|
|
|
|
DECL_TEMPLATE(ALuint, ALbyte)
|
|
|
|
DECL_TEMPLATE(ALuint, ALubyte)
|
|
|
|
DECL_TEMPLATE(ALuint, ALshort)
|
|
|
|
DECL_TEMPLATE(ALuint, ALushort)
|
|
|
|
DECL_TEMPLATE(ALuint, ALint)
|
|
|
|
DECL_TEMPLATE(ALuint, ALuint)
|
|
|
|
DECL_TEMPLATE(ALuint, ALfloat)
|
|
|
|
DECL_TEMPLATE(ALuint, ALdouble)
|
|
|
|
DECL_TEMPLATE(ALuint, ALmulaw)
|
2011-10-01 11:55:03 +00:00
|
|
|
DECL_TEMPLATE(ALuint, ALalaw)
|
2011-04-27 01:17:50 +00:00
|
|
|
DECL_TEMPLATE(ALuint, ALbyte3)
|
|
|
|
DECL_TEMPLATE(ALuint, ALubyte3)
|
2010-11-30 01:00:22 +00:00
|
|
|
|
2010-11-28 04:33:37 +00:00
|
|
|
DECL_TEMPLATE(ALfloat, ALbyte)
|
|
|
|
DECL_TEMPLATE(ALfloat, ALubyte)
|
|
|
|
DECL_TEMPLATE(ALfloat, ALshort)
|
|
|
|
DECL_TEMPLATE(ALfloat, ALushort)
|
2010-11-30 01:00:22 +00:00
|
|
|
DECL_TEMPLATE(ALfloat, ALint)
|
|
|
|
DECL_TEMPLATE(ALfloat, ALuint)
|
2010-11-28 04:33:37 +00:00
|
|
|
DECL_TEMPLATE(ALfloat, ALfloat)
|
|
|
|
DECL_TEMPLATE(ALfloat, ALdouble)
|
2010-11-28 06:00:24 +00:00
|
|
|
DECL_TEMPLATE(ALfloat, ALmulaw)
|
2011-10-01 11:55:03 +00:00
|
|
|
DECL_TEMPLATE(ALfloat, ALalaw)
|
2011-04-27 01:17:50 +00:00
|
|
|
DECL_TEMPLATE(ALfloat, ALbyte3)
|
|
|
|
DECL_TEMPLATE(ALfloat, ALubyte3)
|
2010-11-28 04:33:37 +00:00
|
|
|
|
|
|
|
DECL_TEMPLATE(ALdouble, ALbyte)
|
|
|
|
DECL_TEMPLATE(ALdouble, ALubyte)
|
|
|
|
DECL_TEMPLATE(ALdouble, ALshort)
|
|
|
|
DECL_TEMPLATE(ALdouble, ALushort)
|
2010-11-30 01:00:22 +00:00
|
|
|
DECL_TEMPLATE(ALdouble, ALint)
|
|
|
|
DECL_TEMPLATE(ALdouble, ALuint)
|
2010-11-28 04:33:37 +00:00
|
|
|
DECL_TEMPLATE(ALdouble, ALfloat)
|
|
|
|
DECL_TEMPLATE(ALdouble, ALdouble)
|
2010-11-28 06:00:24 +00:00
|
|
|
DECL_TEMPLATE(ALdouble, ALmulaw)
|
2011-10-01 11:55:03 +00:00
|
|
|
DECL_TEMPLATE(ALdouble, ALalaw)
|
2011-04-27 01:17:50 +00:00
|
|
|
DECL_TEMPLATE(ALdouble, ALbyte3)
|
|
|
|
DECL_TEMPLATE(ALdouble, ALubyte3)
|
2010-11-28 04:33:37 +00:00
|
|
|
|
2010-11-30 09:20:40 +00:00
|
|
|
DECL_TEMPLATE(ALmulaw, ALbyte)
|
|
|
|
DECL_TEMPLATE(ALmulaw, ALubyte)
|
|
|
|
DECL_TEMPLATE(ALmulaw, ALshort)
|
|
|
|
DECL_TEMPLATE(ALmulaw, ALushort)
|
|
|
|
DECL_TEMPLATE(ALmulaw, ALint)
|
|
|
|
DECL_TEMPLATE(ALmulaw, ALuint)
|
|
|
|
DECL_TEMPLATE(ALmulaw, ALfloat)
|
|
|
|
DECL_TEMPLATE(ALmulaw, ALdouble)
|
|
|
|
DECL_TEMPLATE(ALmulaw, ALmulaw)
|
2011-10-01 11:55:03 +00:00
|
|
|
DECL_TEMPLATE(ALmulaw, ALalaw)
|
2011-04-27 01:17:50 +00:00
|
|
|
DECL_TEMPLATE(ALmulaw, ALbyte3)
|
|
|
|
DECL_TEMPLATE(ALmulaw, ALubyte3)
|
|
|
|
|
2011-10-01 11:55:03 +00:00
|
|
|
DECL_TEMPLATE(ALalaw, ALbyte)
|
|
|
|
DECL_TEMPLATE(ALalaw, ALubyte)
|
|
|
|
DECL_TEMPLATE(ALalaw, ALshort)
|
|
|
|
DECL_TEMPLATE(ALalaw, ALushort)
|
|
|
|
DECL_TEMPLATE(ALalaw, ALint)
|
|
|
|
DECL_TEMPLATE(ALalaw, ALuint)
|
|
|
|
DECL_TEMPLATE(ALalaw, ALfloat)
|
|
|
|
DECL_TEMPLATE(ALalaw, ALdouble)
|
|
|
|
DECL_TEMPLATE(ALalaw, ALmulaw)
|
|
|
|
DECL_TEMPLATE(ALalaw, ALalaw)
|
|
|
|
DECL_TEMPLATE(ALalaw, ALbyte3)
|
|
|
|
DECL_TEMPLATE(ALalaw, ALubyte3)
|
|
|
|
|
2011-04-27 01:17:50 +00:00
|
|
|
DECL_TEMPLATE(ALbyte3, ALbyte)
|
|
|
|
DECL_TEMPLATE(ALbyte3, ALubyte)
|
|
|
|
DECL_TEMPLATE(ALbyte3, ALshort)
|
|
|
|
DECL_TEMPLATE(ALbyte3, ALushort)
|
|
|
|
DECL_TEMPLATE(ALbyte3, ALint)
|
|
|
|
DECL_TEMPLATE(ALbyte3, ALuint)
|
|
|
|
DECL_TEMPLATE(ALbyte3, ALfloat)
|
|
|
|
DECL_TEMPLATE(ALbyte3, ALdouble)
|
|
|
|
DECL_TEMPLATE(ALbyte3, ALmulaw)
|
2011-10-01 11:55:03 +00:00
|
|
|
DECL_TEMPLATE(ALbyte3, ALalaw)
|
2011-04-27 01:17:50 +00:00
|
|
|
DECL_TEMPLATE(ALbyte3, ALbyte3)
|
|
|
|
DECL_TEMPLATE(ALbyte3, ALubyte3)
|
|
|
|
|
|
|
|
DECL_TEMPLATE(ALubyte3, ALbyte)
|
|
|
|
DECL_TEMPLATE(ALubyte3, ALubyte)
|
|
|
|
DECL_TEMPLATE(ALubyte3, ALshort)
|
|
|
|
DECL_TEMPLATE(ALubyte3, ALushort)
|
|
|
|
DECL_TEMPLATE(ALubyte3, ALint)
|
|
|
|
DECL_TEMPLATE(ALubyte3, ALuint)
|
|
|
|
DECL_TEMPLATE(ALubyte3, ALfloat)
|
|
|
|
DECL_TEMPLATE(ALubyte3, ALdouble)
|
|
|
|
DECL_TEMPLATE(ALubyte3, ALmulaw)
|
2011-10-01 11:55:03 +00:00
|
|
|
DECL_TEMPLATE(ALubyte3, ALalaw)
|
2011-04-27 01:17:50 +00:00
|
|
|
DECL_TEMPLATE(ALubyte3, ALbyte3)
|
|
|
|
DECL_TEMPLATE(ALubyte3, ALubyte3)
|
2010-11-30 09:20:40 +00:00
|
|
|
|
2010-11-28 04:33:37 +00:00
|
|
|
#undef DECL_TEMPLATE
|
|
|
|
|
2010-11-30 06:55:46 +00:00
|
|
|
#define DECL_TEMPLATE(T) \
|
2011-03-21 16:42:03 +00:00
|
|
|
static void Convert_##T##_ALima4(T *dst, const ALima4 *src, ALuint numchans, \
|
2012-01-27 00:49:11 +00:00
|
|
|
ALuint len) \
|
2010-11-30 06:55:46 +00:00
|
|
|
{ \
|
2010-12-02 02:36:07 +00:00
|
|
|
ALshort tmp[65*MAXCHANNELS]; /* Max samples an IMA4 frame can be */ \
|
2012-01-27 00:49:11 +00:00
|
|
|
ALuint i, j, k; \
|
|
|
|
\
|
|
|
|
i = 0; \
|
|
|
|
while(i < len) \
|
2010-11-30 06:55:46 +00:00
|
|
|
{ \
|
2010-11-30 09:00:37 +00:00
|
|
|
DecodeIMA4Block(tmp, src, numchans); \
|
2010-11-30 06:55:46 +00:00
|
|
|
src += 36*numchans; \
|
2012-01-27 00:49:11 +00:00
|
|
|
\
|
|
|
|
for(j = 0;j < 65 && i < len;j++,i++) \
|
|
|
|
{ \
|
|
|
|
for(k = 0;k < numchans;k++) \
|
|
|
|
*(dst++) = Conv_##T##_ALshort(tmp[j*numchans + k]); \
|
|
|
|
} \
|
2010-11-30 06:55:46 +00:00
|
|
|
} \
|
|
|
|
}
|
|
|
|
|
|
|
|
DECL_TEMPLATE(ALbyte)
|
|
|
|
DECL_TEMPLATE(ALubyte)
|
|
|
|
DECL_TEMPLATE(ALshort)
|
|
|
|
DECL_TEMPLATE(ALushort)
|
|
|
|
DECL_TEMPLATE(ALint)
|
|
|
|
DECL_TEMPLATE(ALuint)
|
|
|
|
DECL_TEMPLATE(ALfloat)
|
|
|
|
DECL_TEMPLATE(ALdouble)
|
2010-11-30 09:20:40 +00:00
|
|
|
DECL_TEMPLATE(ALmulaw)
|
2011-10-01 11:55:03 +00:00
|
|
|
DECL_TEMPLATE(ALalaw)
|
2011-04-27 01:17:50 +00:00
|
|
|
DECL_TEMPLATE(ALbyte3)
|
|
|
|
DECL_TEMPLATE(ALubyte3)
|
2010-11-30 06:55:46 +00:00
|
|
|
|
|
|
|
#undef DECL_TEMPLATE
|
|
|
|
|
2010-12-05 11:34:19 +00:00
|
|
|
#define DECL_TEMPLATE(T) \
|
2011-03-21 16:42:03 +00:00
|
|
|
static void Convert_ALima4_##T(ALima4 *dst, const T *src, ALuint numchans, \
|
2012-01-27 00:49:11 +00:00
|
|
|
ALuint len) \
|
2010-12-05 11:34:19 +00:00
|
|
|
{ \
|
|
|
|
ALshort tmp[65*MAXCHANNELS]; /* Max samples an IMA4 frame can be */ \
|
|
|
|
ALint sample[MAXCHANNELS] = {0,0,0,0,0,0,0,0}; \
|
|
|
|
ALint index[MAXCHANNELS] = {0,0,0,0,0,0,0,0}; \
|
2012-01-27 00:49:11 +00:00
|
|
|
ALuint i, j; \
|
|
|
|
\
|
|
|
|
for(i = 0;i < len;i += 65) \
|
2010-12-05 11:34:19 +00:00
|
|
|
{ \
|
|
|
|
for(j = 0;j < 65*numchans;j++) \
|
|
|
|
tmp[j] = Conv_ALshort_##T(*(src++)); \
|
|
|
|
EncodeIMA4Block(dst, tmp, sample, index, numchans); \
|
|
|
|
dst += 36*numchans; \
|
|
|
|
} \
|
|
|
|
}
|
|
|
|
|
|
|
|
DECL_TEMPLATE(ALbyte)
|
|
|
|
DECL_TEMPLATE(ALubyte)
|
|
|
|
DECL_TEMPLATE(ALshort)
|
|
|
|
DECL_TEMPLATE(ALushort)
|
|
|
|
DECL_TEMPLATE(ALint)
|
|
|
|
DECL_TEMPLATE(ALuint)
|
|
|
|
DECL_TEMPLATE(ALfloat)
|
|
|
|
DECL_TEMPLATE(ALdouble)
|
|
|
|
DECL_TEMPLATE(ALmulaw)
|
2011-10-01 11:55:03 +00:00
|
|
|
DECL_TEMPLATE(ALalaw)
|
2011-03-21 16:42:03 +00:00
|
|
|
static void Convert_ALima4_ALima4(ALima4 *dst, const ALima4 *src,
|
|
|
|
ALuint numchans, ALuint numblocks)
|
|
|
|
{ memcpy(dst, src, numblocks*36*numchans); }
|
2011-04-27 01:17:50 +00:00
|
|
|
DECL_TEMPLATE(ALbyte3)
|
|
|
|
DECL_TEMPLATE(ALubyte3)
|
2010-12-05 11:34:19 +00:00
|
|
|
|
|
|
|
#undef DECL_TEMPLATE
|
|
|
|
|
2010-11-28 04:33:37 +00:00
|
|
|
#define DECL_TEMPLATE(T) \
|
2010-12-04 06:33:41 +00:00
|
|
|
static void Convert_##T(T *dst, const ALvoid *src, enum UserFmtType srcType, \
|
2011-03-16 20:32:57 +00:00
|
|
|
ALsizei numchans, ALsizei len) \
|
2010-11-28 04:33:37 +00:00
|
|
|
{ \
|
|
|
|
switch(srcType) \
|
|
|
|
{ \
|
2010-12-04 06:33:41 +00:00
|
|
|
case UserFmtByte: \
|
2011-03-16 20:32:57 +00:00
|
|
|
Convert_##T##_ALbyte(dst, src, numchans, len); \
|
2010-11-28 04:33:37 +00:00
|
|
|
break; \
|
2010-12-04 06:33:41 +00:00
|
|
|
case UserFmtUByte: \
|
2011-03-16 20:32:57 +00:00
|
|
|
Convert_##T##_ALubyte(dst, src, numchans, len); \
|
2010-11-28 04:33:37 +00:00
|
|
|
break; \
|
2010-12-04 06:33:41 +00:00
|
|
|
case UserFmtShort: \
|
2011-03-16 20:32:57 +00:00
|
|
|
Convert_##T##_ALshort(dst, src, numchans, len); \
|
2010-11-28 04:33:37 +00:00
|
|
|
break; \
|
2010-12-04 06:33:41 +00:00
|
|
|
case UserFmtUShort: \
|
2011-03-16 20:32:57 +00:00
|
|
|
Convert_##T##_ALushort(dst, src, numchans, len); \
|
2010-11-28 04:33:37 +00:00
|
|
|
break; \
|
2010-12-04 06:33:41 +00:00
|
|
|
case UserFmtInt: \
|
2011-03-16 20:32:57 +00:00
|
|
|
Convert_##T##_ALint(dst, src, numchans, len); \
|
2010-11-30 01:00:22 +00:00
|
|
|
break; \
|
2010-12-04 06:33:41 +00:00
|
|
|
case UserFmtUInt: \
|
2011-03-16 20:32:57 +00:00
|
|
|
Convert_##T##_ALuint(dst, src, numchans, len); \
|
2010-11-30 01:00:22 +00:00
|
|
|
break; \
|
2010-12-04 06:33:41 +00:00
|
|
|
case UserFmtFloat: \
|
2011-03-16 20:32:57 +00:00
|
|
|
Convert_##T##_ALfloat(dst, src, numchans, len); \
|
2010-11-28 04:33:37 +00:00
|
|
|
break; \
|
2010-12-04 06:33:41 +00:00
|
|
|
case UserFmtDouble: \
|
2011-03-16 20:32:57 +00:00
|
|
|
Convert_##T##_ALdouble(dst, src, numchans, len); \
|
2010-11-28 04:33:37 +00:00
|
|
|
break; \
|
2010-12-04 06:33:41 +00:00
|
|
|
case UserFmtMulaw: \
|
2011-03-16 20:32:57 +00:00
|
|
|
Convert_##T##_ALmulaw(dst, src, numchans, len); \
|
2010-11-28 06:00:24 +00:00
|
|
|
break; \
|
2011-10-01 11:55:03 +00:00
|
|
|
case UserFmtAlaw: \
|
|
|
|
Convert_##T##_ALalaw(dst, src, numchans, len); \
|
|
|
|
break; \
|
2010-12-04 06:33:41 +00:00
|
|
|
case UserFmtIMA4: \
|
2011-03-21 16:42:03 +00:00
|
|
|
Convert_##T##_ALima4(dst, src, numchans, len); \
|
2011-03-16 20:32:57 +00:00
|
|
|
break; \
|
2011-04-27 01:17:50 +00:00
|
|
|
case UserFmtByte3: \
|
|
|
|
Convert_##T##_ALbyte3(dst, src, numchans, len); \
|
|
|
|
break; \
|
|
|
|
case UserFmtUByte3: \
|
|
|
|
Convert_##T##_ALubyte3(dst, src, numchans, len); \
|
|
|
|
break; \
|
2010-11-28 04:33:37 +00:00
|
|
|
} \
|
|
|
|
}
|
|
|
|
|
|
|
|
DECL_TEMPLATE(ALbyte)
|
|
|
|
DECL_TEMPLATE(ALubyte)
|
|
|
|
DECL_TEMPLATE(ALshort)
|
|
|
|
DECL_TEMPLATE(ALushort)
|
2010-11-30 01:00:22 +00:00
|
|
|
DECL_TEMPLATE(ALint)
|
|
|
|
DECL_TEMPLATE(ALuint)
|
2010-11-28 04:33:37 +00:00
|
|
|
DECL_TEMPLATE(ALfloat)
|
|
|
|
DECL_TEMPLATE(ALdouble)
|
2010-11-30 09:20:40 +00:00
|
|
|
DECL_TEMPLATE(ALmulaw)
|
2011-10-01 11:55:03 +00:00
|
|
|
DECL_TEMPLATE(ALalaw)
|
2011-03-21 16:42:03 +00:00
|
|
|
DECL_TEMPLATE(ALima4)
|
2011-04-27 01:17:50 +00:00
|
|
|
DECL_TEMPLATE(ALbyte3)
|
|
|
|
DECL_TEMPLATE(ALubyte3)
|
2010-11-28 04:33:37 +00:00
|
|
|
|
|
|
|
#undef DECL_TEMPLATE
|
|
|
|
|
|
|
|
|
2011-03-16 20:32:57 +00:00
|
|
|
static void ConvertData(ALvoid *dst, enum UserFmtType dstType, const ALvoid *src, enum UserFmtType srcType, ALsizei numchans, ALsizei len)
|
2010-11-30 06:55:46 +00:00
|
|
|
{
|
|
|
|
switch(dstType)
|
|
|
|
{
|
2011-03-16 20:32:57 +00:00
|
|
|
case UserFmtByte:
|
|
|
|
Convert_ALbyte(dst, src, srcType, numchans, len);
|
2010-11-30 06:55:46 +00:00
|
|
|
break;
|
2011-03-16 20:32:57 +00:00
|
|
|
case UserFmtUByte:
|
|
|
|
Convert_ALubyte(dst, src, srcType, numchans, len);
|
2010-11-30 06:55:46 +00:00
|
|
|
break;
|
2011-03-16 20:32:57 +00:00
|
|
|
case UserFmtShort:
|
|
|
|
Convert_ALshort(dst, src, srcType, numchans, len);
|
2010-11-30 06:55:46 +00:00
|
|
|
break;
|
2011-03-16 20:32:57 +00:00
|
|
|
case UserFmtUShort:
|
|
|
|
Convert_ALushort(dst, src, srcType, numchans, len);
|
2010-11-30 06:55:46 +00:00
|
|
|
break;
|
2011-03-16 20:32:57 +00:00
|
|
|
case UserFmtInt:
|
|
|
|
Convert_ALint(dst, src, srcType, numchans, len);
|
2010-11-30 06:55:46 +00:00
|
|
|
break;
|
2011-03-16 20:32:57 +00:00
|
|
|
case UserFmtUInt:
|
|
|
|
Convert_ALuint(dst, src, srcType, numchans, len);
|
|
|
|
break;
|
|
|
|
case UserFmtFloat:
|
|
|
|
Convert_ALfloat(dst, src, srcType, numchans, len);
|
|
|
|
break;
|
|
|
|
case UserFmtDouble:
|
|
|
|
Convert_ALdouble(dst, src, srcType, numchans, len);
|
|
|
|
break;
|
|
|
|
case UserFmtMulaw:
|
|
|
|
Convert_ALmulaw(dst, src, srcType, numchans, len);
|
|
|
|
break;
|
2011-10-01 11:55:03 +00:00
|
|
|
case UserFmtAlaw:
|
|
|
|
Convert_ALalaw(dst, src, srcType, numchans, len);
|
|
|
|
break;
|
2011-03-16 20:32:57 +00:00
|
|
|
case UserFmtIMA4:
|
2011-03-21 16:42:03 +00:00
|
|
|
Convert_ALima4(dst, src, srcType, numchans, len);
|
2010-11-30 06:55:46 +00:00
|
|
|
break;
|
2011-04-27 01:17:50 +00:00
|
|
|
case UserFmtByte3:
|
|
|
|
Convert_ALbyte3(dst, src, srcType, numchans, len);
|
|
|
|
break;
|
|
|
|
case UserFmtUByte3:
|
|
|
|
Convert_ALubyte3(dst, src, srcType, numchans, len);
|
|
|
|
break;
|
2010-11-30 06:55:46 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2010-11-28 04:33:37 +00:00
|
|
|
/*
|
|
|
|
* LoadData
|
|
|
|
*
|
|
|
|
* Loads the specified data into the buffer, using the specified formats.
|
|
|
|
* Currently, the new format must have the same channel configuration as the
|
2010-11-30 08:28:02 +00:00
|
|
|
* original format.
|
2010-11-28 04:33:37 +00:00
|
|
|
*/
|
2011-03-16 19:24:53 +00:00
|
|
|
static ALenum LoadData(ALbuffer *ALBuf, ALuint freq, ALenum NewFormat, ALsizei frames, enum UserFmtChannels SrcChannels, enum UserFmtType SrcType, const ALvoid *data, ALboolean storesrc)
|
2010-11-28 04:33:37 +00:00
|
|
|
{
|
2010-11-30 08:28:02 +00:00
|
|
|
ALuint NewChannels, NewBytes;
|
2010-11-28 04:33:37 +00:00
|
|
|
enum FmtChannels DstChannels;
|
|
|
|
enum FmtType DstType;
|
|
|
|
ALuint64 newsize;
|
|
|
|
ALvoid *temp;
|
|
|
|
|
2011-03-17 02:39:31 +00:00
|
|
|
if(DecomposeFormat(NewFormat, &DstChannels, &DstType) == AL_FALSE ||
|
|
|
|
(long)SrcChannels != (long)DstChannels)
|
|
|
|
return AL_INVALID_ENUM;
|
|
|
|
|
2010-11-30 08:28:02 +00:00
|
|
|
NewChannels = ChannelsFromFmt(DstChannels);
|
|
|
|
NewBytes = BytesFromFmt(DstType);
|
2010-11-28 04:33:37 +00:00
|
|
|
|
2012-01-26 03:32:10 +00:00
|
|
|
newsize = frames;
|
|
|
|
newsize *= NewBytes;
|
|
|
|
newsize *= NewChannels;
|
|
|
|
if(newsize > INT_MAX)
|
|
|
|
return AL_OUT_OF_MEMORY;
|
2010-11-30 08:28:02 +00:00
|
|
|
|
2012-01-26 03:32:10 +00:00
|
|
|
WriteLock(&ALBuf->lock);
|
|
|
|
if(ALBuf->ref != 0)
|
2010-11-30 08:28:02 +00:00
|
|
|
{
|
2012-01-26 03:32:10 +00:00
|
|
|
WriteUnlock(&ALBuf->lock);
|
|
|
|
return AL_INVALID_OPERATION;
|
|
|
|
}
|
2010-11-30 08:28:02 +00:00
|
|
|
|
2012-01-26 03:32:10 +00:00
|
|
|
temp = realloc(ALBuf->data, (size_t)newsize);
|
|
|
|
if(!temp && newsize)
|
|
|
|
{
|
|
|
|
WriteUnlock(&ALBuf->lock);
|
|
|
|
return AL_OUT_OF_MEMORY;
|
|
|
|
}
|
|
|
|
ALBuf->data = temp;
|
2010-11-30 08:28:02 +00:00
|
|
|
|
2012-01-26 03:32:10 +00:00
|
|
|
if(data != NULL)
|
|
|
|
ConvertData(ALBuf->data, DstType, data, SrcType, NewChannels, frames);
|
2010-11-30 08:28:02 +00:00
|
|
|
|
2012-01-26 03:32:10 +00:00
|
|
|
if(storesrc)
|
|
|
|
{
|
|
|
|
ALBuf->OriginalChannels = SrcChannels;
|
|
|
|
ALBuf->OriginalType = SrcType;
|
2012-01-27 00:49:11 +00:00
|
|
|
if(SrcType == UserFmtIMA4)
|
|
|
|
ALBuf->OriginalSize = frames / 65 * 36 * ChannelsFromUserFmt(SrcChannels);
|
|
|
|
else
|
|
|
|
ALBuf->OriginalSize = frames * FrameSizeFromUserFmt(SrcChannels, SrcType);
|
2010-11-28 04:33:37 +00:00
|
|
|
}
|
2012-01-26 03:32:10 +00:00
|
|
|
else
|
2011-03-16 19:24:53 +00:00
|
|
|
{
|
|
|
|
ALBuf->OriginalChannels = DstChannels;
|
|
|
|
ALBuf->OriginalType = DstType;
|
|
|
|
ALBuf->OriginalSize = frames * NewBytes * NewChannels;
|
|
|
|
}
|
2012-01-26 03:32:10 +00:00
|
|
|
|
2010-11-28 21:08:51 +00:00
|
|
|
ALBuf->Frequency = freq;
|
|
|
|
ALBuf->FmtChannels = DstChannels;
|
2010-11-30 08:28:02 +00:00
|
|
|
ALBuf->FmtType = DstType;
|
Add buffer properties to get the internal format, and the length in bytes, samples, and seconds
The provided buffer lengths correspond to the source offsets, in that the byte
length specifies the end of the byte offset (ie, when the buffer is used for a
static source, the offset will range between 0 (inclusive) and the byte length
(exclusive)). Although an application could use the AL_SIZE, AL_CHANNELS,
AL_BITS, and AL_FREQUENCY properties to find the length in samples and seconds,
the byte length cannot be reliably calculated this way.
2011-10-01 13:19:55 +00:00
|
|
|
ALBuf->Format = NewFormat;
|
2010-11-28 04:33:37 +00:00
|
|
|
|
2012-01-27 00:49:11 +00:00
|
|
|
ALBuf->SampleLen = frames;
|
2010-11-28 04:33:37 +00:00
|
|
|
ALBuf->LoopStart = 0;
|
2011-10-03 17:07:50 +00:00
|
|
|
ALBuf->LoopEnd = ALBuf->SampleLen;
|
2010-11-28 04:33:37 +00:00
|
|
|
|
2011-09-11 10:57:40 +00:00
|
|
|
WriteUnlock(&ALBuf->lock);
|
2010-11-28 04:33:37 +00:00
|
|
|
return AL_NO_ERROR;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2010-12-04 06:33:41 +00:00
|
|
|
ALuint BytesFromUserFmt(enum UserFmtType type)
|
2010-11-29 23:01:27 +00:00
|
|
|
{
|
|
|
|
switch(type)
|
|
|
|
{
|
2010-12-04 06:33:41 +00:00
|
|
|
case UserFmtByte: return sizeof(ALbyte);
|
|
|
|
case UserFmtUByte: return sizeof(ALubyte);
|
|
|
|
case UserFmtShort: return sizeof(ALshort);
|
|
|
|
case UserFmtUShort: return sizeof(ALushort);
|
|
|
|
case UserFmtInt: return sizeof(ALint);
|
|
|
|
case UserFmtUInt: return sizeof(ALuint);
|
|
|
|
case UserFmtFloat: return sizeof(ALfloat);
|
|
|
|
case UserFmtDouble: return sizeof(ALdouble);
|
2011-04-27 01:17:50 +00:00
|
|
|
case UserFmtByte3: return sizeof(ALbyte3);
|
|
|
|
case UserFmtUByte3: return sizeof(ALubyte3);
|
2011-04-28 04:05:46 +00:00
|
|
|
case UserFmtMulaw: return sizeof(ALubyte);
|
2011-10-01 11:55:03 +00:00
|
|
|
case UserFmtAlaw: return sizeof(ALubyte);
|
2011-04-28 04:05:46 +00:00
|
|
|
case UserFmtIMA4: break; /* not handled here */
|
2010-11-29 23:01:27 +00:00
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
2010-12-04 06:33:41 +00:00
|
|
|
ALuint ChannelsFromUserFmt(enum UserFmtChannels chans)
|
2010-11-29 23:01:27 +00:00
|
|
|
{
|
|
|
|
switch(chans)
|
|
|
|
{
|
2010-12-04 06:33:41 +00:00
|
|
|
case UserFmtMono: return 1;
|
|
|
|
case UserFmtStereo: return 2;
|
|
|
|
case UserFmtRear: return 2;
|
|
|
|
case UserFmtQuad: return 4;
|
|
|
|
case UserFmtX51: return 6;
|
|
|
|
case UserFmtX61: return 7;
|
|
|
|
case UserFmtX71: return 8;
|
2010-11-29 23:01:27 +00:00
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
2011-09-19 02:06:19 +00:00
|
|
|
static ALboolean DecomposeUserFormat(ALenum format, enum UserFmtChannels *chans,
|
|
|
|
enum UserFmtType *type)
|
2010-11-27 23:33:33 +00:00
|
|
|
{
|
2011-09-19 02:06:19 +00:00
|
|
|
static const struct {
|
|
|
|
ALenum format;
|
|
|
|
enum UserFmtChannels channels;
|
|
|
|
enum UserFmtType type;
|
|
|
|
} list[] = {
|
|
|
|
{ AL_FORMAT_MONO8, UserFmtMono, UserFmtUByte },
|
|
|
|
{ AL_FORMAT_MONO16, UserFmtMono, UserFmtShort },
|
|
|
|
{ AL_FORMAT_MONO_FLOAT32, UserFmtMono, UserFmtFloat },
|
|
|
|
{ AL_FORMAT_MONO_DOUBLE_EXT, UserFmtMono, UserFmtDouble },
|
|
|
|
{ AL_FORMAT_MONO_IMA4, UserFmtMono, UserFmtIMA4 },
|
|
|
|
{ AL_FORMAT_MONO_MULAW, UserFmtMono, UserFmtMulaw },
|
2011-10-01 11:55:03 +00:00
|
|
|
{ AL_FORMAT_MONO_ALAW_EXT, UserFmtMono, UserFmtAlaw },
|
2011-09-19 02:06:19 +00:00
|
|
|
|
|
|
|
{ AL_FORMAT_STEREO8, UserFmtStereo, UserFmtUByte },
|
|
|
|
{ AL_FORMAT_STEREO16, UserFmtStereo, UserFmtShort },
|
|
|
|
{ AL_FORMAT_STEREO_FLOAT32, UserFmtStereo, UserFmtFloat },
|
|
|
|
{ AL_FORMAT_STEREO_DOUBLE_EXT, UserFmtStereo, UserFmtDouble },
|
|
|
|
{ AL_FORMAT_STEREO_IMA4, UserFmtStereo, UserFmtIMA4 },
|
|
|
|
{ AL_FORMAT_STEREO_MULAW, UserFmtStereo, UserFmtMulaw },
|
2011-10-01 11:55:03 +00:00
|
|
|
{ AL_FORMAT_STEREO_ALAW_EXT, UserFmtStereo, UserFmtAlaw },
|
2011-09-19 02:06:19 +00:00
|
|
|
|
|
|
|
{ AL_FORMAT_REAR8, UserFmtRear, UserFmtUByte },
|
|
|
|
{ AL_FORMAT_REAR16, UserFmtRear, UserFmtShort },
|
|
|
|
{ AL_FORMAT_REAR32, UserFmtRear, UserFmtFloat },
|
|
|
|
{ AL_FORMAT_REAR_MULAW, UserFmtRear, UserFmtMulaw },
|
|
|
|
|
|
|
|
{ AL_FORMAT_QUAD8_LOKI, UserFmtQuad, UserFmtUByte },
|
|
|
|
{ AL_FORMAT_QUAD16_LOKI, UserFmtQuad, UserFmtShort },
|
|
|
|
|
|
|
|
{ AL_FORMAT_QUAD8, UserFmtQuad, UserFmtUByte },
|
|
|
|
{ AL_FORMAT_QUAD16, UserFmtQuad, UserFmtShort },
|
|
|
|
{ AL_FORMAT_QUAD32, UserFmtQuad, UserFmtFloat },
|
|
|
|
{ AL_FORMAT_QUAD_MULAW, UserFmtQuad, UserFmtMulaw },
|
|
|
|
|
|
|
|
{ AL_FORMAT_51CHN8, UserFmtX51, UserFmtUByte },
|
|
|
|
{ AL_FORMAT_51CHN16, UserFmtX51, UserFmtShort },
|
|
|
|
{ AL_FORMAT_51CHN32, UserFmtX51, UserFmtFloat },
|
|
|
|
{ AL_FORMAT_51CHN_MULAW, UserFmtX51, UserFmtMulaw },
|
|
|
|
|
|
|
|
{ AL_FORMAT_61CHN8, UserFmtX61, UserFmtUByte },
|
|
|
|
{ AL_FORMAT_61CHN16, UserFmtX61, UserFmtShort },
|
|
|
|
{ AL_FORMAT_61CHN32, UserFmtX61, UserFmtFloat },
|
|
|
|
{ AL_FORMAT_61CHN_MULAW, UserFmtX61, UserFmtMulaw },
|
|
|
|
|
|
|
|
{ AL_FORMAT_71CHN8, UserFmtX71, UserFmtUByte },
|
|
|
|
{ AL_FORMAT_71CHN16, UserFmtX71, UserFmtShort },
|
|
|
|
{ AL_FORMAT_71CHN32, UserFmtX71, UserFmtFloat },
|
|
|
|
{ AL_FORMAT_71CHN_MULAW, UserFmtX71, UserFmtMulaw },
|
|
|
|
};
|
|
|
|
ALuint i;
|
|
|
|
|
2012-02-19 20:07:40 +00:00
|
|
|
for(i = 0;i < COUNTOF(list);i++)
|
2010-11-27 23:33:33 +00:00
|
|
|
{
|
2011-09-19 02:06:19 +00:00
|
|
|
if(list[i].format == format)
|
|
|
|
{
|
|
|
|
*chans = list[i].channels;
|
|
|
|
*type = list[i].type;
|
2010-11-30 04:34:33 +00:00
|
|
|
return AL_TRUE;
|
2011-09-19 02:06:19 +00:00
|
|
|
}
|
2010-11-27 23:33:33 +00:00
|
|
|
}
|
2011-09-19 02:06:19 +00:00
|
|
|
|
2010-11-30 04:34:33 +00:00
|
|
|
return AL_FALSE;
|
2010-11-27 23:33:33 +00:00
|
|
|
}
|
|
|
|
|
2010-11-29 23:01:27 +00:00
|
|
|
ALuint BytesFromFmt(enum FmtType type)
|
|
|
|
{
|
|
|
|
switch(type)
|
|
|
|
{
|
2011-05-06 01:54:10 +00:00
|
|
|
case FmtByte: return sizeof(ALbyte);
|
2010-11-29 23:01:27 +00:00
|
|
|
case FmtShort: return sizeof(ALshort);
|
|
|
|
case FmtFloat: return sizeof(ALfloat);
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
ALuint ChannelsFromFmt(enum FmtChannels chans)
|
|
|
|
{
|
|
|
|
switch(chans)
|
|
|
|
{
|
|
|
|
case FmtMono: return 1;
|
|
|
|
case FmtStereo: return 2;
|
|
|
|
case FmtRear: return 2;
|
|
|
|
case FmtQuad: return 4;
|
|
|
|
case FmtX51: return 6;
|
|
|
|
case FmtX61: return 7;
|
|
|
|
case FmtX71: return 8;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
2011-09-19 02:06:19 +00:00
|
|
|
static ALboolean DecomposeFormat(ALenum format, enum FmtChannels *chans, enum FmtType *type)
|
2010-11-27 23:37:51 +00:00
|
|
|
{
|
2011-09-19 02:06:19 +00:00
|
|
|
static const struct {
|
|
|
|
ALenum format;
|
|
|
|
enum FmtChannels channels;
|
|
|
|
enum FmtType type;
|
|
|
|
} list[] = {
|
2012-01-10 08:41:05 +00:00
|
|
|
{ AL_MONO8_SOFT, FmtMono, FmtByte },
|
|
|
|
{ AL_MONO16_SOFT, FmtMono, FmtShort },
|
|
|
|
{ AL_MONO32F_SOFT, FmtMono, FmtFloat },
|
2011-09-19 02:06:19 +00:00
|
|
|
|
2012-01-10 08:41:05 +00:00
|
|
|
{ AL_STEREO8_SOFT, FmtStereo, FmtByte },
|
|
|
|
{ AL_STEREO16_SOFT, FmtStereo, FmtShort },
|
|
|
|
{ AL_STEREO32F_SOFT, FmtStereo, FmtFloat },
|
2011-09-19 02:06:19 +00:00
|
|
|
|
2012-01-10 08:41:05 +00:00
|
|
|
{ AL_REAR8_SOFT, FmtRear, FmtByte },
|
|
|
|
{ AL_REAR16_SOFT, FmtRear, FmtShort },
|
|
|
|
{ AL_REAR32F_SOFT, FmtRear, FmtFloat },
|
2011-09-19 02:06:19 +00:00
|
|
|
|
|
|
|
{ AL_FORMAT_QUAD8_LOKI, FmtQuad, FmtByte },
|
|
|
|
{ AL_FORMAT_QUAD16_LOKI, FmtQuad, FmtShort },
|
|
|
|
|
2012-01-10 08:41:05 +00:00
|
|
|
{ AL_QUAD8_SOFT, FmtQuad, FmtByte },
|
|
|
|
{ AL_QUAD16_SOFT, FmtQuad, FmtShort },
|
|
|
|
{ AL_QUAD32F_SOFT, FmtQuad, FmtFloat },
|
2011-09-19 02:06:19 +00:00
|
|
|
|
2012-01-10 08:41:05 +00:00
|
|
|
{ AL_5POINT1_8_SOFT, FmtX51, FmtByte },
|
|
|
|
{ AL_5POINT1_16_SOFT, FmtX51, FmtShort },
|
|
|
|
{ AL_5POINT1_32F_SOFT, FmtX51, FmtFloat },
|
2011-09-19 02:06:19 +00:00
|
|
|
|
2012-01-10 08:41:05 +00:00
|
|
|
{ AL_6POINT1_8_SOFT, FmtX61, FmtByte },
|
|
|
|
{ AL_6POINT1_16_SOFT, FmtX61, FmtShort },
|
|
|
|
{ AL_6POINT1_32F_SOFT, FmtX61, FmtFloat },
|
2011-09-19 02:06:19 +00:00
|
|
|
|
2012-01-10 08:41:05 +00:00
|
|
|
{ AL_7POINT1_8_SOFT, FmtX71, FmtByte },
|
|
|
|
{ AL_7POINT1_16_SOFT, FmtX71, FmtShort },
|
|
|
|
{ AL_7POINT1_32F_SOFT, FmtX71, FmtFloat },
|
2011-09-19 02:06:19 +00:00
|
|
|
};
|
|
|
|
ALuint i;
|
|
|
|
|
2012-02-19 20:07:40 +00:00
|
|
|
for(i = 0;i < COUNTOF(list);i++)
|
2010-11-27 23:37:51 +00:00
|
|
|
{
|
2011-09-19 02:06:19 +00:00
|
|
|
if(list[i].format == format)
|
|
|
|
{
|
|
|
|
*chans = list[i].channels;
|
|
|
|
*type = list[i].type;
|
2010-11-30 04:34:33 +00:00
|
|
|
return AL_TRUE;
|
2011-09-19 02:06:19 +00:00
|
|
|
}
|
2010-11-27 23:37:51 +00:00
|
|
|
}
|
2011-09-19 02:06:19 +00:00
|
|
|
|
2010-11-30 04:34:33 +00:00
|
|
|
return AL_FALSE;
|
2010-11-27 23:37:51 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2011-07-02 09:54:05 +00:00
|
|
|
static ALboolean IsValidType(ALenum type)
|
|
|
|
{
|
|
|
|
switch(type)
|
|
|
|
{
|
2012-01-10 08:41:05 +00:00
|
|
|
case AL_BYTE_SOFT:
|
|
|
|
case AL_UNSIGNED_BYTE_SOFT:
|
|
|
|
case AL_SHORT_SOFT:
|
|
|
|
case AL_UNSIGNED_SHORT_SOFT:
|
|
|
|
case AL_INT_SOFT:
|
|
|
|
case AL_UNSIGNED_INT_SOFT:
|
|
|
|
case AL_FLOAT_SOFT:
|
|
|
|
case AL_DOUBLE_SOFT:
|
|
|
|
case AL_BYTE3_SOFT:
|
|
|
|
case AL_UNSIGNED_BYTE3_SOFT:
|
2011-07-02 09:54:05 +00:00
|
|
|
return AL_TRUE;
|
|
|
|
}
|
|
|
|
return AL_FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static ALboolean IsValidChannels(ALenum channels)
|
|
|
|
{
|
|
|
|
switch(channels)
|
|
|
|
{
|
2012-01-10 08:41:05 +00:00
|
|
|
case AL_MONO_SOFT:
|
|
|
|
case AL_STEREO_SOFT:
|
|
|
|
case AL_REAR_SOFT:
|
|
|
|
case AL_QUAD_SOFT:
|
|
|
|
case AL_5POINT1_SOFT:
|
|
|
|
case AL_6POINT1_SOFT:
|
|
|
|
case AL_7POINT1_SOFT:
|
2011-07-02 09:54:05 +00:00
|
|
|
return AL_TRUE;
|
|
|
|
}
|
|
|
|
return AL_FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2007-11-14 02:02:18 +00:00
|
|
|
/*
|
2010-11-25 20:07:12 +00:00
|
|
|
* ReleaseALBuffers()
|
|
|
|
*
|
2010-12-02 04:34:29 +00:00
|
|
|
* INTERNAL: Called to destroy any buffers that still exist on the device
|
2010-11-25 20:07:12 +00:00
|
|
|
*/
|
2009-08-15 16:14:08 +00:00
|
|
|
ALvoid ReleaseALBuffers(ALCdevice *device)
|
2007-11-14 02:02:18 +00:00
|
|
|
{
|
2010-05-02 02:59:41 +00:00
|
|
|
ALsizei i;
|
|
|
|
for(i = 0;i < device->BufferMap.size;i++)
|
2007-11-14 02:02:18 +00:00
|
|
|
{
|
2010-05-02 02:59:41 +00:00
|
|
|
ALbuffer *temp = device->BufferMap.array[i].value;
|
|
|
|
device->BufferMap.array[i].value = NULL;
|
2010-03-21 04:49:02 +00:00
|
|
|
|
|
|
|
free(temp->data);
|
2007-11-14 02:02:18 +00:00
|
|
|
|
2011-08-22 14:40:14 +00:00
|
|
|
FreeThunkEntry(temp->buffer);
|
2010-03-21 04:49:02 +00:00
|
|
|
memset(temp, 0, sizeof(ALbuffer));
|
|
|
|
free(temp);
|
2007-11-14 02:02:18 +00:00
|
|
|
}
|
|
|
|
}
|