]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
func_talkdetect.c: Fix logical errors in silence detection.
authorSean Bright <sean.bright@gmail.com>
Thu, 14 Oct 2021 19:38:33 +0000 (15:38 -0400)
committerFriendly Automation <jenkins2@gerrit.asterisk.org>
Tue, 19 Oct 2021 15:21:57 +0000 (10:21 -0500)
There are 3 separate changes here:

1. The documentation erroneously stated that the dsp_talking_threshold
   argument was a number of milliseconds when it is actually an energy
   level used by the DSP code to classify talking vs. silence.

2. Fixes a copy paste error in the argument handling code.

3. Don't erroneously switch to the talking state if we aren't actively
   handling a frame we've classified as talking.

Patch inspired by one provided by Moritz Fain (License #6961).

ASTERISK-27816 #close

Change-Id: I5953fd570b98b49c41cee55bfe3b941753fb2511

funcs/func_talkdetect.c

index bb61bb04f7148e141a0c41865024b03bfab2108f..22f4d355f7a3bd3a2aea74c52e5ced4be055bbe1 100644 (file)
                                                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;
                                }
                        }