Make stereo duplication a property of the device

Further, don't use it with mono/stereo output
This commit is contained in:
Chris Robinson 2010-04-20 03:57:40 -07:00
parent 81dd71dd71
commit a04dac670e
4 changed files with 11 additions and 6 deletions

View File

@ -337,8 +337,6 @@ static void alc_init(void)
for(i = 0;BackendList[i].Init;i++) for(i = 0;BackendList[i].Init;i++)
BackendList[i].Init(&BackendList[i].Funcs); BackendList[i].Init(&BackendList[i].Funcs);
DuplicateStereo = GetConfigValueBool(NULL, "stereodup", 0);
str = GetConfigValue(NULL, "excludefx", ""); str = GetConfigValue(NULL, "excludefx", "");
if(str[0]) if(str[0])
{ {

View File

@ -45,8 +45,6 @@
* adequately reduce clicks and pops from harsh gain changes. */ * adequately reduce clicks and pops from harsh gain changes. */
#define MIN_RAMP_LENGTH 16 #define MIN_RAMP_LENGTH 16
ALboolean DuplicateStereo = AL_FALSE;
static __inline ALfloat aluF2F(ALfloat Value) static __inline ALfloat aluF2F(ALfloat Value)
{ {
@ -250,6 +248,7 @@ ALvoid aluInitPanning(ALCdevice *Device)
case AL_FORMAT_MONO8: case AL_FORMAT_MONO8:
case AL_FORMAT_MONO16: case AL_FORMAT_MONO16:
case AL_FORMAT_MONO_FLOAT32: case AL_FORMAT_MONO_FLOAT32:
Device->DuplicateStereo = AL_FALSE;
Device->ChannelMatrix[FRONT_LEFT][FRONT_CENTER] = aluSqrt(0.5); Device->ChannelMatrix[FRONT_LEFT][FRONT_CENTER] = aluSqrt(0.5);
Device->ChannelMatrix[FRONT_RIGHT][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_LEFT][FRONT_CENTER] = aluSqrt(0.5);
@ -265,6 +264,7 @@ ALvoid aluInitPanning(ALCdevice *Device)
case AL_FORMAT_STEREO8: case AL_FORMAT_STEREO8:
case AL_FORMAT_STEREO16: case AL_FORMAT_STEREO16:
case AL_FORMAT_STEREO_FLOAT32: case AL_FORMAT_STEREO_FLOAT32:
Device->DuplicateStereo = AL_FALSE;
Device->ChannelMatrix[FRONT_CENTER][FRONT_LEFT] = aluSqrt(0.5); Device->ChannelMatrix[FRONT_CENTER][FRONT_LEFT] = aluSqrt(0.5);
Device->ChannelMatrix[FRONT_CENTER][FRONT_RIGHT] = aluSqrt(0.5); Device->ChannelMatrix[FRONT_CENTER][FRONT_RIGHT] = aluSqrt(0.5);
Device->ChannelMatrix[SIDE_LEFT][FRONT_LEFT] = 1.0f; Device->ChannelMatrix[SIDE_LEFT][FRONT_LEFT] = 1.0f;
@ -284,6 +284,7 @@ ALvoid aluInitPanning(ALCdevice *Device)
case AL_FORMAT_QUAD8: case AL_FORMAT_QUAD8:
case AL_FORMAT_QUAD16: case AL_FORMAT_QUAD16:
case AL_FORMAT_QUAD32: case AL_FORMAT_QUAD32:
Device->DuplicateStereo = GetConfigValueBool(NULL, "stereodup", 0);
Device->ChannelMatrix[FRONT_CENTER][FRONT_LEFT] = aluSqrt(0.5); Device->ChannelMatrix[FRONT_CENTER][FRONT_LEFT] = aluSqrt(0.5);
Device->ChannelMatrix[FRONT_CENTER][FRONT_RIGHT] = 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][FRONT_LEFT] = aluSqrt(0.5);
@ -307,6 +308,7 @@ ALvoid aluInitPanning(ALCdevice *Device)
case AL_FORMAT_51CHN8: case AL_FORMAT_51CHN8:
case AL_FORMAT_51CHN16: case AL_FORMAT_51CHN16:
case AL_FORMAT_51CHN32: case AL_FORMAT_51CHN32:
Device->DuplicateStereo = GetConfigValueBool(NULL, "stereodup", 0);
Device->ChannelMatrix[SIDE_LEFT][FRONT_LEFT] = aluSqrt(0.5); Device->ChannelMatrix[SIDE_LEFT][FRONT_LEFT] = aluSqrt(0.5);
Device->ChannelMatrix[SIDE_LEFT][BACK_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][FRONT_RIGHT] = aluSqrt(0.5);
@ -330,6 +332,7 @@ ALvoid aluInitPanning(ALCdevice *Device)
case AL_FORMAT_61CHN8: case AL_FORMAT_61CHN8:
case AL_FORMAT_61CHN16: case AL_FORMAT_61CHN16:
case AL_FORMAT_61CHN32: case AL_FORMAT_61CHN32:
Device->DuplicateStereo = GetConfigValueBool(NULL, "stereodup", 0);
Device->ChannelMatrix[BACK_LEFT][BACK_CENTER] = aluSqrt(0.5); Device->ChannelMatrix[BACK_LEFT][BACK_CENTER] = aluSqrt(0.5);
Device->ChannelMatrix[BACK_LEFT][SIDE_LEFT] = 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][BACK_CENTER] = aluSqrt(0.5);
@ -353,6 +356,7 @@ ALvoid aluInitPanning(ALCdevice *Device)
case AL_FORMAT_71CHN8: case AL_FORMAT_71CHN8:
case AL_FORMAT_71CHN16: case AL_FORMAT_71CHN16:
case AL_FORMAT_71CHN32: case AL_FORMAT_71CHN32:
Device->DuplicateStereo = GetConfigValueBool(NULL, "stereodup", 0);
Device->ChannelMatrix[BACK_CENTER][BACK_LEFT] = aluSqrt(0.5); Device->ChannelMatrix[BACK_CENTER][BACK_LEFT] = aluSqrt(0.5);
Device->ChannelMatrix[BACK_CENTER][BACK_RIGHT] = aluSqrt(0.5); Device->ChannelMatrix[BACK_CENTER][BACK_RIGHT] = aluSqrt(0.5);
Device->NumChan = 7; Device->NumChan = 7;
@ -923,6 +927,7 @@ static void MixSomeSources(ALCcontext *ALContext, float (*DryBuffer)[OUTPUTCHANN
FILTER *DryFilter, *WetFilter[MAX_SENDS]; FILTER *DryFilter, *WetFilter[MAX_SENDS];
ALfloat WetSend[MAX_SENDS]; ALfloat WetSend[MAX_SENDS];
ALuint rampLength; ALuint rampLength;
ALboolean DuplicateStereo;
ALuint DeviceFreq; ALuint DeviceFreq;
ALint increment; ALint increment;
ALuint DataPosInt, DataPosFrac; ALuint DataPosInt, DataPosFrac;
@ -936,6 +941,7 @@ static void MixSomeSources(ALCcontext *ALContext, float (*DryBuffer)[OUTPUTCHANN
if(!(ALSource=ALContext->SourceList)) if(!(ALSource=ALContext->SourceList))
return; return;
DuplicateStereo = ALContext->Device->DuplicateStereo;
DeviceFreq = ALContext->Device->Frequency; DeviceFreq = ALContext->Device->Frequency;
rampLength = DeviceFreq * MIN_RAMP_LENGTH / 1000; rampLength = DeviceFreq * MIN_RAMP_LENGTH / 1000;

View File

@ -272,6 +272,9 @@ struct ALCdevice_struct
// Simulated dampening from head occlusion // Simulated dampening from head occlusion
ALfloat HeadDampen; ALfloat HeadDampen;
// Duplicate stereo sources on the side/rear channels
ALboolean DuplicateStereo;
// Dry path buffer mix // Dry path buffer mix
float DryBuffer[BUFFERSIZE][OUTPUTCHANNELS]; float DryBuffer[BUFFERSIZE][OUTPUTCHANNELS];

View File

@ -76,8 +76,6 @@ typedef enum {
#define BUFFERSIZE 16384 #define BUFFERSIZE 16384
extern ALboolean DuplicateStereo;
/* NOTE: The AL_FORMAT_REAR* enums aren't handled here be cause they're /* NOTE: The AL_FORMAT_REAR* enums aren't handled here be cause they're
* converted to AL_FORMAT_QUAD* when loaded */ * converted to AL_FORMAT_QUAD* when loaded */
static __inline ALuint aluBytesFromFormat(ALenum format) static __inline ALuint aluBytesFromFormat(ALenum format)