Allow 5.1 channel output

This doesn't use the center or LFE channel in spatial calculations, however
This commit is contained in:
Chris Robinson
2007-12-26 23:01:22 -08:00
parent dcac0de44c
commit ab8d342df0
4 changed files with 35 additions and 4 deletions
+29 -2
View File
@@ -59,11 +59,13 @@ __inline ALuint aluBytesFromFormat(ALenum format)
case AL_FORMAT_MONO8:
case AL_FORMAT_STEREO8:
case AL_FORMAT_QUAD8:
case AL_FORMAT_51CHN8:
return 1;
case AL_FORMAT_MONO16:
case AL_FORMAT_STEREO16:
case AL_FORMAT_QUAD16:
case AL_FORMAT_51CHN16:
return 2;
default:
@@ -87,6 +89,10 @@ __inline ALuint aluChannelsFromFormat(ALenum format)
case AL_FORMAT_QUAD16:
return 4;
case AL_FORMAT_51CHN8:
case AL_FORMAT_51CHN16:
return 6;
default:
return 0;
}
@@ -340,6 +346,9 @@ static ALvoid CalcSourceParams(ALCcontext *ALContext, ALsource *ALSource,
break;
case AL_FORMAT_QUAD8:
case AL_FORMAT_QUAD16:
/* TODO: Add center/lfe channel in spatial calculations? */
case AL_FORMAT_51CHN8:
case AL_FORMAT_51CHN16:
// Apply a scalar so each individual speaker has more weight
PanningLR = 0.5f + (0.5f*Position[0]*1.41421356f);
PanningLR = __min(1.0f, PanningLR);
@@ -367,10 +376,14 @@ static ALvoid CalcSourceParams(ALCcontext *ALContext, ALsource *ALSource,
drysend[1] = SourceVolume * 1.0f * ListenerGain;
drysend[2] = SourceVolume * 1.0f * ListenerGain;
drysend[3] = SourceVolume * 1.0f * ListenerGain;
drysend[4] = SourceVolume * 1.0f * ListenerGain;
drysend[5] = SourceVolume * 1.0f * ListenerGain;
wetsend[0] = SourceVolume * 0.0f * ListenerGain;
wetsend[1] = SourceVolume * 0.0f * ListenerGain;
wetsend[2] = SourceVolume * 0.0f * ListenerGain;
wetsend[3] = SourceVolume * 0.0f * ListenerGain;
wetsend[4] = SourceVolume * 0.0f * ListenerGain;
wetsend[5] = SourceVolume * 0.0f * ListenerGain;
pitch[0] = Pitch;
}
@@ -380,8 +393,8 @@ ALvoid aluMixData(ALCcontext *ALContext,ALvoid *buffer,ALsizei size,ALenum forma
{
static float DryBuffer[BUFFERSIZE][OUTPUTCHANNELS];
static float WetBuffer[BUFFERSIZE][OUTPUTCHANNELS];
ALfloat DrySend[OUTPUTCHANNELS] = { 0.0f, 0.0f, 0.0f, 0.0f };
ALfloat WetSend[OUTPUTCHANNELS] = { 0.0f, 0.0f, 0.0f, 0.0f };
ALfloat DrySend[OUTPUTCHANNELS] = { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f };
ALfloat WetSend[OUTPUTCHANNELS] = { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f };
ALuint BlockAlign,BufferSize;
ALuint DataSize=0,DataPosInt=0,DataPosFrac=0;
ALuint Channels,Bits,Frequency,ulExtraSamples;
@@ -641,6 +654,13 @@ ALvoid aluMixData(ALCcontext *ALContext,ALvoid *buffer,ALsizei size,ALenum forma
buffer = ((ALubyte*)buffer) + 1;
}
break;
case AL_FORMAT_51CHN8:
for(i = 0;i < SamplesToDo*6;i++)
{
*((ALubyte*)buffer) = (ALubyte)((aluF2S(DryBuffer[i/6][i%6]+WetBuffer[i/6][i%6])>>8)+128);
buffer = ((ALubyte*)buffer) + 1;
}
break;
case AL_FORMAT_MONO16:
for(i = 0;i < SamplesToDo;i++)
{
@@ -663,6 +683,13 @@ ALvoid aluMixData(ALCcontext *ALContext,ALvoid *buffer,ALsizei size,ALenum forma
buffer = ((ALshort*)buffer) + 1;
}
break;
case AL_FORMAT_51CHN16:
for(i = 0;i < SamplesToDo*6;i++)
{
*((ALshort*)buffer) = aluF2S(DryBuffer[i/6][i%6]+WetBuffer[i/6][i%6]);
buffer = ((ALshort*)buffer) + 1;
}
break;
}
size -= SamplesToDo;
+3 -1
View File
@@ -92,9 +92,11 @@ extern char _alDebug[256];
#define AL_FORMAT_MONO_IMA4 0x1300
#define AL_FORMAT_STEREO_IMA4 0x1301
// These are from AL_EXT_MCFORMATS, which we don't support yet but the mixer
// can use 4-channel formats
// can use the extra formats
#define AL_FORMAT_QUAD8 0x1204
#define AL_FORMAT_QUAD16 0x1205
#define AL_FORMAT_51CHN8 0x120A
#define AL_FORMAT_51CHN16 0x120B
#define SWMIXER_OUTPUT_RATE 44100
//#define OUTPUT_BUFFER_SIZE (32768*SWMIXER_OUTPUT_RATE/22050)
+1 -1
View File
@@ -5,7 +5,7 @@
#define FRACTIONBITS 14
#define FRACTIONMASK ((1L<<FRACTIONBITS)-1)
#define MAX_PITCH 4
#define OUTPUTCHANNELS 4
#define OUTPUTCHANNELS 6
#include "AL/al.h"
#include "AL/alc.h"
+2
View File
@@ -156,6 +156,8 @@ static ALenums enumeration[]={
{ (ALchar *)"AL_FORMAT_STEREO_IMA4", AL_FORMAT_STEREO_IMA4 },
{ (ALchar *)"AL_FORMAT_QUAD8", AL_FORMAT_QUAD8 },
{ (ALchar *)"AL_FORMAT_QUAD16", AL_FORMAT_QUAD16 },
{ (ALchar *)"AL_FORMAT_51CHN8", AL_FORMAT_51CHN8 },
{ (ALchar *)"AL_FORMAT_51CHN16", AL_FORMAT_51CHN16 },
// Buffer attributes
{ (ALchar *)"AL_FREQUENCY", AL_FREQUENCY },