<p>Michael Bradeen has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.asterisk.org/c/asterisk/+/19445">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">audiohook: add directional awareness<br><br>Add enum to allow setting optional direction. If set to only one<br>direction, only feed matching-direction frames to the associated<br>slin factory.<br><br>This prevents mangling the transcoder on non-mixed frames when the<br>READ and WRITE frames would have otherwise required it.  Also<br>removes the need to mute or discard the un-wanted frames as they<br>are no longer added in the first place.<br><br>res_stasis_snoop is changed to use this addition to set direction<br>on audiohook based on spy direction.<br><br>If no direction is set, the ast_audiohook_init will init this enum<br>to BOTH which maintains existing functionality.<br><br>ASTERISK-30252<br><br>Change-Id: If8716bad334562a5d812be4eeb2a92e4f3be28eb<br>---<br>M include/asterisk/audiohook.h<br>M main/audiohook.c<br>M res/res_stasis_snoop.c<br>3 files changed, 66 insertions(+), 13 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.asterisk.org:29418/asterisk refs/changes/45/19445/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/asterisk/audiohook.h b/include/asterisk/audiohook.h</span><br><span>index 8e93d56..a5d7e0c 100644</span><br><span>--- a/include/asterisk/audiohook.h</span><br><span>+++ b/include/asterisk/audiohook.h</span><br><span>@@ -118,6 +118,7 @@</span><br><span>         ast_audiohook_manipulate_callback manipulate_callback; /*!< Manipulation callback */</span><br><span>      struct ast_audiohook_options options;                  /*!< Applicable options */</span><br><span>         unsigned int hook_internal_samp_rate;                  /*!< internal read/write sample rate on the audiohook.*/</span><br><span style="color: hsl(120, 100%, 40%);">+    enum ast_audiohook_direction direction;                /*!< Intended audiohook direction, BOTH by default on init */</span><br><span>      AST_LIST_ENTRY(ast_audiohook) list;                    /*!< Linked list information */</span><br><span> };</span><br><span> </span><br><span>@@ -140,6 +141,14 @@</span><br><span>  */</span><br><span> int ast_audiohook_destroy(struct ast_audiohook *audiohook);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/*! \brief Sets direction on audiohook</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param audiohook</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param direction In which direction should the audiohook feed frames, ie if we are snooping 'in', set direction to READ so that only the 'in' frames are fed to the slin factory</span><br><span style="color: hsl(120, 100%, 40%);">+ * \retval 0 on success</span><br><span style="color: hsl(120, 100%, 40%);">+ * \retval -1 on failure due to audiohook already in use or in shutdown. Can only set direction on NEW audiohooks</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int ast_audiohook_set_frame_feed_direction(struct ast_audiohook *audiohook, enum ast_audiohook_direction direction);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /*! \brief Writes a frame into the audiohook structure</span><br><span>  * \param audiohook</span><br><span>  * \param direction Direction the audio frame came from</span><br><span>diff --git a/main/audiohook.c b/main/audiohook.c</span><br><span>index 966d5f2..3154ede 100644</span><br><span>--- a/main/audiohook.c</span><br><span>+++ b/main/audiohook.c</span><br><span>@@ -109,6 +109,9 @@</span><br><span> </span><br><span>   audiohook->init_flags = init_flags;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+    /* Set direction to BOTH so that we feed frames in both directions */</span><br><span style="color: hsl(120, 100%, 40%);">+ audiohook->direction = AST_AUDIOHOOK_DIRECTION_BOTH;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>    /* initialize internal rate at 8khz, this will adjust if necessary */</span><br><span>        audiohook_set_internal_rate(audiohook, DEFAULT_INTERNAL_SAMPLE_RATE, 0);</span><br><span> </span><br><span>@@ -144,6 +147,18 @@</span><br><span>  return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+int ast_audiohook_set_frame_feed_direction(struct ast_audiohook *audiohook, enum ast_audiohook_direction direction)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    /* Only set the direction on new audiohooks */</span><br><span style="color: hsl(120, 100%, 40%);">+        if (audiohook->status != AST_AUDIOHOOK_STATUS_NEW) {</span><br><span style="color: hsl(120, 100%, 40%);">+               ast_debug(3, "Can not set direction on attached Audiohook %p\n", audiohook);</span><br><span style="color: hsl(120, 100%, 40%);">+                return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   audiohook->direction = direction;</span><br><span style="color: hsl(120, 100%, 40%);">+  return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> #define SHOULD_MUTE(hook, dir) \</span><br><span>   ((ast_test_flag(hook, AST_AUDIOHOOK_MUTE_READ) && (dir == AST_AUDIOHOOK_DIRECTION_READ)) || \</span><br><span>        (ast_test_flag(hook, AST_AUDIOHOOK_MUTE_WRITE) && (dir == AST_AUDIOHOOK_DIRECTION_WRITE)) || \</span><br><span>@@ -159,6 +174,13 @@</span><br><span>        int other_factory_samples;</span><br><span>   int other_factory_ms;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+     /* Don't feed the frame if we are set to read and this is a write frame or if set to</span><br><span style="color: hsl(120, 100%, 40%);">+         write and this is a read frame as we don't want it. Plus, it can cause mis-resampling</span><br><span style="color: hsl(120, 100%, 40%);">+     if the READ and WRITE frames have different bitrates */</span><br><span style="color: hsl(120, 100%, 40%);">+    if (audiohook->direction != AST_AUDIOHOOK_DIRECTION_BOTH && audiohook->direction != direction) {</span><br><span style="color: hsl(120, 100%, 40%);">+                return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  /* Update last feeding time to be current */</span><br><span>         *rwtime = ast_tvnow();</span><br><span> </span><br><span>diff --git a/res/res_stasis_snoop.c b/res/res_stasis_snoop.c</span><br><span>index 8d0c6eb..70cdd7c 100644</span><br><span>--- a/res/res_stasis_snoop.c</span><br><span>+++ b/res/res_stasis_snoop.c</span><br><span>@@ -188,21 +188,9 @@</span><br><span>       }</span><br><span> </span><br><span>        ast_audiohook_lock(&snoop->spy);</span><br><span style="color: hsl(0, 100%, 40%);">- if (snoop->spy_direction != AST_AUDIOHOOK_DIRECTION_BOTH) {</span><br><span style="color: hsl(0, 100%, 40%);">-          /*</span><br><span style="color: hsl(0, 100%, 40%);">-               * When a singular direction is chosen frames are still written to the</span><br><span style="color: hsl(0, 100%, 40%);">-           * opposing direction's queue. Those frames must be read so the queue</span><br><span style="color: hsl(0, 100%, 40%);">-                * does not continue to grow, however since they are not needed for the</span><br><span style="color: hsl(0, 100%, 40%);">-          * selected direction they can be dropped.</span><br><span style="color: hsl(0, 100%, 40%);">-               */</span><br><span style="color: hsl(0, 100%, 40%);">-             enum ast_audiohook_direction opposing_direction =</span><br><span style="color: hsl(0, 100%, 40%);">-                       snoop->spy_direction == AST_AUDIOHOOK_DIRECTION_READ ?</span><br><span style="color: hsl(0, 100%, 40%);">-                       AST_AUDIOHOOK_DIRECTION_WRITE : AST_AUDIOHOOK_DIRECTION_READ;</span><br><span style="color: hsl(0, 100%, 40%);">-           ast_frame_dtor(ast_audiohook_read_frame(&snoop->spy, snoop->spy_samples,</span><br><span style="color: hsl(0, 100%, 40%);">-                                                      opposing_direction, snoop->spy_format));</span><br><span style="color: hsl(0, 100%, 40%);">-     }</span><br><span> </span><br><span>        frame = ast_audiohook_read_frame(&snoop->spy, snoop->spy_samples, snoop->spy_direction, snoop->spy_format);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>        ast_audiohook_unlock(&snoop->spy);</span><br><span> </span><br><span>        return frame ? frame : &snoop->silence;</span><br><span>@@ -287,6 +275,14 @@</span><br><span>                return -1;</span><br><span>   }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /* Set the audiohook direction so we don't write unnecessary frames */</span><br><span style="color: hsl(120, 100%, 40%);">+    if (ast_audiohook_set_frame_feed_direction(audiohook, *direction)) {</span><br><span style="color: hsl(120, 100%, 40%);">+          /* If we are unable to set direction, the audiohook either failed to init</span><br><span style="color: hsl(120, 100%, 40%);">+                or someone else started using it already.  If we don't bail here, we risk</span><br><span style="color: hsl(120, 100%, 40%);">+                 feeding frames that will never be read */</span><br><span style="color: hsl(120, 100%, 40%);">+          return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  return ast_audiohook_attach(chan, audiohook);</span><br><span> }</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.asterisk.org/c/asterisk/+/19445">change 19445</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.asterisk.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.asterisk.org/c/asterisk/+/19445"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: asterisk </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: If8716bad334562a5d812be4eeb2a92e4f3be28eb </div>
<div style="display:none"> Gerrit-Change-Number: 19445 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Michael Bradeen <mbradeen@sangoma.com> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>