]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
update
authorAnthony Minessale <anthony.minessale@gmail.com>
Mon, 24 Mar 2008 20:58:44 +0000 (20:58 +0000)
committerAnthony Minessale <anthony.minessale@gmail.com>
Mon, 24 Mar 2008 20:58:44 +0000 (20:58 +0000)
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@7955 d0543943-73ff-0310-b7d9-9358b9ac24b2

src/include/switch_types.h
src/mod/endpoints/mod_sofia/mod_sofia.c
src/mod/endpoints/mod_sofia/sofia.c
src/switch_core_io.c
src/switch_ivr.c

index 8da6118e4acb2b9211bca85ff3fa78d6835c00d6..31a3a0917a84e996f73b8ceeffec532228e4534b 100644 (file)
@@ -722,7 +722,8 @@ typedef enum {
        CF_ORIGINATING = (1 << 25),
        CF_STOP_BROADCAST = (1 << 26),
        CF_PROXY_MEDIA = (1 << 27),
-       CF_INNER_BRIDGE = (1 << 28)
+       CF_INNER_BRIDGE = (1 << 28),
+       CF_REQ_MEDIA = (1 << 29)
 } switch_channel_flag_t;
 
 
index 47ee7140b6a45b97ab785a012d83d4b35f7a8067..4eac662e60f3b306f10450444a1ba554ad1aa1d1 100644 (file)
@@ -513,7 +513,7 @@ static switch_status_t sofia_read_frame(switch_core_session_t *session, switch_f
                return SWITCH_STATUS_FALSE;
        }
 
-       while (!(tech_pvt->read_codec.implementation && switch_rtp_ready(tech_pvt->rtp_session))) {
+       while (!(tech_pvt->read_codec.implementation && switch_rtp_ready(tech_pvt->rtp_session) && !switch_channel_test_flag(channel, CF_REQ_MEDIA))) {
                if (switch_channel_ready(channel)) {
                        switch_yield(10000);
                } else {
@@ -590,7 +590,7 @@ static switch_status_t sofia_write_frame(switch_core_session_t *session, switch_
 
        switch_assert(tech_pvt != NULL);
 
-       while (!(tech_pvt->read_codec.implementation && switch_rtp_ready(tech_pvt->rtp_session))) {
+       while (!(tech_pvt->read_codec.implementation && switch_rtp_ready(tech_pvt->rtp_session) && !switch_channel_test_flag(channel, CF_REQ_MEDIA))) {
                if (switch_channel_ready(channel)) {
                        switch_yield(10000);
                } else {
@@ -782,6 +782,7 @@ static switch_status_t sofia_receive_message(switch_core_session_t *session, swi
                        if (!tech_pvt->local_sdp_str) {
                                sofia_glue_tech_absorb_sdp(tech_pvt);
                        }
+                       switch_channel_set_flag(tech_pvt->channel, CF_REQ_MEDIA);
                        sofia_glue_do_invite(session);
                }
                break;
@@ -797,7 +798,7 @@ static switch_status_t sofia_receive_message(switch_core_session_t *session, swi
 
        case SWITCH_MESSAGE_INDICATE_MEDIA:
                {
-                       uint32_t count = 0, send_invite = 1;
+                       uint32_t send_invite = 1;
                        
                        switch_channel_clear_flag(channel, CF_PROXY_MODE);
                        tech_pvt->local_sdp_str = NULL;
@@ -827,20 +828,8 @@ static switch_status_t sofia_receive_message(switch_core_session_t *session, swi
                        sofia_glue_set_local_sdp(tech_pvt, NULL, 0, NULL, 1);
 
                        if (send_invite) {
+                               switch_channel_set_flag(tech_pvt->channel, CF_REQ_MEDIA);
                                sofia_glue_do_invite(session);
-                               /* wait for rtp to start and first real frame to arrive */
-                               tech_pvt->read_frame.datalen = 0;
-                               while (switch_test_flag(tech_pvt, TFLAG_IO) && switch_channel_get_state(channel) < CS_HANGUP && !switch_rtp_ready(tech_pvt->rtp_session)) {
-                                       if (++count > 1000) {
-                                               status = SWITCH_STATUS_FALSE;
-                                               goto end;
-                                       }
-                                       if (!switch_rtp_ready(tech_pvt->rtp_session)) {
-                                               switch_yield(1000);
-                                               continue;
-                                       }
-                                       break;
-                               }
                        }
                }
                break;
index a5da08542a7ac9dcf35535312c31ee3beff2bfd7..9c3d48c0c278bcea8abd9938a52ced869a27b1ec 100644 (file)
@@ -1404,10 +1404,11 @@ static void sofia_handle_sip_r_invite(switch_core_session_t *session, int status
                switch_channel_t *channel = switch_core_session_get_channel(session);
                const char *uuid;
                switch_core_session_t *other_session;
+               private_object_t *tech_pvt = switch_core_session_get_private(session);
+               
+               switch_channel_clear_flag(channel, CF_REQ_MEDIA);
 
                if (switch_channel_test_flag(channel, CF_PROXY_MODE) || switch_channel_test_flag(channel, CF_PROXY_MEDIA)) {
-                       private_object_t *tech_pvt = switch_core_session_get_private(session);
-                       switch_assert(tech_pvt != NULL);
 
                        if (!switch_test_flag(tech_pvt, TFLAG_SENT_UPDATE)) {
                                return;
@@ -1827,6 +1828,8 @@ static void sofia_handle_sip_i_state(switch_core_session_t *session, int status,
                }
                break;
        case nua_callstate_ready:
+               switch_channel_clear_flag(channel, CF_REQ_MEDIA);
+
                if (tech_pvt && nh == tech_pvt->nh2) {
                        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Cheater Reinvite!\n");
                        switch_set_flag_locked(tech_pvt, TFLAG_REINVITE);
index f537e5072ea54ea0f5f1ae0f7fe0b0b77dd2820e..06dfc5cc760cf945e6b551e8a87391d2419997b7 100644 (file)
@@ -475,6 +475,7 @@ static switch_status_t perform_write(switch_core_session_t *session, switch_fram
                        }
                }
        }
+
        return status;
 }
 
@@ -868,6 +869,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_write_frame(switch_core_sess
        }
 
   done:
+
        if (do_write) {
                return perform_write(session, frame, timeout, io_flag, stream_id);
        }
index e9ca021425e16fc418948179376d6ea543ef436c..7f4df5929a0ec03b8e0014063902e137473721fe 100644 (file)
@@ -800,7 +800,8 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_media(const char *uuid, switch_media_
        switch_core_session_message_t msg = { 0 };
        switch_status_t status = SWITCH_STATUS_GENERR;
        uint8_t swap = 0;
-
+       switch_frame_t *read_frame = NULL;
+       
        msg.message_id = SWITCH_MESSAGE_INDICATE_MEDIA;
        msg.from = __FILE__;
 
@@ -815,12 +816,17 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_media(const char *uuid, switch_media_
                        status = SWITCH_STATUS_SUCCESS;
                        switch_core_session_receive_message(session, &msg);
 
+                       switch_channel_wait_for_flag(channel, CF_REQ_MEDIA, SWITCH_FALSE, 10000);
+                       switch_core_session_read_frame(session, &read_frame, -1, 0);
+                       
                        if ((flags & SMF_REBRIDGE)
                                && (other_uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BRIDGE_VARIABLE))
                                && (other_session = switch_core_session_locate(other_uuid))) {
                                other_channel = switch_core_session_get_channel(other_session);
                                switch_assert(other_channel != NULL);
                                switch_core_session_receive_message(other_session, &msg);
+                               switch_channel_wait_for_flag(other_channel, CF_REQ_MEDIA, SWITCH_FALSE, 10000);
+                               switch_core_session_read_frame(other_session, &read_frame, -1, 0);
                                switch_channel_clear_state_handler(other_channel, NULL);
                                switch_core_session_rwunlock(other_session);
                        }
@@ -865,12 +871,14 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_nomedia(const char *uuid, switch_medi
 
                if ((flags & SMF_FORCE) || !switch_channel_test_flag(channel, CF_PROXY_MODE)) {
                        switch_core_session_receive_message(session, &msg);
+                       switch_channel_wait_for_flag(channel, CF_REQ_MEDIA, SWITCH_FALSE, 10000);
 
                        if ((flags & SMF_REBRIDGE) && (other_uuid = switch_channel_get_variable(channel, SWITCH_BRIDGE_VARIABLE)) &&
                                (other_session = switch_core_session_locate(other_uuid))) {
                                other_channel = switch_core_session_get_channel(other_session);
 
                                switch_core_session_receive_message(other_session, &msg);
+                               switch_channel_wait_for_flag(other_channel, CF_REQ_MEDIA, SWITCH_FALSE, 10000);
                                switch_channel_clear_state_handler(other_channel, NULL);
                        }