diff --git a/funcs/func_talkdetect.c b/funcs/func_talkdetect.c index bb61bb04f7148e141a0c41865024b03bfab2108f..22f4d355f7a3bd3a2aea74c52e5ced4be055bbe1 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.</para> <argument name="dsp_silence_threshold" required="false"> - <para>The time in milliseconds before which a user is considered silent.</para> + <para>The time in milliseconds of sound falling below the + <replaceable>dsp_talking_threshold</replaceable> option when + a user is considered to stop talking. The default value is + 2500.</para> </argument> <argument name="dsp_talking_threshold" required="false"> - <para>The time in milliseconds after which a user is considered talking.</para> + <para>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 <filename>dsp.conf</filename> + <replaceable>silencethreshold</replaceable> option or 256 + if <filename>dsp.conf</filename> doesn't exist or the + <replaceable>silencethreshold</replaceable> option is not + set.</para> </argument> </option> </optionlist> @@ -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; } }