]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
add break
authorAnthony Minessale <anthony.minessale@gmail.com>
Mon, 18 Dec 2006 21:40:04 +0000 (21:40 +0000)
committerAnthony Minessale <anthony.minessale@gmail.com>
Mon, 18 Dec 2006 21:40:04 +0000 (21:40 +0000)
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@3705 d0543943-73ff-0310-b7d9-9358b9ac24b2

src/include/switch_types.h
src/mod/applications/mod_conference/mod_conference.c
src/mod/endpoints/mod_sofia/mod_sofia.c
src/switch_rtp.c

index 14e144b5f870dcaf94a86e7c8f90899ab9c66776..ea1f1c42f7790f0a21fbd9aea43f3e85b68da598 100644 (file)
@@ -500,7 +500,8 @@ SWITCH_SIG_XFER - Stop the current io but leave it viable
 typedef enum {
        SWITCH_SIG_NONE,
        SWITCH_SIG_KILL,
-       SWITCH_SIG_XFER
+       SWITCH_SIG_XFER,
+    SWITCH_SIG_BREAK
 } switch_signal_t;
 
 /*!
index 4817f0b301c5183d484ddce6742f23d35849e51a..350087e3e7211f779177efa534ee9b2c377ba259 100644 (file)
@@ -1917,9 +1917,9 @@ static int conference_function_kick_member(conference_obj_t *conference, confere
                switch_clear_flag(member, MFLAG_RUNNING);
                switch_set_flag(member, MFLAG_KICKED);
                switch_mutex_unlock(member->flag_mutex);
-
+        switch_core_session_kill_channel(member->session, SWITCH_SIG_BREAK);
                stream->write_function(stream, "OK kicked %u\n", id);
-
+        
                if (switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) {
                        switch_channel_t *channel = switch_core_session_get_channel(member->session);
                        switch_channel_event_set_data(channel, event);
index 499c9ca3e6bc5dee9814edbb6b1f8e2bf347d6e4..297ad1437622db0ac1f58943ffec09e45527d36b 100644 (file)
@@ -267,10 +267,10 @@ struct private_object {
        uint32_t codec_ms;
        switch_caller_profile_t *caller_profile;
        int32_t timestamp_send;
-       int32_t timestamp_recv;
+       //int32_t timestamp_recv;
        switch_rtp_t *rtp_session;
        int ssrc;
-       switch_time_t last_read;
+       //switch_time_t last_read;
        sofia_profile_t *profile;
        char *local_sdp_audio_ip;
        switch_port_t local_sdp_audio_port;
@@ -1531,7 +1531,6 @@ static switch_status_t sofia_read_frame(switch_core_session_t *session, switch_f
                                                                                switch_io_flag_t flags, int stream_id)
 {
        private_object_t *tech_pvt = NULL;
-       size_t bytes = 0, samples = 0, frames = 0, ms = 0;
        switch_channel_t *channel = NULL;
        int payload = 0;
        
@@ -1557,19 +1556,15 @@ static switch_status_t sofia_read_frame(switch_core_session_t *session, switch_f
        tech_pvt->read_frame.datalen = 0;
        switch_set_flag_locked(tech_pvt, TFLAG_READING);
 
-
-       bytes = tech_pvt->read_codec.implementation->encoded_bytes_per_frame;
-       samples = tech_pvt->read_codec.implementation->samples_per_frame;
-       ms = tech_pvt->read_codec.implementation->microseconds_per_frame;
-       
+#if 0  
        if (tech_pvt->last_read) {
-#if 0
                elapsed = (unsigned int)((switch_time_now() - tech_pvt->last_read) / 1000);
                if (elapsed > 60000) {
                        return SWITCH_STATUS_TIMEOUT;
                }
-#endif
        }
+#endif
+
 
        if (switch_test_flag(tech_pvt, TFLAG_IO)) {
                switch_status_t status;
@@ -1616,23 +1611,16 @@ static switch_status_t sofia_read_frame(switch_core_session_t *session, switch_f
 
 
                        if (tech_pvt->read_frame.datalen > 0) {
-                               tech_pvt->last_read = switch_time_now();
-
-                               if (tech_pvt->read_codec.implementation->encoded_bytes_per_frame) {
-                                       bytes = tech_pvt->read_codec.implementation->encoded_bytes_per_frame;
-                                       frames = (tech_pvt->read_frame.datalen / bytes);
-                               } else
-                                       frames = 1;
-
-                               samples = frames * tech_pvt->read_codec.implementation->samples_per_frame;
-                               ms = frames * tech_pvt->read_codec.implementation->microseconds_per_frame;
-                               tech_pvt->timestamp_recv += (int32_t) samples;
-                               tech_pvt->read_frame.samples = (int) samples;
+                size_t bytes = 0;
+                int frames = 0;
+                               //tech_pvt->last_read = switch_time_now();
+                bytes = tech_pvt->read_codec.implementation->encoded_bytes_per_frame;
+                frames = (tech_pvt->read_frame.datalen / bytes);
+                               tech_pvt->read_frame.samples = (int) (frames * tech_pvt->read_codec.implementation->samples_per_frame);
                                break;
                        }
                }
-
-       } 
+       }
        
        switch_clear_flag_locked(tech_pvt, TFLAG_READING);
 
@@ -1724,12 +1712,21 @@ static switch_status_t sofia_kill_channel(switch_core_session_t *session, int si
        tech_pvt = (private_object_t *) switch_core_session_get_private(session);
        assert(tech_pvt != NULL);
 
-       switch_clear_flag_locked(tech_pvt, TFLAG_IO);
-       switch_set_flag_locked(tech_pvt, TFLAG_HUP);
 
-       if (switch_rtp_ready(tech_pvt->rtp_session)) {
-               switch_rtp_kill_socket(tech_pvt->rtp_session);
-       }
+    switch(sig) {
+    case SWITCH_SIG_BREAK:
+        switch_rtp_set_flag(tech_pvt->rtp_session, SWITCH_RTP_FLAG_BREAK);
+        break;
+    case SWITCH_SIG_KILL:
+    default:
+        switch_clear_flag_locked(tech_pvt, TFLAG_IO);
+        switch_set_flag_locked(tech_pvt, TFLAG_HUP);
+
+        if (switch_rtp_ready(tech_pvt->rtp_session)) {
+            switch_rtp_kill_socket(tech_pvt->rtp_session);
+        }
+        break;
+    }
 
        return SWITCH_STATUS_SUCCESS;
 
index c8108b480d1b4ccffbb2955d57fadd0071c58ab8..b07c4f9c321055042f70c8ed65d9facfbd39f050 100644 (file)
@@ -776,7 +776,13 @@ static int rtp_common_read(switch_rtp_t *rtp_session, switch_payload_t *payload_
                
                if (switch_test_flag(rtp_session, SWITCH_RTP_FLAG_BREAK)) {
                        switch_clear_flag_locked(rtp_session, SWITCH_RTP_FLAG_BREAK);
-                       return 0;
+
+            memset(&rtp_session->recv_msg, 0, SWITCH_RTP_CNG_PAYLOAD);
+            rtp_session->recv_msg.header.pt = SWITCH_RTP_CNG_PAYLOAD;
+            *flags |= SFF_CNG;
+            /* Return a CNG frame */
+            *payload_type = SWITCH_RTP_CNG_PAYLOAD;
+            return SWITCH_RTP_CNG_PAYLOAD;
                }
 
                if (!switch_test_flag(rtp_session, SWITCH_RTP_FLAG_IO)) {
@@ -857,7 +863,7 @@ static int rtp_common_read(switch_rtp_t *rtp_session, switch_payload_t *payload_
                
                if (status == SWITCH_STATUS_BREAK || bytes == 0) {
                        if (switch_test_flag(rtp_session, SWITCH_RTP_FLAG_DATAWAIT)) {
-                               switch_yield(rtp_session->ms_per_packet);
+                               switch_yield(rtp_session->ms_per_packet/2);
                                continue;
                        }
                        return 0;