From: Kevin P. Fleming Date: Fri, 28 Oct 2005 21:35:55 +0000 (+0000) Subject: ensure that SLINEAR volume adjustments don't wrap around short integer maximums X-Git-Tag: 1.2.0-beta2~42 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8dad624c68b5f920f810f76e3b49741f991b6ae6;p=thirdparty%2Fasterisk.git ensure that SLINEAR volume adjustments don't wrap around short integer maximums git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@6882 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/frame.c b/frame.c index 7b4fa4ddf5..39bed2e01d 100755 --- a/frame.c +++ b/frame.c @@ -1263,9 +1263,9 @@ int ast_frame_adjust_volume(struct ast_frame *f, int adjustment) for (count = 0; count < f->samples; count++) { if (adjustment > 0) { - fdata[count] *= abs(adjustment); + ast_slinear_saturated_multiply(&fdata[count], abs(adjustment)); } else if (adjustment < 0) { - fdata[count] /= abs(adjustment); + ast_slinear_saturated_divide(&fdata[count], abs(adjustment)); } } diff --git a/include/asterisk/utils.h b/include/asterisk/utils.h index e0c32597de..9aa1a34c3f 100755 --- a/include/asterisk/utils.h +++ b/include/asterisk/utils.h @@ -168,7 +168,37 @@ char *ast_uri_encode(char *string, char *outbuf, int buflen, int doreserved); \param s String to be decoded */ void ast_uri_decode(char *s); + +static inline void ast_slinear_saturated_add(short *input, short value) +{ + int res; + + res = *input + value; + if (res > 32767) + *input = 32767; + else if (res < -32767) + *input = -32767; + else + *input = (short) res; +} +static inline void ast_slinear_saturated_multiply(short *input, short value) +{ + int res; + + res = *input * value; + if (res > 32767) + *input = 32767; + else if (res < -32767) + *input = -32767; + else + *input = (short) res; +} + +static inline void ast_slinear_saturated_divide(short *input, short value) +{ + *input /= value; +} extern int test_for_thread_safety(void);