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