From 19cf0b67c78eb6574a15091c99c39f60c8500f31 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Sun, 24 Sep 2006 15:56:36 +0000 Subject: [PATCH] Fixed bug #292 I might be on crack here. It looks like SDL_ConvertMono() in src/audio/SDL_audiocvt.c adds the left and right channels of a stereo stream together, and clamps the new mono channel if it would overflow. Shouldn't it be dividing by 2 to average the two sample points instead of clamping? Otherwise the mono sample point's volume doubles in the conversion. This would also make the conversion faster, as it replaces two branches per sample frame with a bitwise shift. --ryan. --- src/audio/SDL_audiocvt.c | 68 +++++++++++----------------------------- 1 file changed, 18 insertions(+), 50 deletions(-) diff --git a/src/audio/SDL_audiocvt.c b/src/audio/SDL_audiocvt.c index 271922c51..97acf41f1 100644 --- a/src/audio/SDL_audiocvt.c +++ b/src/audio/SDL_audiocvt.c @@ -45,11 +45,7 @@ SDL_ConvertMono(SDL_AudioCVT * cvt, SDL_AudioFormat format) dst = cvt->buf; for (i = cvt->len_cvt / 2; i; --i) { sample = src[0] + src[1]; - if (sample > 255) { - *dst = 255; - } else { - *dst = (Uint8) sample; - } + *dst = (Uint8) (sample / 2); src += 2; dst += 1; } @@ -64,13 +60,7 @@ SDL_ConvertMono(SDL_AudioCVT * cvt, SDL_AudioFormat format) dst = (Sint8 *) cvt->buf; for (i = cvt->len_cvt / 2; i; --i) { sample = src[0] + src[1]; - if (sample > 127) { - *dst = 127; - } else if (sample < -128) { - *dst = -128; - } else { - *dst = (Sint8) sample; - } + *dst = (Sint8) (sample / 2); src += 2; dst += 1; } @@ -87,14 +77,10 @@ SDL_ConvertMono(SDL_AudioCVT * cvt, SDL_AudioFormat format) for (i = cvt->len_cvt / 4; i; --i) { sample = (Uint16) ((src[0] << 8) | src[1]) + (Uint16) ((src[2] << 8) | src[3]); - if (sample > 65535) { - dst[0] = 0xFF; - dst[1] = 0xFF; - } else { - dst[1] = (sample & 0xFF); - sample >>= 8; - dst[0] = (sample & 0xFF); - } + sample /= 2; + dst[1] = (sample & 0xFF); + sample >>= 8; + dst[0] = (sample & 0xFF); src += 4; dst += 2; } @@ -102,14 +88,10 @@ SDL_ConvertMono(SDL_AudioCVT * cvt, SDL_AudioFormat format) for (i = cvt->len_cvt / 4; i; --i) { sample = (Uint16) ((src[1] << 8) | src[0]) + (Uint16) ((src[3] << 8) | src[2]); - if (sample > 65535) { - dst[0] = 0xFF; - dst[1] = 0xFF; - } else { - dst[0] = (sample & 0xFF); - sample >>= 8; - dst[1] = (sample & 0xFF); - } + sample /= 2; + dst[0] = (sample & 0xFF); + sample >>= 8; + dst[1] = (sample & 0xFF); src += 4; dst += 2; } @@ -127,17 +109,10 @@ SDL_ConvertMono(SDL_AudioCVT * cvt, SDL_AudioFormat format) for (i = cvt->len_cvt / 4; i; --i) { sample = (Sint16) ((src[0] << 8) | src[1]) + (Sint16) ((src[2] << 8) | src[3]); - if (sample > 32767) { - dst[0] = 0x7F; - dst[1] = 0xFF; - } else if (sample < -32768) { - dst[0] = 0x80; - dst[1] = 0x00; - } else { - dst[1] = (sample & 0xFF); - sample >>= 8; - dst[0] = (sample & 0xFF); - } + sample /= 2; + dst[1] = (sample & 0xFF); + sample >>= 8; + dst[0] = (sample & 0xFF); src += 4; dst += 2; } @@ -145,17 +120,10 @@ SDL_ConvertMono(SDL_AudioCVT * cvt, SDL_AudioFormat format) for (i = cvt->len_cvt / 4; i; --i) { sample = (Sint16) ((src[1] << 8) | src[0]) + (Sint16) ((src[3] << 8) | src[2]); - if (sample > 32767) { - dst[1] = 0x7F; - dst[0] = 0xFF; - } else if (sample < -32768) { - dst[1] = 0x80; - dst[0] = 0x00; - } else { - dst[0] = (sample & 0xFF); - sample >>= 8; - dst[1] = (sample & 0xFF); - } + sample /= 2; + dst[0] = (sample & 0xFF); + sample >>= 8; + dst[1] = (sample & 0xFF); src += 4; dst += 2; }