aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Robinson <[email protected]>2010-04-08 14:47:12 -0700
committerChris Robinson <[email protected]>2010-04-08 14:47:12 -0700
commit37c93a6ad829e730a258aebaef8314fbe0edc767 (patch)
treeafc379d5d8c31532ba62f2a6b114df5b51014416
parent1b1c76da341f446f926ffad44a9f7d12a4f0f2d5 (diff)
Always mix internally at 8.1
The channels are remixed when writing to the output buffer. Stereo duplication is currently broken, but this can be restored later
-rw-r--r--Alc/ALu.c345
-rw-r--r--OpenAL32/Include/alMain.h4
2 files changed, 151 insertions, 198 deletions
diff --git a/Alc/ALu.c b/Alc/ALu.c
index 2d5c7c3a..03a73c45 100644
--- a/Alc/ALu.c
+++ b/Alc/ALu.c
@@ -228,6 +228,7 @@ static __inline ALfloat aluLUTpos2Angle(ALint pos)
ALvoid aluInitPanning(ALCcontext *Context)
{
+ ALCdevice *Device = Context->Device;
ALint pos, offset, s;
ALfloat Alpha, Theta;
ALfloat SpeakerAngle[OUTPUTCHANNELS];
@@ -237,7 +238,7 @@ ALvoid aluInitPanning(ALCcontext *Context)
{
int s2;
for(s2 = 0;s2 < OUTPUTCHANNELS;s2++)
- Context->ChannelMatrix[s][s2] = ((s==s2) ? 1.0f : 0.0f);
+ Device->ChannelMatrix[s][s2] = ((s==s2) ? 1.0f : 0.0f);
}
switch(Context->Device->Format)
@@ -245,112 +246,70 @@ ALvoid aluInitPanning(ALCcontext *Context)
case AL_FORMAT_MONO8:
case AL_FORMAT_MONO16:
case AL_FORMAT_MONO_FLOAT32:
- Context->ChannelMatrix[FRONT_LEFT][FRONT_CENTER] = aluSqrt(0.5);
- Context->ChannelMatrix[FRONT_RIGHT][FRONT_CENTER] = aluSqrt(0.5);
- Context->ChannelMatrix[SIDE_LEFT][FRONT_CENTER] = aluSqrt(0.5);
- Context->ChannelMatrix[SIDE_RIGHT][FRONT_CENTER] = aluSqrt(0.5);
- Context->ChannelMatrix[BACK_LEFT][FRONT_CENTER] = aluSqrt(0.5);
- Context->ChannelMatrix[BACK_RIGHT][FRONT_CENTER] = aluSqrt(0.5);
- Context->ChannelMatrix[BACK_CENTER][FRONT_CENTER] = 1.0f;
- Context->NumChan = 1;
- Speaker2Chan[0] = FRONT_CENTER;
- SpeakerAngle[0] = 0.0f * M_PI/180.0f;
- break;
+ Device->ChannelMatrix[FRONT_LEFT][FRONT_CENTER] = aluSqrt(0.5);
+ Device->ChannelMatrix[FRONT_RIGHT][FRONT_CENTER] = aluSqrt(0.5);
+ Device->ChannelMatrix[SIDE_LEFT][FRONT_CENTER] = aluSqrt(0.5);
+ Device->ChannelMatrix[SIDE_RIGHT][FRONT_CENTER] = aluSqrt(0.5);
+ Device->ChannelMatrix[BACK_LEFT][FRONT_CENTER] = aluSqrt(0.5);
+ Device->ChannelMatrix[BACK_RIGHT][FRONT_CENTER] = aluSqrt(0.5);
+ Device->ChannelMatrix[BACK_CENTER][FRONT_CENTER] = 1.0f;
+ goto real_setup;
case AL_FORMAT_STEREO8:
case AL_FORMAT_STEREO16:
case AL_FORMAT_STEREO_FLOAT32:
- Context->ChannelMatrix[FRONT_CENTER][FRONT_LEFT] = aluSqrt(0.5);
- Context->ChannelMatrix[FRONT_CENTER][FRONT_RIGHT] = aluSqrt(0.5);
- Context->ChannelMatrix[SIDE_LEFT][FRONT_LEFT] = 1.0f;
- Context->ChannelMatrix[SIDE_RIGHT][FRONT_RIGHT] = 1.0f;
- Context->ChannelMatrix[BACK_LEFT][FRONT_LEFT] = 1.0f;
- Context->ChannelMatrix[BACK_RIGHT][FRONT_RIGHT] = 1.0f;
- Context->ChannelMatrix[BACK_CENTER][FRONT_LEFT] = aluSqrt(0.5);
- Context->ChannelMatrix[BACK_CENTER][FRONT_RIGHT] = aluSqrt(0.5);
- Context->NumChan = 2;
- Speaker2Chan[0] = FRONT_LEFT;
- Speaker2Chan[1] = FRONT_RIGHT;
- SpeakerAngle[0] = -90.0f * M_PI/180.0f;
- SpeakerAngle[1] = 90.0f * M_PI/180.0f;
- SetSpeakerArrangement("layout_STEREO", SpeakerAngle, Speaker2Chan, Context->NumChan);
- break;
+ Device->ChannelMatrix[FRONT_CENTER][FRONT_LEFT] = aluSqrt(0.5);
+ Device->ChannelMatrix[FRONT_CENTER][FRONT_RIGHT] = aluSqrt(0.5);
+ Device->ChannelMatrix[SIDE_LEFT][FRONT_LEFT] = 1.0f;
+ Device->ChannelMatrix[SIDE_RIGHT][FRONT_RIGHT] = 1.0f;
+ Device->ChannelMatrix[BACK_LEFT][FRONT_LEFT] = 1.0f;
+ Device->ChannelMatrix[BACK_RIGHT][FRONT_RIGHT] = 1.0f;
+ Device->ChannelMatrix[BACK_CENTER][FRONT_LEFT] = aluSqrt(0.5);
+ Device->ChannelMatrix[BACK_CENTER][FRONT_RIGHT] = aluSqrt(0.5);
+ goto real_setup;
case AL_FORMAT_QUAD8:
case AL_FORMAT_QUAD16:
case AL_FORMAT_QUAD32:
- Context->ChannelMatrix[FRONT_CENTER][FRONT_LEFT] = aluSqrt(0.5);
- Context->ChannelMatrix[FRONT_CENTER][FRONT_RIGHT] = aluSqrt(0.5);
- Context->ChannelMatrix[SIDE_LEFT][FRONT_LEFT] = aluSqrt(0.5);
- Context->ChannelMatrix[SIDE_LEFT][BACK_LEFT] = aluSqrt(0.5);
- Context->ChannelMatrix[SIDE_RIGHT][FRONT_RIGHT] = aluSqrt(0.5);
- Context->ChannelMatrix[SIDE_RIGHT][BACK_RIGHT] = aluSqrt(0.5);
- Context->ChannelMatrix[BACK_CENTER][BACK_LEFT] = aluSqrt(0.5);
- Context->ChannelMatrix[BACK_CENTER][BACK_RIGHT] = aluSqrt(0.5);
- Context->NumChan = 4;
- Speaker2Chan[0] = BACK_LEFT;
- Speaker2Chan[1] = FRONT_LEFT;
- Speaker2Chan[2] = FRONT_RIGHT;
- Speaker2Chan[3] = BACK_RIGHT;
- SpeakerAngle[0] = -135.0f * M_PI/180.0f;
- SpeakerAngle[1] = -45.0f * M_PI/180.0f;
- SpeakerAngle[2] = 45.0f * M_PI/180.0f;
- SpeakerAngle[3] = 135.0f * M_PI/180.0f;
- SetSpeakerArrangement("layout_QUAD", SpeakerAngle, Speaker2Chan, Context->NumChan);
- break;
+ Device->ChannelMatrix[FRONT_CENTER][FRONT_LEFT] = aluSqrt(0.5);
+ Device->ChannelMatrix[FRONT_CENTER][FRONT_RIGHT] = aluSqrt(0.5);
+ Device->ChannelMatrix[SIDE_LEFT][FRONT_LEFT] = aluSqrt(0.5);
+ Device->ChannelMatrix[SIDE_LEFT][BACK_LEFT] = aluSqrt(0.5);
+ Device->ChannelMatrix[SIDE_RIGHT][FRONT_RIGHT] = aluSqrt(0.5);
+ Device->ChannelMatrix[SIDE_RIGHT][BACK_RIGHT] = aluSqrt(0.5);
+ Device->ChannelMatrix[BACK_CENTER][BACK_LEFT] = aluSqrt(0.5);
+ Device->ChannelMatrix[BACK_CENTER][BACK_RIGHT] = aluSqrt(0.5);
+ goto real_setup;
case AL_FORMAT_51CHN8:
case AL_FORMAT_51CHN16:
case AL_FORMAT_51CHN32:
- Context->ChannelMatrix[SIDE_LEFT][FRONT_LEFT] = aluSqrt(0.5);
- Context->ChannelMatrix[SIDE_LEFT][BACK_LEFT] = aluSqrt(0.5);
- Context->ChannelMatrix[SIDE_RIGHT][FRONT_RIGHT] = aluSqrt(0.5);
- Context->ChannelMatrix[SIDE_RIGHT][BACK_RIGHT] = aluSqrt(0.5);
- Context->ChannelMatrix[BACK_CENTER][BACK_LEFT] = aluSqrt(0.5);
- Context->ChannelMatrix[BACK_CENTER][BACK_RIGHT] = aluSqrt(0.5);
- Context->NumChan = 5;
- Speaker2Chan[0] = BACK_LEFT;
- Speaker2Chan[1] = FRONT_LEFT;
- Speaker2Chan[2] = FRONT_CENTER;
- Speaker2Chan[3] = FRONT_RIGHT;
- Speaker2Chan[4] = BACK_RIGHT;
- SpeakerAngle[0] = -110.0f * M_PI/180.0f;
- SpeakerAngle[1] = -30.0f * M_PI/180.0f;
- SpeakerAngle[2] = 0.0f * M_PI/180.0f;
- SpeakerAngle[3] = 30.0f * M_PI/180.0f;
- SpeakerAngle[4] = 110.0f * M_PI/180.0f;
- SetSpeakerArrangement("layout_51CHN", SpeakerAngle, Speaker2Chan, Context->NumChan);
- break;
+ Device->ChannelMatrix[SIDE_LEFT][FRONT_LEFT] = aluSqrt(0.5);
+ Device->ChannelMatrix[SIDE_LEFT][BACK_LEFT] = aluSqrt(0.5);
+ Device->ChannelMatrix[SIDE_RIGHT][FRONT_RIGHT] = aluSqrt(0.5);
+ Device->ChannelMatrix[SIDE_RIGHT][BACK_RIGHT] = aluSqrt(0.5);
+ Device->ChannelMatrix[BACK_CENTER][BACK_LEFT] = aluSqrt(0.5);
+ Device->ChannelMatrix[BACK_CENTER][BACK_RIGHT] = aluSqrt(0.5);
+ goto real_setup;
case AL_FORMAT_61CHN8:
case AL_FORMAT_61CHN16:
case AL_FORMAT_61CHN32:
- Context->ChannelMatrix[BACK_LEFT][BACK_CENTER] = aluSqrt(0.5);
- Context->ChannelMatrix[BACK_LEFT][SIDE_LEFT] = aluSqrt(0.5);
- Context->ChannelMatrix[BACK_RIGHT][BACK_CENTER] = aluSqrt(0.5);
- Context->ChannelMatrix[BACK_RIGHT][SIDE_RIGHT] = aluSqrt(0.5);
- Context->NumChan = 6;
- Speaker2Chan[0] = SIDE_LEFT;
- Speaker2Chan[1] = FRONT_LEFT;
- Speaker2Chan[2] = FRONT_CENTER;
- Speaker2Chan[3] = FRONT_RIGHT;
- Speaker2Chan[4] = SIDE_RIGHT;
- Speaker2Chan[5] = BACK_CENTER;
- SpeakerAngle[0] = -90.0f * M_PI/180.0f;
- SpeakerAngle[1] = -30.0f * M_PI/180.0f;
- SpeakerAngle[2] = 0.0f * M_PI/180.0f;
- SpeakerAngle[3] = 30.0f * M_PI/180.0f;
- SpeakerAngle[4] = 90.0f * M_PI/180.0f;
- SpeakerAngle[5] = 180.0f * M_PI/180.0f;
- SetSpeakerArrangement("layout_61CHN", SpeakerAngle, Speaker2Chan, Context->NumChan);
- break;
+ Device->ChannelMatrix[BACK_LEFT][BACK_CENTER] = aluSqrt(0.5);
+ Device->ChannelMatrix[BACK_LEFT][SIDE_LEFT] = aluSqrt(0.5);
+ Device->ChannelMatrix[BACK_RIGHT][BACK_CENTER] = aluSqrt(0.5);
+ Device->ChannelMatrix[BACK_RIGHT][SIDE_RIGHT] = aluSqrt(0.5);
+ goto real_setup;
case AL_FORMAT_71CHN8:
case AL_FORMAT_71CHN16:
case AL_FORMAT_71CHN32:
- Context->ChannelMatrix[BACK_CENTER][BACK_LEFT] = aluSqrt(0.5);
- Context->ChannelMatrix[BACK_CENTER][BACK_RIGHT] = aluSqrt(0.5);
- Context->NumChan = 7;
+ Device->ChannelMatrix[BACK_CENTER][BACK_LEFT] = aluSqrt(0.5);
+ Device->ChannelMatrix[BACK_CENTER][BACK_RIGHT] = aluSqrt(0.5);
+ goto real_setup;
+
+ real_setup:
+ Context->NumChan = 8;
Speaker2Chan[0] = BACK_LEFT;
Speaker2Chan[1] = SIDE_LEFT;
Speaker2Chan[2] = FRONT_LEFT;
@@ -358,6 +317,7 @@ ALvoid aluInitPanning(ALCcontext *Context)
Speaker2Chan[4] = FRONT_RIGHT;
Speaker2Chan[5] = SIDE_RIGHT;
Speaker2Chan[6] = BACK_RIGHT;
+ Speaker2Chan[7] = BACK_CENTER;
SpeakerAngle[0] = -150.0f * M_PI/180.0f;
SpeakerAngle[1] = -90.0f * M_PI/180.0f;
SpeakerAngle[2] = -30.0f * M_PI/180.0f;
@@ -365,7 +325,8 @@ ALvoid aluInitPanning(ALCcontext *Context)
SpeakerAngle[4] = 30.0f * M_PI/180.0f;
SpeakerAngle[5] = 90.0f * M_PI/180.0f;
SpeakerAngle[6] = 150.0f * M_PI/180.0f;
- SetSpeakerArrangement("layout_71CHN", SpeakerAngle, Speaker2Chan, Context->NumChan);
+ SpeakerAngle[7] = 180.0f * M_PI/180.0f;
+ SetSpeakerArrangement("layout_81CHN", SpeakerAngle, Speaker2Chan, Context->NumChan);
break;
default:
@@ -379,12 +340,6 @@ ALvoid aluInitPanning(ALCcontext *Context)
for(s = 0; s < OUTPUTCHANNELS; s++)
Context->PanningLUT[offset+s] = 0.0f;
- if(Context->NumChan == 1)
- {
- Context->PanningLUT[offset + Speaker2Chan[0]] = 1.0f;
- continue;
- }
-
/* source angle */
Theta = aluLUTpos2Angle(pos);
@@ -894,7 +849,6 @@ static void MixSomeSources(ALCcontext *ALContext, float (*DryBuffer)[OUTPUTCHANN
{
static float DummyBuffer[BUFFERSIZE];
ALfloat *WetBuffer[MAX_SENDS];
- ALfloat (*Matrix)[OUTPUTCHANNELS] = ALContext->ChannelMatrix;
ALfloat DrySend[OUTPUTCHANNELS];
ALfloat dryGainStep[OUTPUTCHANNELS];
ALfloat wetGainStep[MAX_SENDS];
@@ -998,21 +952,6 @@ another_source:
DummyBuffer);
}
- if(DuplicateStereo && Channels == 2)
- {
- Matrix[FRONT_LEFT][SIDE_LEFT] = 1.0f;
- Matrix[FRONT_RIGHT][SIDE_RIGHT] = 1.0f;
- Matrix[FRONT_LEFT][BACK_LEFT] = 1.0f;
- Matrix[FRONT_RIGHT][BACK_RIGHT] = 1.0f;
- }
- else if(DuplicateStereo)
- {
- Matrix[FRONT_LEFT][SIDE_LEFT] = 0.0f;
- Matrix[FRONT_RIGHT][SIDE_RIGHT] = 0.0f;
- Matrix[FRONT_LEFT][BACK_LEFT] = 0.0f;
- Matrix[FRONT_RIGHT][BACK_RIGHT] = 0.0f;
- }
-
/* Get current buffer queue item */
BufferListItem = ALSource->queue;
for(i = 0;i < BuffersPlayed && BufferListItem;i++)
@@ -1139,33 +1078,32 @@ another_source:
};
const ALfloat scaler = aluSqrt(1.0f/Channels);
-#define DO_MIX(resampler) do { \
- while(BufferSize--) \
- { \
- for(i = 0;i < OUTPUTCHANNELS;i++) \
- DrySend[i] += dryGainStep[i]; \
- for(i = 0;i < MAX_SENDS;i++) \
- WetSend[i] += wetGainStep[i]; \
- \
- for(i = 0;i < Channels;i++) \
- { \
- value = (resampler)(Data[k*Channels + i], Data[(k+1)*Channels + i], \
- DataPosFrac); \
- outsamp = lpFilter2P(DryFilter, chans[i]*2, value)*DrySend[chans[i]]; \
- for(out = 0;out < OUTPUTCHANNELS;out++) \
- DryBuffer[j][out] += outsamp*Matrix[chans[i]][out]; \
- for(out = 0;out < MAX_SENDS;out++) \
- { \
- outsamp = lpFilter1P(WetFilter[out], chans[i], value); \
- WetBuffer[out][j] += outsamp*WetSend[out]*scaler; \
- } \
- } \
- \
- DataPosFrac += increment; \
- k += DataPosFrac>>FRACTIONBITS; \
- DataPosFrac &= FRACTIONMASK; \
- j++; \
- } \
+#define DO_MIX(resampler) do { \
+ while(BufferSize--) \
+ { \
+ for(i = 0;i < OUTPUTCHANNELS;i++) \
+ DrySend[i] += dryGainStep[i]; \
+ for(i = 0;i < MAX_SENDS;i++) \
+ WetSend[i] += wetGainStep[i]; \
+ \
+ for(i = 0;i < Channels;i++) \
+ { \
+ value = (resampler)(Data[k*Channels + i],Data[(k+1)*Channels + i],\
+ DataPosFrac); \
+ outsamp = lpFilter2P(DryFilter, chans[i]*2, value); \
+ DryBuffer[j][chans[i]] += outsamp*DrySend[chans[i]]; \
+ for(out = 0;out < MAX_SENDS;out++) \
+ { \
+ outsamp = lpFilter1P(WetFilter[out], chans[i], value); \
+ WetBuffer[out][j] += outsamp*WetSend[out]*scaler; \
+ } \
+ } \
+ \
+ DataPosFrac += increment; \
+ k += DataPosFrac>>FRACTIONBITS; \
+ DataPosFrac &= FRACTIONMASK; \
+ j++; \
+ } \
} while(0)
switch(Resampler)
@@ -1338,12 +1276,14 @@ another_source:
ALvoid aluMixData(ALCdevice *device, ALvoid *buffer, ALsizei size)
{
float (*DryBuffer)[OUTPUTCHANNELS];
- const Channel *ChanMap;
+ ALfloat (*Matrix)[OUTPUTCHANNELS];
+ const ALuint *ChanMap;
ALuint SamplesToDo;
ALeffectslot *ALEffectSlot;
ALCcontext *ALContext;
+ ALfloat samp;
int fpuState;
- ALuint i, c;
+ ALuint i, j, c;
#if defined(HAVE_FESETROUND)
fpuState = fegetround();
@@ -1389,14 +1329,17 @@ ALvoid aluMixData(ALCdevice *device, ALvoid *buffer, ALsizei size)
//Post processing loop
ChanMap = device->DevChannels;
+ Matrix = device->ChannelMatrix;
switch(device->Format)
{
#define CHECK_WRITE_FORMAT(bits, type, func) \
case AL_FORMAT_MONO##bits: \
for(i = 0;i < SamplesToDo;i++) \
{ \
- ((type*)buffer)[ChanMap[FRONT_CENTER]] = \
- (func)(DryBuffer[i][FRONT_CENTER]);\
+ samp = 0.0f; \
+ for(c = 0;c < OUTPUTCHANNELS;c++) \
+ samp += DryBuffer[i][c] * Matrix[c][FRONT_CENTER]; \
+ ((type*)buffer)[ChanMap[FRONT_CENTER]] = (func)(samp); \
buffer = ((type*)buffer) + 1; \
} \
break; \
@@ -1405,12 +1348,15 @@ ALvoid aluMixData(ALCdevice *device, ALvoid *buffer, ALsizei size)
{ \
for(i = 0;i < SamplesToDo;i++) \
{ \
- float samples[2]; \
- samples[0] = DryBuffer[i][FRONT_LEFT]; \
- samples[1] = DryBuffer[i][FRONT_RIGHT]; \
+ float samples[2] = { 0.0f, 0.0f }; \
+ for(c = 0;c < OUTPUTCHANNELS;c++) \
+ { \
+ samples[0] += DryBuffer[i][c]*Matrix[c][FRONT_LEFT]; \
+ samples[1] += DryBuffer[i][c]*Matrix[c][FRONT_RIGHT]; \
+ } \
bs2b_cross_feed(device->Bs2b, samples); \
((type*)buffer)[ChanMap[FRONT_LEFT]] = (func)(samples[0]);\
- ((type*)buffer)[ChanMap[FRONT_RIGHT]] =(func)(samples[1]);\
+ ((type*)buffer)[ChanMap[FRONT_RIGHT]]= (func)(samples[1]);\
buffer = ((type*)buffer) + 2; \
} \
} \
@@ -1418,10 +1364,16 @@ ALvoid aluMixData(ALCdevice *device, ALvoid *buffer, ALsizei size)
{ \
for(i = 0;i < SamplesToDo;i++) \
{ \
- ((type*)buffer)[ChanMap[FRONT_LEFT]] = \
- (func)(DryBuffer[i][FRONT_LEFT]);\
- ((type*)buffer)[ChanMap[FRONT_RIGHT]] = \
- (func)(DryBuffer[i][FRONT_RIGHT]);\
+ static const Channel chans[] = { \
+ FRONT_LEFT, FRONT_RIGHT \
+ }; \
+ for(j = 0;j < 2;j++) \
+ { \
+ samp = 0.0f; \
+ for(c = 0;c < OUTPUTCHANNELS;c++) \
+ samp += DryBuffer[i][c] * Matrix[c][chans[j]]; \
+ ((type*)buffer)[ChanMap[chans[j]]] = (func)(samp); \
+ } \
buffer = ((type*)buffer) + 2; \
} \
} \
@@ -1429,71 +1381,72 @@ ALvoid aluMixData(ALCdevice *device, ALvoid *buffer, ALsizei size)
case AL_FORMAT_QUAD##bits: \
for(i = 0;i < SamplesToDo;i++) \
{ \
- ((type*)buffer)[ChanMap[FRONT_LEFT]] = \
- (func)(DryBuffer[i][FRONT_LEFT]);\
- ((type*)buffer)[ChanMap[FRONT_RIGHT]] = \
- (func)(DryBuffer[i][FRONT_RIGHT]);\
- ((type*)buffer)[ChanMap[BACK_LEFT]] = \
- (func)(DryBuffer[i][BACK_LEFT]);\
- ((type*)buffer)[ChanMap[BACK_RIGHT]] = \
- (func)(DryBuffer[i][BACK_RIGHT]);\
+ static const Channel chans[] = { \
+ FRONT_LEFT, FRONT_RIGHT, \
+ BACK_LEFT, BACK_RIGHT, \
+ }; \
+ for(j = 0;j < 4;j++) \
+ { \
+ samp = 0.0f; \
+ for(c = 0;c < OUTPUTCHANNELS;c++) \
+ samp += DryBuffer[i][c] * Matrix[c][chans[j]]; \
+ ((type*)buffer)[ChanMap[chans[j]]] = (func)(samp); \
+ } \
buffer = ((type*)buffer) + 4; \
} \
break; \
case AL_FORMAT_51CHN##bits: \
for(i = 0;i < SamplesToDo;i++) \
{ \
- ((type*)buffer)[ChanMap[FRONT_LEFT]] = \
- (func)(DryBuffer[i][FRONT_LEFT]);\
- ((type*)buffer)[ChanMap[FRONT_RIGHT]] = \
- (func)(DryBuffer[i][FRONT_RIGHT]);\
- ((type*)buffer)[ChanMap[FRONT_CENTER]] = \
- (func)(DryBuffer[i][FRONT_CENTER]);\
- ((type*)buffer)[ChanMap[LFE]] = (func)(DryBuffer[i][LFE]); \
- ((type*)buffer)[ChanMap[BACK_LEFT]] = \
- (func)(DryBuffer[i][BACK_LEFT]);\
- ((type*)buffer)[ChanMap[BACK_RIGHT]] = \
- (func)(DryBuffer[i][BACK_RIGHT]);\
+ static const Channel chans[] = { \
+ FRONT_LEFT, FRONT_RIGHT, \
+ FRONT_CENTER, LFE, \
+ BACK_LEFT, BACK_RIGHT, \
+ }; \
+ for(j = 0;j < 6;j++) \
+ { \
+ samp = 0.0f; \
+ for(c = 0;c < OUTPUTCHANNELS;c++) \
+ samp += DryBuffer[i][c] * Matrix[c][chans[j]]; \
+ ((type*)buffer)[ChanMap[chans[j]]] = (func)(samp); \
+ } \
buffer = ((type*)buffer) + 6; \
} \
break; \
case AL_FORMAT_61CHN##bits: \
for(i = 0;i < SamplesToDo;i++) \
{ \
- ((type*)buffer)[ChanMap[FRONT_LEFT]] = \
- (func)(DryBuffer[i][FRONT_LEFT]);\
- ((type*)buffer)[ChanMap[FRONT_RIGHT]] = \
- (func)(DryBuffer[i][FRONT_RIGHT]);\
- ((type*)buffer)[ChanMap[FRONT_CENTER]] = \
- (func)(DryBuffer[i][FRONT_CENTER]);\
- ((type*)buffer)[ChanMap[LFE]] = (func)(DryBuffer[i][LFE]); \
- ((type*)buffer)[ChanMap[BACK_CENTER]] = \
- (func)(DryBuffer[i][BACK_CENTER]);\
- ((type*)buffer)[ChanMap[SIDE_LEFT]] = \
- (func)(DryBuffer[i][SIDE_LEFT]);\
- ((type*)buffer)[ChanMap[SIDE_RIGHT]] = \
- (func)(DryBuffer[i][SIDE_RIGHT]);\
+ static const Channel chans[] = { \
+ FRONT_LEFT, FRONT_RIGHT, \
+ FRONT_CENTER, LFE, BACK_CENTER, \
+ SIDE_LEFT, SIDE_RIGHT, \
+ }; \
+ for(j = 0;j < 7;j++) \
+ { \
+ samp = 0.0f; \
+ for(c = 0;c < OUTPUTCHANNELS;c++) \
+ samp += DryBuffer[i][c] * Matrix[c][chans[j]]; \
+ ((type*)buffer)[ChanMap[chans[j]]] = (func)(samp); \
+ } \
buffer = ((type*)buffer) + 7; \
} \
break; \
case AL_FORMAT_71CHN##bits: \
for(i = 0;i < SamplesToDo;i++) \
{ \
- ((type*)buffer)[ChanMap[FRONT_LEFT]] = \
- (func)(DryBuffer[i][FRONT_LEFT]);\
- ((type*)buffer)[ChanMap[FRONT_RIGHT]] = \
- (func)(DryBuffer[i][FRONT_RIGHT]);\
- ((type*)buffer)[ChanMap[FRONT_CENTER]] = \
- (func)(DryBuffer[i][FRONT_CENTER]);\
- ((type*)buffer)[ChanMap[LFE]] = (func)(DryBuffer[i][LFE]); \
- ((type*)buffer)[ChanMap[BACK_LEFT]] = \
- (func)(DryBuffer[i][BACK_LEFT]);\
- ((type*)buffer)[ChanMap[BACK_RIGHT]] = \
- (func)(DryBuffer[i][BACK_RIGHT]);\
- ((type*)buffer)[ChanMap[SIDE_LEFT]] = \
- (func)(DryBuffer[i][SIDE_LEFT]);\
- ((type*)buffer)[ChanMap[SIDE_RIGHT]] = \
- (func)(DryBuffer[i][SIDE_RIGHT]);\
+ static const Channel chans[] = { \
+ FRONT_LEFT, FRONT_RIGHT, \
+ FRONT_CENTER, LFE, \
+ BACK_LEFT, BACK_RIGHT, \
+ SIDE_LEFT, SIDE_RIGHT \
+ }; \
+ for(j = 0;j < 8;j++) \
+ { \
+ samp = 0.0f; \
+ for(c = 0;c < OUTPUTCHANNELS;c++) \
+ samp += DryBuffer[i][c] * Matrix[c][chans[j]]; \
+ ((type*)buffer)[ChanMap[chans[j]]] = (func)(samp); \
+ } \
buffer = ((type*)buffer) + 8; \
} \
break;
diff --git a/OpenAL32/Include/alMain.h b/OpenAL32/Include/alMain.h
index 617119ff..e5c1f63b 100644
--- a/OpenAL32/Include/alMain.h
+++ b/OpenAL32/Include/alMain.h
@@ -277,6 +277,8 @@ struct ALCdevice_struct
ALuint DevChannels[OUTPUTCHANNELS];
+ ALfloat ChannelMatrix[OUTPUTCHANNELS][OUTPUTCHANNELS];
+
// Contexts created on this device
ALCcontext **Contexts;
ALuint NumContexts;
@@ -325,8 +327,6 @@ struct ALCcontext_struct
ALfloat PanningLUT[OUTPUTCHANNELS * LUT_NUM];
ALint NumChan;
- ALfloat ChannelMatrix[OUTPUTCHANNELS][OUTPUTCHANNELS];
-
ALCdevice *Device;
const ALCchar *ExtensionList;