From 733cd120b35d14f36ec82fd87df9b26b35da2da1 Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Tue, 1 Jan 2008 06:16:19 -0800 Subject: [PATCH 1/2] Fix channel ordering for multichannel buffers --- Alc/ALu.c | 46 ++++++++++++++++++++++++---------------------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/Alc/ALu.c b/Alc/ALu.c index c35b050f..cb79ee56 100644 --- a/Alc/ALu.c +++ b/Alc/ALu.c @@ -607,28 +607,6 @@ ALvoid aluMixData(ALCcontext *ALContext,ALvoid *buffer,ALsizei size,ALenum forma if(Channels >= 4) { int i = 2; - if(Channels >= 7) - { - //First order interpolator (side left) - value = (ALfloat)((ALshort)(((Data[k*Channels+2]*((1L<>FRACTIONBITS)); - DryBuffer[j][SIDE_LEFT] += value*DrySend[SIDE_LEFT]; - WetBuffer[j][SIDE_LEFT] += value*WetSend[SIDE_LEFT]; - //First order interpolator (side right) - value = (ALfloat)((ALshort)(((Data[k*Channels+3]*((1L<>FRACTIONBITS)); - DryBuffer[j][SIDE_RIGHT] += value*DrySend[SIDE_RIGHT]; - WetBuffer[j][SIDE_RIGHT] += value*WetSend[SIDE_RIGHT]; - i += 2; - } - //First order interpolator (back left) - value = (ALfloat)((ALshort)(((Data[k*Channels+i]*((1L<>FRACTIONBITS)); - DryBuffer[j][BACK_LEFT] += value*DrySend[BACK_LEFT]; - WetBuffer[j][BACK_LEFT] += value*WetSend[BACK_LEFT]; - i++; - //First order interpolator (back right) - value = (ALfloat)((ALshort)(((Data[k*Channels+i]*((1L<>FRACTIONBITS)); - DryBuffer[j][BACK_RIGHT] += value*DrySend[BACK_RIGHT]; - WetBuffer[j][BACK_RIGHT] += value*WetSend[BACK_RIGHT]; - i++; if(Channels >= 6) { if(Channels != 7) @@ -643,6 +621,30 @@ ALvoid aluMixData(ALCcontext *ALContext,ALvoid *buffer,ALsizei size,ALenum forma value = (ALfloat)((ALshort)(((Data[k*Channels+i]*((1L<>FRACTIONBITS)); DryBuffer[j][LFE] += value*DrySend[LFE]; WetBuffer[j][LFE] += value*WetSend[LFE]; + i++; + } + //First order interpolator (back left) + value = (ALfloat)((ALshort)(((Data[k*Channels+i]*((1L<>FRACTIONBITS)); + DryBuffer[j][BACK_LEFT] += value*DrySend[BACK_LEFT]; + WetBuffer[j][BACK_LEFT] += value*WetSend[BACK_LEFT]; + i++; + //First order interpolator (back right) + value = (ALfloat)((ALshort)(((Data[k*Channels+i]*((1L<>FRACTIONBITS)); + DryBuffer[j][BACK_RIGHT] += value*DrySend[BACK_RIGHT]; + WetBuffer[j][BACK_RIGHT] += value*WetSend[BACK_RIGHT]; + i++; + if(Channels >= 7) + { + //First order interpolator (side left) + value = (ALfloat)((ALshort)(((Data[k*Channels+i]*((1L<>FRACTIONBITS)); + DryBuffer[j][SIDE_LEFT] += value*DrySend[SIDE_LEFT]; + WetBuffer[j][SIDE_LEFT] += value*WetSend[SIDE_LEFT]; + i++; + //First order interpolator (side right) + value = (ALfloat)((ALshort)(((Data[k*Channels+i]*((1L<>FRACTIONBITS)); + DryBuffer[j][SIDE_RIGHT] += value*DrySend[SIDE_RIGHT]; + WetBuffer[j][SIDE_RIGHT] += value*WetSend[SIDE_RIGHT]; + i++; } } } From 7ef623c71d092f696f5bd7f7170ba475728ecccf Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Tue, 1 Jan 2008 06:25:00 -0800 Subject: [PATCH 2/2] Fail if OSS can't set the requested bit depth and channel count --- Alc/oss.c | 47 +++++++++-------------------------------------- 1 file changed, 9 insertions(+), 38 deletions(-) diff --git a/Alc/oss.c b/Alc/oss.c index a63acb9b..a5c2fef4 100644 --- a/Alc/oss.c +++ b/Alc/oss.c @@ -215,49 +215,20 @@ static ALCboolean oss_open_playback(ALCdevice *device, const ALCchar *deviceName } #undef ok - device->Channels = numChannels; device->Frequency = ossSpeed; - device->Format = 0; - if(ossFormat == AFMT_U8) + + if((int)device->Channels != numChannels) { - if(device->Channels == 1) - { - device->Format = AL_FORMAT_MONO8; - device->FrameSize = 1; - } - else if(device->Channels == 2) - { - device->Format = AL_FORMAT_STEREO8; - device->FrameSize = 2; - } - else if(device->Channels == 4) - { - device->Format = AL_FORMAT_QUAD8; - device->FrameSize = 4; - } - } - else if(ossFormat == AFMT_S16_NE) - { - if(device->Channels == 1) - { - device->Format = AL_FORMAT_MONO16; - device->FrameSize = 2; - } - else if(device->Channels == 2) - { - device->Format = AL_FORMAT_STEREO16; - device->FrameSize = 4; - } - else if(device->Channels == 4) - { - device->Format = AL_FORMAT_QUAD16; - device->FrameSize = 8; - } + AL_PRINT("Could not set %d channels, got %d instead\n", device->Channels, numChannels); + close(data->fd); + free(data); + return ALC_FALSE; } - if(!device->Format) + if(!((ossFormat == AFMT_U8 && aluBytesFromFormat(device->Format) == 1) || + (ossFormat == AFMT_S16_NE && aluBytesFromFormat(device->Format) == 2))) { - AL_PRINT("returned unknown format: %#x %d!\n", ossFormat, numChannels); + AL_PRINT("Could not set %d-bit output, got format %#x\n", aluBytesFromFormat(device->Format)*8, ossFormat); close(data->fd); free(data); return ALC_FALSE;