]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
Skip holding b leg only if it is on hold
authorHunyadvári Péter <peter.hunyadvari@vcc.live>
Tue, 20 Mar 2018 08:32:47 +0000 (09:32 +0100)
committerHunyadvári Péter <peter.hunyadvari@vcc.live>
Tue, 20 Mar 2018 08:32:47 +0000 (09:32 +0100)
FS-8579 --resolve

src/include/switch_types.h
src/switch_ivr.c

index 652836b17cf5b9eb17a004ae8aaa3585f8860e40..2cc5be4fe9087cc21c28c9c4c84cef4f7d70f003 100644 (file)
@@ -1346,6 +1346,7 @@ CF_ACCEPT_CNG             - Channel will accept CNG frames
 CF_REDIRECT            - Channel is being redirected
 CF_BRIDGED                     - Channel in a bridge
 CF_HOLD                                - Channel is on hold
+CF_HOLD_BLEG        - B leg is on hold
 CF_SERVICE                     - Channel has a service thread
 CF_TAGGED                      - Channel is tagged
 CF_WINNER                      - Channel is the winner
@@ -1397,6 +1398,7 @@ typedef enum {
        CF_REDIRECT,
        CF_BRIDGED,
        CF_HOLD,
+       CF_HOLD_BLEG,
        CF_SERVICE,
        CF_TAGGED,
        CF_WINNER,
index 770c3bb81f60f461f504e5b4fa128847a7fff775..f5b5d1ba64faedaeb945ce691073956053a20a2a 100644 (file)
@@ -572,7 +572,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_parse_event(switch_core_session_t *se
 
                        switch_channel_clear_flag(channel, CF_STOP_BROADCAST);
 
-                       if (!switch_channel_test_flag(channel, CF_BRIDGED) || switch_channel_test_flag(channel, CF_BROADCAST)) {
+                       if (!switch_channel_test_flag(channel, CF_BRIDGED) || switch_channel_test_flag(channel, CF_HOLD_BLEG)) {
                                inner++;
                                hold_bleg = NULL;
                        }
@@ -597,6 +597,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_parse_event(switch_core_session_t *se
                                                if ((b_session = switch_core_session_locate(b_uuid))) {
                                                        switch_channel_t *b_channel = switch_core_session_get_channel(b_session);
                                                        switch_status_t st;
+                                                       switch_channel_set_flag(channel, CF_HOLD_BLEG);
 
                                                        switch_ivr_broadcast(b_uuid, stream, SMF_ECHO_ALEG | SMF_LOOP);
                                                        st = switch_channel_wait_for_flag(b_channel, CF_BROADCAST, SWITCH_TRUE, 5000, NULL);
@@ -649,6 +650,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_parse_event(switch_core_session_t *se
                        if (b_uuid) {
                                if ((b_session = switch_core_session_locate(b_uuid))) {
                                        switch_channel_t *b_channel = switch_core_session_get_channel(b_session);
+                                       switch_channel_clear_flag(channel, CF_HOLD_BLEG);
                                        switch_channel_stop_broadcast(b_channel);
                                        switch_channel_wait_for_flag(b_channel, CF_BROADCAST, SWITCH_FALSE, 5000, NULL);
                                        switch_core_session_rwunlock(b_session);