]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
make hangup or end of bridge trigger unhold action for held legs
authorAnthony Minessale <anthm@freeswitch.org>
Fri, 21 Feb 2014 19:25:59 +0000 (13:25 -0600)
committerAnthony Minessale <anthm@freeswitch.org>
Fri, 21 Feb 2014 19:26:15 +0000 (13:26 -0600)
src/switch_channel.c
src/switch_ivr_bridge.c

index 279bd49793444a44f5ad7d16580feacfc4c01c75..99e074027d0398c6ffef4fef9537830a679bd2d8 100644 (file)
@@ -3132,6 +3132,10 @@ SWITCH_DECLARE(switch_channel_state_t) switch_channel_perform_hangup(switch_chan
        }
        switch_mutex_unlock(channel->state_mutex);
 
+       if (switch_channel_test_flag(channel, CF_LEG_HOLDING)) {
+               switch_channel_mark_hold(channel, SWITCH_FALSE);
+       }
+
        if (!ok) {
                return channel->state;
        }
index 8859ee229508677a78f7ca16abf9c2b00762b542..3590bac5e5ae7fc1936ff0e472c45d4b2cb94ba1 100644 (file)
@@ -633,21 +633,24 @@ static void *audio_bridge_thread(switch_thread_t *thread, void *obj)
        switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session_a), SWITCH_LOG_DEBUG, "BRIDGE THREAD DONE [%s]\n", switch_channel_get_name(chan_a));
        switch_channel_clear_flag(chan_a, CF_BRIDGED);
 
-       if (switch_channel_test_flag(chan_a, CF_LEG_HOLDING) && switch_channel_ready(chan_b) && switch_channel_get_state(chan_b) != CS_PARK) {
-               const char *ext = switch_channel_get_variable(chan_a, "hold_hangup_xfer_exten");
+       if (switch_channel_test_flag(chan_a, CF_LEG_HOLDING)) {
 
-               switch_channel_stop_broadcast(chan_b);
+               if (switch_channel_ready(chan_b) && switch_channel_get_state(chan_b) != CS_PARK) {
+                       const char *ext = switch_channel_get_variable(chan_a, "hold_hangup_xfer_exten");
 
-               if (zstr(ext)) {
-                       switch_call_cause_t cause = switch_channel_get_cause(chan_b);
-                       if (cause == SWITCH_CAUSE_NONE) {
-                               cause = SWITCH_CAUSE_NORMAL_CLEARING;
+                       switch_channel_stop_broadcast(chan_b);
+
+                       if (zstr(ext)) {
+                               switch_call_cause_t cause = switch_channel_get_cause(chan_b);
+                               if (cause == SWITCH_CAUSE_NONE) {
+                                       cause = SWITCH_CAUSE_NORMAL_CLEARING;
+                               }
+                               switch_channel_hangup(chan_b, cause);
+                       } else {
+                               switch_channel_set_variable(chan_b, SWITCH_TRANSFER_AFTER_BRIDGE_VARIABLE, ext);
                        }
-                       switch_channel_hangup(chan_b, cause);
-               } else {
-                       switch_channel_set_variable(chan_b, SWITCH_TRANSFER_AFTER_BRIDGE_VARIABLE, ext);
                }
-               switch_channel_clear_flag(chan_a, CF_LEG_HOLDING);
+               switch_channel_mark_hold(chan_a, SWITCH_FALSE);
        }
 
        if (switch_channel_test_flag(chan_a, CF_INTERCEPTED)) {