]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
declinatio mortuus obfirmo
authorMichael Jerris <mike@jerris.com>
Mon, 4 Oct 2010 22:43:10 +0000 (17:43 -0500)
committerBrian West <brian@freeswitch.org>
Mon, 4 Oct 2010 22:43:10 +0000 (17:43 -0500)
src/mod/applications/mod_conference/mod_conference.c

index b9364ff24a5e7c8ce2aed2e3346ecbd14801cf07..e1570a7af5a1f980ea73282ce2ab65f106cf2b0f 100644 (file)
@@ -1914,6 +1914,8 @@ static void *SWITCH_THREAD_FUNC conference_loop_input(switch_thread_t *thread, v
        uint32_t hangover = 40, hangunder = 15, hangover_hits = 0, hangunder_hits = 0, energy_level = 0, diff_level = 400;
        switch_codec_implementation_t read_impl = { 0 };
        switch_core_session_t *session = member->session;
+       int check_floor_change;
+
        switch_assert(member != NULL);
 
        switch_clear_flag_locked(member, MFLAG_TALKING);
@@ -1926,6 +1928,7 @@ static void *SWITCH_THREAD_FUNC conference_loop_input(switch_thread_t *thread, v
           and mux it with any audio from other channels. */
 
        while (switch_test_flag(member, MFLAG_RUNNING) && switch_channel_ready(channel)) {
+               check_floor_change = 0;
 
                if (switch_channel_ready(channel) && switch_channel_test_app_flag(channel, CF_APP_TAGGED)) {
                        switch_yield(100000);
@@ -2083,25 +2086,7 @@ static void *SWITCH_THREAD_FUNC conference_loop_input(switch_thread_t *thread, v
                                }
 
                                if (diff >= diff_level || ++hangunder_hits >= hangunder) { 
-
-                    switch_mutex_lock(member->conference->member_mutex);
-                    if ((!member->conference->floor_holder ||
-                        !switch_test_flag(member->conference->floor_holder, MFLAG_TALKING) ||
-                        ((member->score_iir > SCORE_IIR_SPEAKING_MAX) && (member->conference->floor_holder->score_iir < SCORE_IIR_SPEAKING_MIN))) &&
-                        (!switch_test_flag(member->conference, CFLAG_VID_FLOOR) || switch_channel_test_flag(channel, CF_VIDEO))) {
-
-                        if (test_eflag(member->conference, EFLAG_FLOOR_CHANGE) &&
-                            switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) {
-                            conference_add_event_member_data(member, event);
-                            switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Action", "floor-change");
-                            switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Old-ID", "%d",
-                                                    member->conference->floor_holder ? member->conference->floor_holder->id : 0);
-                            switch_event_add_header(event, SWITCH_STACK_BOTTOM, "New-ID", "%d", member->conference->floor_holder ? member->id : 0);
-                            switch_event_fire(&event);
-                        }
-                        member->conference->floor_holder = member;
-                    }
-                    switch_mutex_unlock(member->conference->member_mutex);
+                                       check_floor_change = 1;
 
                                        hangover_hits = hangunder_hits = 0;
                                        member->last_talking = switch_epoch_time_now(NULL);
@@ -2191,6 +2176,28 @@ static void *SWITCH_THREAD_FUNC conference_loop_input(switch_thread_t *thread, v
          do_continue:
 
                switch_mutex_unlock(member->read_mutex);
+
+               if (check_floor_change) {
+                       switch_mutex_lock(member->conference->member_mutex);
+                       if ((!member->conference->floor_holder ||
+                                !switch_test_flag(member->conference->floor_holder, MFLAG_TALKING) ||
+                                ((member->score_iir > SCORE_IIR_SPEAKING_MAX) && (member->conference->floor_holder->score_iir < SCORE_IIR_SPEAKING_MIN))) &&
+                               (!switch_test_flag(member->conference, CFLAG_VID_FLOOR) || switch_channel_test_flag(channel, CF_VIDEO))) {
+
+                               if (test_eflag(member->conference, EFLAG_FLOOR_CHANGE) &&
+                                       switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) {
+                                       conference_add_event_member_data(member, event);
+                                       switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Action", "floor-change");
+                                       switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Old-ID", "%d",
+                                                                                       member->conference->floor_holder ? member->conference->floor_holder->id : 0);
+                                       switch_event_add_header(event, SWITCH_STACK_BOTTOM, "New-ID", "%d", member->conference->floor_holder ? member->id : 0);
+                                       switch_event_fire(&event);
+                               }
+                               member->conference->floor_holder = member;
+                       }
+                       switch_mutex_unlock(member->conference->member_mutex);
+               }
+
        }