From d0a80f6b53b873d5903c3e6d6fca3beea63e8bf3 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. --HG-- extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%402119 --- 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; }