dect
/
asterisk
Archived
13
0
Fork 0

ensure that SLINEAR volume adjustments don't wrap around short integer maximums

git-svn-id: http://svn.digium.com/svn/asterisk/trunk@6882 f38db490-d61c-443f-a65b-d21fe96a405b
This commit is contained in:
kpfleming 2005-10-28 21:35:55 +00:00
parent 81880bfe3d
commit dc1aa1ffdc
2 changed files with 32 additions and 2 deletions

View File

@ -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));
}
}

View File

@ -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);