]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
fix proxy-media issue regression
authorAnthony Minessale <anthony.minessale@gmail.com>
Tue, 20 Oct 2009 17:03:03 +0000 (17:03 +0000)
committerAnthony Minessale <anthony.minessale@gmail.com>
Tue, 20 Oct 2009 17:03:03 +0000 (17:03 +0000)
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@15181 d0543943-73ff-0310-b7d9-9358b9ac24b2

src/include/switch_types.h
src/mod/endpoints/mod_sofia/sofia_glue.c
src/switch_core_session.c
src/switch_core_state_machine.c

index e7737fddf2d22c022e7b326a49933490c7349c9e..2b6aadebe8729b64e010ee63c10aa32452857026 100644 (file)
@@ -868,7 +868,8 @@ CF_STOP_BROADCAST   - Signal to stop broadcast
 
 typedef enum {
        CC_MEDIA_ACK = 1,
-       CC_BYPASS_MEDIA = 1,
+       CC_BYPASS_MEDIA,
+       CC_PROXY_MEDIA,
        /* WARNING: DO NOT ADD ANY FLAGS BELOW THIS LINE */
        CC_FLAG_MAX
 } switch_channel_cap_t;
@@ -914,6 +915,7 @@ typedef enum {
        CF_ORIGINATOR,
        CF_XFER_ZOMBIE,
        CF_MEDIA_ACK,
+       CF_THREAD_SLEEPING,
        /* WARNING: DO NOT ADD ANY FLAGS BELOW THIS LINE */
        CF_FLAG_MAX
 } switch_channel_flag_t;
index 861762b25ffbd3e8ebb1a0c1f0ba8411b9bc5b90..66956cc7212b5a61abeb33515faae1977d58cd88 100644 (file)
@@ -523,6 +523,7 @@ void sofia_glue_attach_private(switch_core_session_t *session, sofia_profile_t *
        tech_pvt->channel = switch_core_session_get_channel(session);
        switch_channel_set_cap(tech_pvt->channel, CC_MEDIA_ACK);
        switch_channel_set_cap(tech_pvt->channel, CC_BYPASS_MEDIA);
+       switch_channel_set_cap(tech_pvt->channel, CC_PROXY_MEDIA);
        
        switch_core_session_set_private(session, tech_pvt);
 
index d002cdc511c0a5a31af60f577aeba2a3ef4a8667..de5a7d3590daa8715af0f641bf96ff49e0cb03aa 100644 (file)
@@ -507,19 +507,25 @@ SWITCH_DECLARE(switch_call_cause_t) switch_core_session_outgoing_channel(switch_
 
                        if (switch_channel_test_flag(channel, CF_PROXY_MODE)) {
                                if (switch_channel_test_cap(peer_channel, CC_BYPASS_MEDIA)) {
-                                       switch_channel_set_flag(peer_channel, CF_PROXY_MODE);
-                       
-                                       if (switch_channel_test_flag(channel, CF_PROXY_MEDIA)) {
-                                               switch_channel_set_flag(peer_channel, CF_PROXY_MEDIA);
-                                               if (switch_channel_test_flag(channel, CF_VIDEO)) {
-                                                       switch_channel_set_flag(peer_channel, CF_VIDEO);
-                                               }
-                                       }
+                                       switch_channel_set_flag(peer_channel, CF_PROXY_MODE);           
                                } else {
                                        switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_WARNING, 
                                                                          "%s does not support the proxy feature, disabling.\n", 
                                                                          switch_channel_get_name(peer_channel));
                                        switch_channel_clear_flag(channel, CF_PROXY_MODE);
+                               }
+                       }
+
+                       if (switch_channel_test_flag(channel, CF_PROXY_MEDIA)) {
+                               if (switch_channel_test_cap(peer_channel, CC_PROXY_MEDIA)) {
+                                       switch_channel_set_flag(peer_channel, CF_PROXY_MEDIA);
+                                       if (switch_channel_test_flag(channel, CF_VIDEO)) {
+                                               switch_channel_set_flag(peer_channel, CF_VIDEO);
+                                       }
+                               } else {
+                                       switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_WARNING, 
+                                                                         "%s does not support the proxy feature, disabling.\n", 
+                                                                         switch_channel_get_name(peer_channel));
                                        switch_channel_clear_flag(channel, CF_PROXY_MEDIA);
                                }
                        }
@@ -703,7 +709,9 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_queue_message(switch_core_se
                        status = SWITCH_STATUS_SUCCESS;
                }
 
-               if (switch_channel_test_flag(session->channel, CF_PROXY_MODE)) {
+               switch_core_session_kill_channel(session, SWITCH_SIG_BREAK);
+
+               if (switch_channel_test_flag(session->channel, CF_PROXY_MODE) || switch_channel_test_flag(session->channel, CF_THREAD_SLEEPING)) {
                        switch_core_session_wake_session_thread(session);
                }
        }
index 6e70069851e33a9eac61def935c05b8c0deea0c2..b33353e48a33137df33fdbd84d3892c34b3ead5f 100644 (file)
@@ -381,8 +381,10 @@ SWITCH_DECLARE(void) switch_core_session_run(switch_core_session_t *session)
                                        switch_core_session_receive_message(session, message);
                                        message = NULL;
                                }
-                               
+
+                               switch_channel_set_flag(session->channel, CF_THREAD_SLEEPING);
                                switch_thread_cond_wait(session->cond, session->mutex);
+                               switch_channel_clear_flag(session->channel, CF_THREAD_SLEEPING);
                                
                                while (switch_core_session_dequeue_message(session, &message) == SWITCH_STATUS_SUCCESS) {
                                        switch_core_session_receive_message(session, message);