<h1>Project "FreeSWITCH Source" received a push.</h1>

<h2>branch: master updated</h2>
<pre>
       via: b8531ea8730364d520b719f339baf61b8117aa3c (commit)
      from: 5e6123ef5f21580f5cbce2fac7bd47702387245b (commit)


</pre>= COMMIT LOG ===========================================================
<div class="highlight"><pre>committer: Anthony Minessale
comments: 
tweak agc

<span style="color: #000080; font-weight: bold">diff --git a/src/mod/applications/mod_conference/mod_conference.c b/src/mod/applications/mod_conference/mod_conference.c</span>
<span style="color: #000080; font-weight: bold">index 0aee352..8c9530a 100644</span>
<span style="color: #A00000">--- a/src/mod/applications/mod_conference/mod_conference.c</span>
<span style="color: #00A000">+++ b/src/mod/applications/mod_conference/mod_conference.c</span>
<span style="color: #800080; font-weight: bold">@@ -266,6 +266,7 @@ typedef struct conference_obj {</span>
         switch_thread_rwlock_t *rwlock;
         uint32_t count;
         int32_t energy_level;
<span style="color: #00A000">+        int32_t agc_energy_level;</span>
         uint8_t min;
         switch_speech_handle_t lsh;
         switch_speech_handle_t *sh;
<span style="color: #800080; font-weight: bold">@@ -326,6 +327,7 @@ struct conference_member {</span>
         uint32_t frame_size;
         uint8_t *mux_frame;
         uint32_t read;
<span style="color: #00A000">+        uint32_t vol_period;</span>
         int32_t energy_level;
         int32_t agc_volume_in_level;
         int32_t volume_in_level;
<span style="color: #800080; font-weight: bold">@@ -345,7 +347,7 @@ struct conference_member {</span>
         uint32_t verbose_events;
         uint32_t avg_score;
         uint32_t avg_itt;
<span style="color: #A00000">-        uint32_t avg_tally;        </span>
<span style="color: #00A000">+        uint32_t avg_tally;</span>
         struct conference_member *next;
         switch_ivr_dmachine_t *dmachine;
 };
<span style="color: #800080; font-weight: bold">@@ -1940,6 +1942,17 @@ static void conference_loop_fn_hangup(conference_member_t *member, caller_contro</span>
         switch_clear_flag_locked(member, MFLAG_RUNNING);
 }
 
<span style="color: #00A000">+static void clear_avg(conference_member_t *member)</span>
<span style="color: #00A000">+{</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        member-&gt;agc_volume_in_level = 0;</span>
<span style="color: #00A000">+        member-&gt;avg_score = 0;</span>
<span style="color: #00A000">+        member-&gt;avg_itt = 0;</span>
<span style="color: #00A000">+        member-&gt;avg_tally = 0;</span>
<span style="color: #00A000">+        member-&gt;nt_tally = 0;</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+</span>
 /* marshall frames from the call leg to the conference thread for muxing to other call legs */
 static void *SWITCH_THREAD_FUNC conference_loop_input(switch_thread_t *thread, void *obj)
 {
<span style="color: #800080; font-weight: bold">@@ -1948,7 +1961,7 @@ static void *SWITCH_THREAD_FUNC conference_loop_input(switch_thread_t *thread, v</span>
         switch_channel_t *channel;
         switch_status_t status;
         switch_frame_t *read_frame = NULL;
<span style="color: #A00000">-        uint32_t hangover = 40, hangunder = 15, hangover_hits = 0, hangunder_hits = 0, energy_level = 0, diff_level = 400;</span>
<span style="color: #00A000">+        uint32_t hangover = 40, hangunder = 5, hangover_hits = 0, hangunder_hits = 0, energy_level = 0, diff_level = 400;</span>
         switch_codec_implementation_t read_impl = { 0 };
         switch_core_session_t *session = member-&gt;session;
         int check_floor_change;
<span style="color: #800080; font-weight: bold">@@ -1991,6 +2004,7 @@ static void *SWITCH_THREAD_FUNC conference_loop_input(switch_thread_t *thread, v</span>
                                 if (++hangover_hits &gt;= hangover) {
                                         hangover_hits = hangunder_hits = 0;
                                         switch_clear_flag_locked(member, MFLAG_TALKING);
<span style="color: #00A000">+                                        clear_avg(member);</span>
 
                                         if (test_eflag(member-&gt;conference, EFLAG_STOP_TALKING) &amp;&amp;
                                                 switch_event_create_subclass(&amp;event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) {
<span style="color: #800080; font-weight: bold">@@ -2006,19 +2020,9 @@ static void *SWITCH_THREAD_FUNC conference_loop_input(switch_thread_t *thread, v</span>
                 
                 /* Check for input volume adjustments */
                 if (!member-&gt;conference-&gt;agc_level) {
<span style="color: #A00000">-                        member-&gt;agc_volume_in_level = 0;</span>
<span style="color: #A00000">-                        member-&gt;avg_score = 0;</span>
<span style="color: #A00000">-                        member-&gt;avg_itt = 0;</span>
<span style="color: #A00000">-                        member-&gt;avg_tally = 0;</span>
<span style="color: #A00000">-                }</span>
<span style="color: #A00000">-</span>
<span style="color: #A00000">-                if (member-&gt;conference-&gt;agc_level &amp;&amp; member-&gt;agc_volume_in_level) {</span>
<span style="color: #A00000">-                        switch_change_sln_volume(read_frame-&gt;data, read_frame-&gt;datalen / 2, member-&gt;agc_volume_in_level);</span>
<span style="color: #A00000">-                } else if (member-&gt;volume_in_level) {</span>
<span style="color: #A00000">-                        switch_change_sln_volume(read_frame-&gt;data, read_frame-&gt;datalen / 2, member-&gt;volume_in_level);</span>
<span style="color: #00A000">+                        clear_avg(member);</span>
                 }
                 
<span style="color: #A00000">-</span>
                 energy_level = member-&gt;energy_level;
 
                 /* if the member can speak, compute the audio energy level and */
<span style="color: #800080; font-weight: bold">@@ -2027,7 +2031,8 @@ static void *SWITCH_THREAD_FUNC conference_loop_input(switch_thread_t *thread, v</span>
                         uint32_t energy = 0, i = 0, samples = 0, j = 0;
                         int16_t *data;
                         int divisor = 0;
<span style="color: #A00000">-                        int one_sec = (read_impl.actual_samples_per_second / read_impl.samples_per_packet);</span>
<span style="color: #00A000">+                        int agc_period = (read_impl.actual_samples_per_second / read_impl.samples_per_packet) / 2;</span>
<span style="color: #00A000">+                        int combined_vol = 0;</span>
 
                         data = read_frame-&gt;data;
 
<span style="color: #800080; font-weight: bold">@@ -2037,77 +2042,62 @@ static void *SWITCH_THREAD_FUNC conference_loop_input(switch_thread_t *thread, v</span>
 
                         member-&gt;score = 0;
 
<span style="color: #00A000">+                        combined_vol = member-&gt;agc_volume_in_level;</span>
<span style="color: #00A000">+                        if (member-&gt;conference-&gt;agc_level) {</span>
<span style="color: #00A000">+                                combined_vol += member-&gt;agc_volume_in_level;</span>
<span style="color: #00A000">+                        }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+                        if (combined_vol) {</span>
<span style="color: #00A000">+                                switch_change_sln_volume(read_frame-&gt;data, read_frame-&gt;datalen / 2, combined_vol);</span>
<span style="color: #00A000">+                        }</span>
<span style="color: #00A000">+                        </span>
                         if ((samples = read_frame-&gt;datalen / sizeof(*data))) {
                                 for (i = 0; i &lt; samples; i++) {
                                         energy += abs(data[j]);
                                         j += read_impl.number_of_channels;
                                 }
                                 member-&gt;score = energy / (samples / divisor);
<span style="color: #A00000">-                                member-&gt;avg_tally += member-&gt;score;</span>
<span style="color: #A00000">-                                member-&gt;avg_score = member-&gt;avg_tally / ++member-&gt;avg_itt;</span>
<span style="color: #A00000">-                                if (!member-&gt;avg_itt) member-&gt;avg_tally = member-&gt;score;</span>
                         }
 
<span style="color: #00A000">+                        if (member-&gt;vol_period) {</span>
<span style="color: #00A000">+                                member-&gt;vol_period--;</span>
<span style="color: #00A000">+                        }</span>
<span style="color: #00A000">+                        </span>
                         if (member-&gt;conference-&gt;agc_level &amp;&amp; member-&gt;score &amp;&amp; 
<span style="color: #A00000">-                                switch_test_flag(member, MFLAG_TALKING) &amp;&amp; </span>
                                 switch_test_flag(member, MFLAG_CAN_SPEAK) &amp;&amp;
<span style="color: #A00000">-                                member-&gt;score &gt; member-&gt;energy_level</span>
<span style="color: #00A000">+                                member-&gt;score &gt; member-&gt;conference-&gt;agc_energy_level</span>
                                 ) {
<span style="color: #A00000">-                                int diff = member-&gt;conference-&gt;agc_level - member-&gt;score;</span>
 
<span style="color: #A00000">-                                if (abs(diff) &gt;= 200) {</span>
<span style="color: #A00000">-                                        member-&gt;agc_concur++;</span>
<span style="color: #A00000">-                                } else {</span>
<span style="color: #A00000">-                                        member-&gt;agc_concur = 0;</span>
<span style="color: #A00000">-                                }</span>
<span style="color: #00A000">+                                member-&gt;avg_tally += member-&gt;score;</span>
<span style="color: #00A000">+                                member-&gt;avg_itt++;</span>
<span style="color: #00A000">+                                if (!member-&gt;avg_itt) member-&gt;avg_itt++;</span>
<span style="color: #00A000">+                                member-&gt;avg_score = member-&gt;avg_tally / member-&gt;avg_itt;</span>
<span style="color: #00A000">+                                </span>
 
<span style="color: #A00000">-#if 0                                </span>
<span style="color: #A00000">-                                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG8,</span>
<span style="color: #A00000">-                                                                  &quot;conf %s FOO %d %d %d %d %d\n&quot;, </span>
<span style="color: #00A000">+                                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG7,</span>
<span style="color: #00A000">+                                                                  &quot;conf %s AGC %d %d %d %d %d %d\n&quot;, </span>
                                                                   member-&gt;conference-&gt;name,
<span style="color: #A00000">-                                                                  member-&gt;id, diff, member-&gt;conference-&gt;agc_level, </span>
<span style="color: #A00000">-                                                                  member-&gt;score, member-&gt;agc_volume_in_level);</span>
<span style="color: #A00000">-#endif</span>
<span style="color: #A00000">-                                </span>
<span style="color: #A00000">-                                if (member-&gt;agc_concur &gt;= one_sec) {</span>
<span style="color: #A00000">-                                        if (member-&gt;score &lt; member-&gt;conference-&gt;agc_level) {</span>
<span style="color: #A00000">-                                                member-&gt;agc_volume_in_level++;</span>
<span style="color: #A00000">-                                                </span>
<span style="color: #A00000">-                                                switch_normalize_volume(member-&gt;agc_volume_in_level);</span>
<span style="color: #A00000">-</span>
<span style="color: #A00000">-                                                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG7,</span>
<span style="color: #A00000">-                                                                                  &quot;conf %s AGC +++ %d %d %d %d %d\n&quot;, </span>
<span style="color: #A00000">-                                                                                  member-&gt;conference-&gt;name,</span>
<span style="color: #A00000">-                                                                                  member-&gt;id, diff, member-&gt;conference-&gt;agc_level, </span>
<span style="color: #A00000">-                                                                                  member-&gt;score, member-&gt;agc_volume_in_level);</span>
<span style="color: #00A000">+                                                                  member-&gt;id, member-&gt;conference-&gt;agc_level - member-&gt;avg_score, member-&gt;conference-&gt;agc_level, </span>
<span style="color: #00A000">+                                                                  member-&gt;score, member-&gt;avg_score, member-&gt;agc_volume_in_level);</span>
 
<span style="color: #A00000">-                                        } else {</span>
<span style="color: #A00000">-                                                member-&gt;agc_volume_in_level--;</span>
<span style="color: #A00000">-                                                </span>
<span style="color: #A00000">-                                                switch_normalize_volume(member-&gt;agc_volume_in_level);</span>
<span style="color: #A00000">-</span>
<span style="color: #A00000">-                                                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG7,</span>
<span style="color: #A00000">-                                                                                  &quot;conf %s AGC --- %d %d %d %d %d\n&quot;, </span>
<span style="color: #A00000">-                                                                                  member-&gt;conference-&gt;name,</span>
<span style="color: #A00000">-                                                                                  member-&gt;id, diff, member-&gt;conference-&gt;agc_level, </span>
<span style="color: #A00000">-                                                                                  member-&gt;score, member-&gt;agc_volume_in_level);</span>
<span style="color: #A00000">-                                        }</span>
<span style="color: #A00000">-                                        member-&gt;agc_concur = 0;</span>
<span style="color: #A00000">-                                }</span>
<span style="color: #A00000">-                                member-&gt;nt_tally = 0;</span>
<span style="color: #A00000">-                        } else {</span>
<span style="color: #A00000">-                                member-&gt;nt_tally++;</span>
<span style="color: #A00000">-                                member-&gt;agc_concur = 0;</span>
 
<span style="color: #A00000">-                                if (member-&gt;nt_tally &gt; one_sec * 5) {</span>
<span style="color: #A00000">-                                        member-&gt;agc_volume_in_level = 0;</span>
<span style="color: #00A000">+                                </span>
<span style="color: #00A000">+                                if (++member-&gt;nt_tally &gt;= agc_period) {</span>
<span style="color: #00A000">+                                        if (!member-&gt;vol_period) {</span>
<span style="color: #00A000">+                                                if (member-&gt;avg_score &lt; member-&gt;conference-&gt;agc_level) {</span>
<span style="color: #00A000">+                                                        member-&gt;agc_volume_in_level++;</span>
<span style="color: #00A000">+                                                        switch_normalize_volume(member-&gt;agc_volume_in_level);</span>
<span style="color: #00A000">+                                                        member-&gt;vol_period = (read_impl.actual_samples_per_second / read_impl.samples_per_packet) * 2;</span>
<span style="color: #00A000">+                                                }</span>
<span style="color: #00A000">+                                        </span>
<span style="color: #00A000">+                                                if (member-&gt;avg_score &gt; member-&gt;conference-&gt;agc_level) {</span>
<span style="color: #00A000">+                                                        member-&gt;agc_volume_in_level--;</span>
<span style="color: #00A000">+                                                        switch_normalize_volume(member-&gt;agc_volume_in_level);</span>
<span style="color: #00A000">+                                                        member-&gt;vol_period = (read_impl.actual_samples_per_second / read_impl.samples_per_packet) * 2;</span>
<span style="color: #00A000">+                                                }</span>
<span style="color: #00A000">+                                        }</span>
                                         member-&gt;nt_tally = 0;
<span style="color: #A00000">-                                        member-&gt;avg_itt = 0;</span>
<span style="color: #A00000">-                    member-&gt;avg_tally = 0;</span>
<span style="color: #A00000">-                    member-&gt;avg_score = member-&gt;score;</span>
                                 }
<span style="color: #A00000">-</span>
<span style="color: #A00000">-</span>
                         }
 
                         member-&gt;score_iir = (int) (((1.0 - SCORE_DECAY) * (float) member-&gt;score) + (SCORE_DECAY * (float) member-&gt;score_iir));
<span style="color: #800080; font-weight: bold">@@ -2162,6 +2152,7 @@ static void *SWITCH_THREAD_FUNC conference_loop_input(switch_thread_t *thread, v</span>
                                         if (++hangover_hits &gt;= hangover) {
                                                 hangover_hits = hangunder_hits = 0;
                                                 switch_clear_flag_locked(member, MFLAG_TALKING);
<span style="color: #00A000">+                                                clear_avg(member);</span>
 
                                                 if (test_eflag(member-&gt;conference, EFLAG_STOP_TALKING) &amp;&amp;
                                                         switch_event_create_subclass(&amp;event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) {
<span style="color: #800080; font-weight: bold">@@ -3421,7 +3412,7 @@ static switch_status_t conf_api_sub_mute(conference_member_t *member, switch_str</span>
 
 static switch_status_t conf_api_sub_agc(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv)
 {
<span style="color: #A00000">-        int level;</span>
<span style="color: #00A000">+        int level, energy_level;</span>
         int on = 0;
 
         if (argc == 2) {
<span style="color: #800080; font-weight: bold">@@ -3439,7 +3430,13 @@ static switch_status_t conf_api_sub_agc(conference_obj_t *conference, switch_str</span>
         if (argc &gt; 3) {
                 level = atoi(argv[3]);
         } else {
<span style="color: #A00000">-                level = 2000;</span>
<span style="color: #00A000">+                level = 650;</span>
<span style="color: #00A000">+        }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        if (argc &gt; 4) {</span>
<span style="color: #00A000">+                energy_level = atoi(argv[4]);</span>
<span style="color: #00A000">+        } else {</span>
<span style="color: #00A000">+                energy_level = 100;</span>
         }
 
         if (level &gt; conference-&gt;energy_level) {
<span style="color: #800080; font-weight: bold">@@ -3447,9 +3444,10 @@ static switch_status_t conf_api_sub_agc(conference_obj_t *conference, switch_str</span>
                 conference-&gt;avg_itt = 0;
                 conference-&gt;avg_tally = 0;
                 conference-&gt;agc_level = level;
<span style="color: #A00000">-                </span>
<span style="color: #00A000">+                conference-&gt;agc_energy_level = energy_level;</span>
<span style="color: #00A000">+</span>
                 if (stream) {
<span style="color: #A00000">-                        stream-&gt;write_function(stream, &quot;OK AGC ENABLED %d\n&quot;, conference-&gt;agc_level);</span>
<span style="color: #00A000">+                        stream-&gt;write_function(stream, &quot;OK AGC ENABLED %d %d\n&quot;, conference-&gt;agc_level, conference-&gt;agc_energy_level);</span>
                 }
                 
         } else {
<span style="color: #800080; font-weight: bold">@@ -3823,7 +3821,7 @@ static void conference_xlist(conference_obj_t *conference, switch_xml_t x_confer</span>
 
         if (conference-&gt;agc_level) {
                 char tmp[30] = &quot;&quot;;
<span style="color: #A00000">-                switch_snprintf(tmp, sizeof(tmp), &quot;%d&quot;, conference-&gt;agc_level);</span>
<span style="color: #00A000">+                switch_snprintf(tmp, sizeof(tmp), &quot;%d:%d&quot;, conference-&gt;agc_level, conference-&gt;agc_energy_level);</span>
                 switch_xml_set_attr_d_buf(x_conference, &quot;agc&quot;, tmp);
         }
 
</pre></div>
========================================================================<pre>

Summary of changes:
 .../applications/mod_conference/mod_conference.c   |  142 ++++++++++----------
 1 files changed, 70 insertions(+), 72 deletions(-)
</pre>
<p>this email was generated because of /git/your-repo.git/hooks/post-receive by the file /git-core/contrib/hooks/post-receive-email<br />
For more info, see <a href="http://blog.chomperstomp.com/?p=630">http://blog.chomperstomp.com/?p=630</a>
-- <br />
FreeSWITCH Source</p>