From 63f70fc5be5fa8ddc358675fd4e74b7c2e9bb498 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Sun, 24 Sep 2006 15:45:37 +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-- branch : SDL-1.2 --- src/audio/SDL_audiocvt.c | 71 ++++++++++------------------------------ 1 file changed, 18 insertions(+), 53 deletions(-) diff --git a/src/audio/SDL_audiocvt.c b/src/audio/SDL_audiocvt.c index 24afd0f0a..68c99e1ae 100644 --- a/src/audio/SDL_audiocvt.c +++ b/src/audio/SDL_audiocvt.c @@ -44,11 +44,7 @@ void SDLCALL SDL_ConvertMono(SDL_AudioCVT *cvt, Uint16 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; } @@ -62,14 +58,7 @@ void SDLCALL SDL_ConvertMono(SDL_AudioCVT *cvt, Uint16 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; } @@ -85,14 +74,10 @@ void SDLCALL SDL_ConvertMono(SDL_AudioCVT *cvt, Uint16 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; } @@ -100,14 +85,10 @@ void SDLCALL SDL_ConvertMono(SDL_AudioCVT *cvt, Uint16 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; } @@ -124,18 +105,10 @@ void SDLCALL SDL_ConvertMono(SDL_AudioCVT *cvt, Uint16 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; } @@ -143,18 +116,10 @@ void SDLCALL SDL_ConvertMono(SDL_AudioCVT *cvt, Uint16 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; }