summaryrefslogtreecommitdiffstats
path: root/Alc/ALu.c
diff options
context:
space:
mode:
authorChris Robinson <[email protected]>2008-02-06 22:18:50 -0800
committerChris Robinson <[email protected]>2008-02-06 22:18:50 -0800
commitb4ffdfab81827626a3da2882218d401fd83cf375 (patch)
treeae5a0cc574ca67c5b0a6f77c7f4ea7ee32ece8de /Alc/ALu.c
parent1ea4aac799b1751dc0616259ed9c167152da72c7 (diff)
Add an option for duplicating stereo sources on the back speakers
Diffstat (limited to 'Alc/ALu.c')
-rw-r--r--Alc/ALu.c23
1 files changed, 17 insertions, 6 deletions
diff --git a/Alc/ALu.c b/Alc/ALu.c
index 79603425..756dce20 100644
--- a/Alc/ALu.c
+++ b/Alc/ALu.c
@@ -82,6 +82,8 @@ enum {
OUTPUTCHANNELS
};
+ALboolean DuplicateStereo = AL_FALSE;
+
/* NOTE: The AL_FORMAT_REAR* enums aren't handled here be cause they're
* converted to AL_FORMAT_QUAD* when loaded */
__inline ALuint aluBytesFromFormat(ALenum format)
@@ -752,14 +754,15 @@ ALvoid aluMixData(ALCcontext *ALContext,ALvoid *buffer,ALsizei size,ALenum forma
}
else
{
+ ALfloat samp1, samp2;
//First order interpolator (front left)
- value = (ALfloat)((ALshort)(((Data[k*Channels ]*((1L<<FRACTIONBITS)-fraction))+(Data[(k+1)*Channels ]*(fraction)))>>FRACTIONBITS));
- DryBuffer[j][FRONT_LEFT] += value*DrySend[FRONT_LEFT];
- WetBuffer[j][FRONT_LEFT] += value*WetSend[FRONT_LEFT];
+ samp1 = (ALfloat)((ALshort)(((Data[k*Channels ]*((1L<<FRACTIONBITS)-fraction))+(Data[(k+1)*Channels ]*(fraction)))>>FRACTIONBITS));
+ DryBuffer[j][FRONT_LEFT] += samp1*DrySend[FRONT_LEFT];
+ WetBuffer[j][FRONT_LEFT] += samp1*WetSend[FRONT_LEFT];
//First order interpolator (front right)
- value = (ALfloat)((ALshort)(((Data[k*Channels+1]*((1L<<FRACTIONBITS)-fraction))+(Data[(k+1)*Channels+1]*(fraction)))>>FRACTIONBITS));
- DryBuffer[j][FRONT_RIGHT] += value*DrySend[FRONT_RIGHT];
- WetBuffer[j][FRONT_RIGHT] += value*WetSend[FRONT_RIGHT];
+ samp2 = (ALfloat)((ALshort)(((Data[k*Channels+1]*((1L<<FRACTIONBITS)-fraction))+(Data[(k+1)*Channels+1]*(fraction)))>>FRACTIONBITS));
+ DryBuffer[j][FRONT_RIGHT] += samp2*DrySend[FRONT_RIGHT];
+ WetBuffer[j][FRONT_RIGHT] += samp2*WetSend[FRONT_RIGHT];
if(Channels >= 4)
{
int i = 2;
@@ -803,6 +806,14 @@ ALvoid aluMixData(ALCcontext *ALContext,ALvoid *buffer,ALsizei size,ALenum forma
i++;
}
}
+ else if(DuplicateStereo)
+ {
+ //Duplicate stereo channels on the back speakers
+ DryBuffer[j][BACK_LEFT] += samp1*DrySend[BACK_LEFT];
+ WetBuffer[j][BACK_LEFT] += samp1*WetSend[BACK_LEFT];
+ DryBuffer[j][BACK_RIGHT] += samp2*DrySend[BACK_RIGHT];
+ WetBuffer[j][BACK_RIGHT] += samp2*WetSend[BACK_RIGHT];
+ }
}
DataPosFrac += increment;
j++;