diff -r ec9b9e71f51b src/audio/SDL_audiotypecvt.c --- a/src/audio/SDL_audiotypecvt.c Mon Oct 16 15:22:40 2017 -0700 +++ b/src/audio/SDL_audiotypecvt.c Wed Oct 18 06:49:16 2017 +0200 @@ -66,6 +66,12 @@ #if NEED_SCALAR_CONVERTER_FALLBACKS +static float +clampfloat(float f) +{ + return f > 1.0f ? 1.0f : f < -1.0f ? -1.0f : f; +} + static void SDLCALL SDL_Convert_S8_to_F32_Scalar(SDL_AudioCVT *cvt, SDL_AudioFormat format) { @@ -170,7 +176,7 @@ LOG_DEBUG_CONVERT("AUDIO_F32", "AUDIO_S8"); for (i = cvt->len_cvt / sizeof (float); i; --i, ++src, ++dst) { - *dst = (Sint8) (*src * 127.0f); + *dst = (Sint8) (clampfloat(*src) * 127.0f); } cvt->len_cvt /= 4; @@ -189,7 +195,7 @@ LOG_DEBUG_CONVERT("AUDIO_F32", "AUDIO_U8"); for (i = cvt->len_cvt / sizeof (float); i; --i, ++src, ++dst) { - *dst = (Uint8) ((*src + 1.0f) * 127.0f); + *dst = (Uint8) ((clampfloat(*src) + 1.0f) * 127.0f); } cvt->len_cvt /= 4; @@ -208,7 +214,7 @@ LOG_DEBUG_CONVERT("AUDIO_F32", "AUDIO_S16"); for (i = cvt->len_cvt / sizeof (float); i; --i, ++src, ++dst) { - *dst = (Sint16) (*src * 32767.0f); + *dst = (Sint16) (clampfloat(*src) * 32767.0f); } cvt->len_cvt /= 2; @@ -227,7 +233,7 @@ LOG_DEBUG_CONVERT("AUDIO_F32", "AUDIO_U16"); for (i = cvt->len_cvt / sizeof (float); i; --i, ++src, ++dst) { - *dst = (Uint16) ((*src + 1.0f) * 32767.0f); + *dst = (Uint16) ((clampfloat(*src) + 1.0f) * 32767.0f); } cvt->len_cvt /= 2; @@ -246,7 +252,7 @@ LOG_DEBUG_CONVERT("AUDIO_F32", "AUDIO_S32"); for (i = cvt->len_cvt / sizeof (float); i; --i, ++src, ++dst) { - *dst = (Sint32) (((double) *src) * 2147483647.0); + *dst = (Sint32) (((double) clampfloat(*src)) * 2147483647.0); } if (cvt->filters[++cvt->filter_index]) {