func_volume: Accept decimal number as argument

Allow voice volume to be multiplied or divided by a floating point number.

ASTERISK-28813

Change-Id: I5b42b890ec4e1f6b0b3400cb44ff16522b021c8c
This commit is contained in:
Jean Aunis
2020-04-07 14:05:22 +02:00
committed by Friendly Automation
parent 2b80e5f5da
commit de66713fd5
5 changed files with 68 additions and 6 deletions

View File

@@ -596,6 +596,14 @@ struct ast_frame *ast_frame_enqueue(struct ast_frame *head, struct ast_frame *f,
*/
int ast_frame_adjust_volume(struct ast_frame *f, int adjustment);
/*!
\brief Adjusts the volume of the audio samples contained in a frame.
\param f The frame containing the samples (must be AST_FRAME_VOICE and AST_FORMAT_SLINEAR)
\param adjustment The number of dB to adjust up or down.
\return 0 for success, non-zero for an error
*/
int ast_frame_adjust_volume_float(struct ast_frame *f, float adjustment);
/*!
\brief Sums two frames of audio samples.
\param f1 The first frame (which will contain the result)

View File

@@ -375,11 +375,35 @@ static force_inline void ast_slinear_saturated_multiply(short *input, short *val
*input = (short) res;
}
static force_inline void ast_slinear_saturated_multiply_float(short *input, float *value)
{
float res;
res = (float) *input * *value;
if (res > 32767)
*input = 32767;
else if (res < -32768)
*input = -32768;
else
*input = (short) res;
}
static force_inline void ast_slinear_saturated_divide(short *input, short *value)
{
*input /= *value;
}
static force_inline void ast_slinear_saturated_divide_float(short *input, float *value)
{
float res = (float) *input / *value;
if (res > 32767)
*input = 32767;
else if (res < -32768)
*input = -32768;
else
*input = (short) res;
}
#ifdef localtime_r
#undef localtime_r
#endif