ensure that SLINEAR volume adjustments don't wrap around short integer maximums
authorKevin P. Fleming <kpfleming@digium.com>
Fri, 28 Oct 2005 21:35:55 +0000 (21:35 +0000)
committerKevin P. Fleming <kpfleming@digium.com>
Fri, 28 Oct 2005 21:35:55 +0000 (21:35 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@6882 65c4cc65-6c06-0410-ace0-fbb531ad65f3

frame.c
include/asterisk/utils.h

diff --git a/frame.c b/frame.c
index 7b4fa4d..39bed2e 100755 (executable)
--- 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));
                }
        }
 
index e0c3259..9aa1a34 100755 (executable)
@@ -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);