diff --git a/src/include/switch_types.h b/src/include/switch_types.h index 14e144b5f8..ea1f1c42f7 100644 --- a/src/include/switch_types.h +++ b/src/include/switch_types.h @@ -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; /*! diff --git a/src/mod/applications/mod_conference/mod_conference.c b/src/mod/applications/mod_conference/mod_conference.c index 4817f0b301..350087e3e7 100644 --- a/src/mod/applications/mod_conference/mod_conference.c +++ b/src/mod/applications/mod_conference/mod_conference.c @@ -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); diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.c b/src/mod/endpoints/mod_sofia/mod_sofia.c index 499c9ca3e6..297ad14376 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.c +++ b/src/mod/endpoints/mod_sofia/mod_sofia.c @@ -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; diff --git a/src/switch_rtp.c b/src/switch_rtp.c index c8108b480d..b07c4f9c32 100644 --- a/src/switch_rtp.c +++ b/src/switch_rtp.c @@ -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;