diff --git a/funcs/func_talkdetect.c b/funcs/func_talkdetect.c index bb61bb04f7..22f4d355f7 100644 --- a/funcs/func_talkdetect.c +++ b/funcs/func_talkdetect.c @@ -56,10 +56,20 @@ parameters. Can be called multiple times to change parameters on a channel with talk detection already enabled. - The time in milliseconds before which a user is considered silent. + The time in milliseconds of sound falling below the + dsp_talking_threshold option when + a user is considered to stop talking. The default value is + 2500. - The time in milliseconds after which a user is considered talking. + The minimum average magnitude per sample in a frame + for the DSP to consider talking/noise present. A value below + this level is considered silence. If not specified, the + value comes from the dsp.conf + silencethreshold option or 256 + if dsp.conf doesn't exist or the + silencethreshold option is not + set. @@ -159,6 +169,7 @@ static const struct ast_datastore_info talk_detect_datastore = { static int talk_detect_audiohook_cb(struct ast_audiohook *audiohook, struct ast_channel *chan, struct ast_frame *frame, enum ast_audiohook_direction direction) { int total_silence; + int is_talking; int update_talking = 0; struct ast_datastore *datastore; struct talk_detect_params *td_params; @@ -181,15 +192,14 @@ static int talk_detect_audiohook_cb(struct ast_audiohook *audiohook, struct ast_ } td_params = datastore->data; - ast_dsp_silence(td_params->dsp, frame, &total_silence); - - if (total_silence < td_params->dsp_silence_threshold) { + is_talking = !ast_dsp_silence(td_params->dsp, frame, &total_silence); + if (is_talking) { if (!td_params->talking) { update_talking = 1; td_params->talking_start = ast_tvnow(); } td_params->talking = 1; - } else { + } else if (total_silence >= td_params->dsp_silence_threshold) { if (td_params->talking) { update_talking = 1; } @@ -357,7 +367,7 @@ static int talk_detect_fn_write(struct ast_channel *chan, const char *function, if (dsp_talking_threshold < 1) { ast_log(AST_LOG_WARNING, "Invalid value %d for dsp_talking_threshold\n", - dsp_silence_threshold); + dsp_talking_threshold); return -1; } }