aboutsummaryrefslogtreecommitdiffstats
path: root/OpenAL32/alBuffer.c
diff options
context:
space:
mode:
authorChris Robinson <[email protected]>2009-12-07 10:35:30 -0800
committerChris Robinson <[email protected]>2009-12-07 10:35:30 -0800
commit4697e946d3ac61c05512d685a97e4632a392c162 (patch)
tree9ec86073c68d193730c1bdeb48d0f9234c739aca /OpenAL32/alBuffer.c
parent9286e3984c3276dd720629a1ee4615d6f9acca73 (diff)
Internally store 32-bit float buffer data, and mix accordingly
Diffstat (limited to 'OpenAL32/alBuffer.c')
-rw-r--r--OpenAL32/alBuffer.c100
1 files changed, 47 insertions, 53 deletions
diff --git a/OpenAL32/alBuffer.c b/OpenAL32/alBuffer.c
index 6e700c4f..605e481a 100644
--- a/OpenAL32/alBuffer.c
+++ b/OpenAL32/alBuffer.c
@@ -33,9 +33,9 @@
static void LoadData(ALbuffer *ALBuf, const ALubyte *data, ALsizei size, ALuint freq, ALenum OrigFormat, ALenum NewFormat);
-static void ConvertData(ALshort *dst, const ALvoid *src, ALint origBytes, ALsizei len);
-static void ConvertDataRear(ALshort *dst, const ALvoid *src, ALint origBytes, ALsizei len);
-static void ConvertDataIMA4(ALshort *dst, const ALvoid *src, ALint origChans, ALsizei len);
+static void ConvertData(ALfloat *dst, const ALvoid *src, ALint origBytes, ALsizei len);
+static void ConvertDataRear(ALfloat *dst, const ALvoid *src, ALint origBytes, ALsizei len);
+static void ConvertDataIMA4(ALfloat *dst, const ALvoid *src, ALint origChans, ALsizei len);
/*
* AL Buffer Functions
@@ -289,19 +289,19 @@ ALAPI ALvoid ALAPIENTRY alBufferData(ALuint buffer,ALenum format,const ALvoid *d
case AL_FORMAT_MONO8:
case AL_FORMAT_MONO16:
case AL_FORMAT_MONO_FLOAT32:
- LoadData(ALBuf, data, size, freq, format, AL_FORMAT_MONO16);
+ LoadData(ALBuf, data, size, freq, format, AL_FORMAT_MONO_FLOAT32);
break;
case AL_FORMAT_STEREO8:
case AL_FORMAT_STEREO16:
case AL_FORMAT_STEREO_FLOAT32:
- LoadData(ALBuf, data, size, freq, format, AL_FORMAT_STEREO16);
+ LoadData(ALBuf, data, size, freq, format, AL_FORMAT_STEREO_FLOAT32);
break;
case AL_FORMAT_REAR8:
case AL_FORMAT_REAR16:
case AL_FORMAT_REAR32: {
- ALuint NewFormat = AL_FORMAT_QUAD16;
+ ALuint NewFormat = AL_FORMAT_QUAD32;
ALuint NewChannels = aluChannelsFromFormat(NewFormat);
ALuint NewBytes = aluBytesFromFormat(NewFormat);
ALuint OrigBytes = ((format==AL_FORMAT_REAR8) ? 1 :
@@ -319,15 +319,13 @@ ALAPI ALvoid ALAPIENTRY alBufferData(ALuint buffer,ALenum format,const ALvoid *d
size /= OrigBytes;
size *= 2;
- // Samples are converted to 16 bit here
+ // Samples are converted here
temp = realloc(ALBuf->data, (BUFFER_PADDING*NewChannels + size) * NewBytes);
if(temp)
{
ALBuf->data = temp;
ConvertDataRear(ALBuf->data, data, OrigBytes, size);
- memset(&(ALBuf->data[size]), 0, BUFFER_PADDING*NewChannels*NewBytes);
-
ALBuf->format = NewFormat;
ALBuf->eOriginalFormat = format;
ALBuf->size = size*NewBytes;
@@ -342,32 +340,32 @@ ALAPI ALvoid ALAPIENTRY alBufferData(ALuint buffer,ALenum format,const ALvoid *d
case AL_FORMAT_QUAD8:
case AL_FORMAT_QUAD16:
case AL_FORMAT_QUAD32:
- LoadData(ALBuf, data, size, freq, format, AL_FORMAT_QUAD16);
+ LoadData(ALBuf, data, size, freq, format, AL_FORMAT_QUAD32);
break;
case AL_FORMAT_51CHN8:
case AL_FORMAT_51CHN16:
case AL_FORMAT_51CHN32:
- LoadData(ALBuf, data, size, freq, format, AL_FORMAT_51CHN16);
+ LoadData(ALBuf, data, size, freq, format, AL_FORMAT_51CHN32);
break;
case AL_FORMAT_61CHN8:
case AL_FORMAT_61CHN16:
case AL_FORMAT_61CHN32:
- LoadData(ALBuf, data, size, freq, format, AL_FORMAT_61CHN16);
+ LoadData(ALBuf, data, size, freq, format, AL_FORMAT_61CHN32);
break;
case AL_FORMAT_71CHN8:
case AL_FORMAT_71CHN16:
case AL_FORMAT_71CHN32:
- LoadData(ALBuf, data, size, freq, format, AL_FORMAT_71CHN16);
+ LoadData(ALBuf, data, size, freq, format, AL_FORMAT_71CHN32);
break;
case AL_FORMAT_MONO_IMA4:
case AL_FORMAT_STEREO_IMA4: {
int OrigChans = ((format==AL_FORMAT_MONO_IMA4) ? 1 : 2);
- ALuint NewFormat = ((OrigChans==1) ? AL_FORMAT_MONO16 :
- AL_FORMAT_STEREO16);
+ ALuint NewFormat = ((OrigChans==1) ? AL_FORMAT_MONO_FLOAT32 :
+ AL_FORMAT_STEREO_FLOAT32);
ALuint NewBytes = aluBytesFromFormat(NewFormat);
// Here is where things vary:
@@ -389,9 +387,7 @@ ALAPI ALvoid ALAPIENTRY alBufferData(ALuint buffer,ALenum format,const ALvoid *d
ALBuf->data = temp;
ConvertDataIMA4(ALBuf->data, data, OrigChans, size/65);
- memset(&(ALBuf->data[size]), 0, BUFFER_PADDING*NewBytes*OrigChans);
-
- ALBuf->format = ((OrigChans==1) ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16);
+ ALBuf->format = NewFormat;
ALBuf->eOriginalFormat = format;
ALBuf->size = size*NewBytes;
ALBuf->frequency = freq;
@@ -515,7 +511,7 @@ ALvoid ALAPIENTRY alBufferSubDataEXT(ALuint buffer,ALenum format,const ALvoid *d
default: {
ALuint Channels = aluChannelsFromFormat(format);
ALuint Bytes = aluBytesFromFormat(format);
- ALuint NewBytes = aluChannelsFromFormat(ALBuf->format);
+ ALuint NewBytes = aluBytesFromFormat(ALBuf->format);
if(Channels != aluChannelsFromFormat(ALBuf->format))
{
@@ -931,9 +927,9 @@ ALAPI void ALAPIENTRY alGetBufferiv(ALuint buffer, ALenum eParam, ALint* plValue
* LoadData
*
* Loads the specified data into the buffer, using the specified formats.
- * Currently, the new format must be 16-bit, and must have the same channel
- * configuration as the original format. This does NOT handle compressed
- * formats (eg. IMA4).
+ * Currently, the new format must be 32-bit float, and must have the same
+ * channel configuration as the original format. This does NOT handle
+ * compressed formats (eg. IMA4).
*/
static void LoadData(ALbuffer *ALBuf, const ALubyte *data, ALsizei size, ALuint freq, ALenum OrigFormat, ALenum NewFormat)
{
@@ -943,7 +939,7 @@ static void LoadData(ALbuffer *ALBuf, const ALubyte *data, ALsizei size, ALuint
ALuint OrigChannels = aluChannelsFromFormat(OrigFormat);
ALvoid *temp;
- assert(NewBytes == 2);
+ assert(NewBytes == 4);
assert(NewChannels == OrigChannels);
if ((size%(OrigBytes*OrigChannels)) != 0)
@@ -952,7 +948,7 @@ static void LoadData(ALbuffer *ALBuf, const ALubyte *data, ALsizei size, ALuint
return;
}
- // Samples are converted to 16 bit here
+ // Samples are converted here
size /= OrigBytes;
temp = realloc(ALBuf->data, (BUFFER_PADDING*NewChannels + size) * NewBytes);
if(temp)
@@ -960,8 +956,6 @@ static void LoadData(ALbuffer *ALBuf, const ALubyte *data, ALsizei size, ALuint
ALBuf->data = temp;
ConvertData(ALBuf->data, data, OrigBytes, size);
- memset(&(ALBuf->data[size]), 0, BUFFER_PADDING*NewChannels*NewBytes);
-
ALBuf->format = NewFormat;
ALBuf->eOriginalFormat = OrigFormat;
ALBuf->size = size*NewBytes;
@@ -971,29 +965,31 @@ static void LoadData(ALbuffer *ALBuf, const ALubyte *data, ALsizei size, ALuint
alSetError(AL_OUT_OF_MEMORY);
}
-static void ConvertData(ALshort *dst, const ALvoid *src, ALint origBytes, ALsizei len)
+static void ConvertData(ALfloat *dst, const ALvoid *src, ALint origBytes, ALsizei len)
{
ALsizei i;
+ ALint smp;
switch(origBytes)
{
case 1:
for(i = 0;i < len;i++)
- dst[i] = ((ALshort)((ALubyte*)src)[i] - 128) << 8;
+ {
+ smp = ((ALubyte*)src)[i];
+ dst[i] = ((smp < 0x80) ? ((smp-128)/128.0f) : ((smp-128)/127.0f));
+ }
break;
case 2:
- memcpy(dst, src, len*sizeof(ALshort));
+ for(i = 0;i < len;i++)
+ {
+ smp = ((ALshort*)src)[i];
+ dst[i] = ((smp < 0) ? (smp/32768.0f) : (smp/32767.0f));
+ }
break;
case 4:
for(i = 0;i < len;i++)
- {
- ALint smp;
- smp = (((ALfloat*)src)[i] * 32767.5f - 0.5f);
- smp = min(smp, 32767);
- smp = max(smp, -32768);
- dst[i] = (ALshort)smp;
- }
+ dst[i] = ((ALfloat*)src)[i];
break;
default:
@@ -1001,9 +997,10 @@ static void ConvertData(ALshort *dst, const ALvoid *src, ALint origBytes, ALsize
}
}
-static void ConvertDataRear(ALshort *dst, const ALvoid *src, ALint origBytes, ALsizei len)
+static void ConvertDataRear(ALfloat *dst, const ALvoid *src, ALint origBytes, ALsizei len)
{
ALsizei i;
+ ALint smp;
switch(origBytes)
{
case 1:
@@ -1011,8 +1008,10 @@ static void ConvertDataRear(ALshort *dst, const ALvoid *src, ALint origBytes, AL
{
dst[i+0] = 0;
dst[i+1] = 0;
- dst[i+2] = ((ALshort)((ALubyte*)src)[i/2+0] - 128) << 8;
- dst[i+3] = ((ALshort)((ALubyte*)src)[i/2+1] - 128) << 8;
+ smp = ((ALubyte*)src)[i/2+0];
+ dst[i+2] = ((smp < 0x80) ? ((smp-128)/128.0f) : ((smp-128)/127.0f));
+ smp = ((ALubyte*)src)[i/2+1];
+ dst[i+3] = ((smp < 0x80) ? ((smp-128)/128.0f) : ((smp-128)/127.0f));
}
break;
@@ -1021,25 +1020,20 @@ static void ConvertDataRear(ALshort *dst, const ALvoid *src, ALint origBytes, AL
{
dst[i+0] = 0;
dst[i+1] = 0;
- dst[i+2] = ((ALshort*)src)[i/2+0];
- dst[i+3] = ((ALshort*)src)[i/2+1];
+ smp = ((ALshort*)src)[i/2+0];
+ dst[i+2] = ((smp < 0) ? (smp/32768.0f) : (smp/32767.0f));
+ smp = ((ALshort*)src)[i/2+1];
+ dst[i+3] = ((smp < 0) ? (smp/32768.0f) : (smp/32767.0f));
}
break;
case 4:
for(i = 0;i < len;i+=4)
{
- ALint smp;
dst[i+0] = 0;
dst[i+1] = 0;
- smp = (((ALfloat*)src)[i/2+0] * 32767.5f - 0.5);
- smp = min(smp, 32767);
- smp = max(smp, -32768);
- dst[i+2] = (ALshort)smp;
- smp = (((ALfloat*)src)[i/2+1] * 32767.5f - 0.5);
- smp = min(smp, 32767);
- smp = max(smp, -32768);
- dst[i+3] = (ALshort)smp;
+ dst[i+2] = ((ALfloat*)src)[i/2+0];
+ dst[i+3] = ((ALfloat*)src)[i/2+1];
}
break;
@@ -1048,7 +1042,7 @@ static void ConvertDataRear(ALshort *dst, const ALvoid *src, ALint origBytes, AL
}
}
-static void ConvertDataIMA4(ALshort *dst, const ALvoid *src, ALint origChans, ALsizei len)
+static void ConvertDataIMA4(ALfloat *dst, const ALvoid *src, ALint origChans, ALsizei len)
{
const ALuint *IMAData;
ALint Sample[2],Index[2];
@@ -1068,7 +1062,7 @@ static void ConvertDataIMA4(ALshort *dst, const ALvoid *src, ALint origChans, AL
Index[c] = ((Index[c]<0) ? 0 : Index[c]);
Index[c] = ((Index[c]>88) ? 88 : Index[c]);
- dst[i*65*origChans + c] = (ALshort)Sample[c];
+ dst[i*65*origChans + c] = ((Sample[c] < 0) ? (Sample[c]/32768.0f) : (Sample[c]/32767.0f));
IMAData++;
}
@@ -1091,7 +1085,7 @@ static void ConvertDataIMA4(ALshort *dst, const ALvoid *src, ALint origChans, AL
if(Index[c]<0) Index[c] = 0;
else if(Index[c]>88) Index[c] = 88;
- dst[(i*65+j+k)*origChans + c] = (ALshort)Sample[c];
+ dst[(i*65+j+k)*origChans + c] = ((Sample[c] < 0) ? (Sample[c]/32768.0f) : (Sample[c]/32767.0f));
IMACode[c] >>= 4;
}
}