From d1e529aefdb32890296b9b55df9a20e9acd697c2 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Mon, 27 Oct 2014 15:13:36 -0400 Subject: [PATCH] Add new hard_mute control to allow apps to request low level mute e.g. from the rtp stack level. Its used in mod_conference to avoid reading audio while muted and possibly reduce some transcoding load --- src/include/switch_core_media.h | 1 + src/include/switch_types.h | 2 ++ .../mod_conference/mod_conference.c | 14 ++++++++++ src/switch_core_media.c | 27 ++++++++++++++++++- src/switch_rtp.c | 4 +++ 5 files changed, 47 insertions(+), 1 deletion(-) diff --git a/src/include/switch_core_media.h b/src/include/switch_core_media.h index 2256814d01..d5baac404a 100644 --- a/src/include/switch_core_media.h +++ b/src/include/switch_core_media.h @@ -216,6 +216,7 @@ SWITCH_DECLARE(void) switch_core_media_set_udptl_image_sdp(switch_core_session_t SWITCH_DECLARE(switch_core_media_params_t *) switch_core_media_get_mparams(switch_media_handle_t *smh); SWITCH_DECLARE(void) switch_core_media_prepare_codecs(switch_core_session_t *session, switch_bool_t force); SWITCH_DECLARE(void) switch_core_media_start_udptl(switch_core_session_t *session, switch_t38_options_t *t38_options); +SWITCH_DECLARE(void) switch_core_media_hard_mute(switch_core_session_t *session, switch_bool_t on); SWITCH_DECLARE(switch_status_t) switch_core_media_receive_message(switch_core_session_t *session, switch_core_session_message_t *msg); diff --git a/src/include/switch_types.h b/src/include/switch_types.h index 9fd067c0f5..6b9f303f47 100644 --- a/src/include/switch_types.h +++ b/src/include/switch_types.h @@ -727,6 +727,7 @@ typedef enum { SWITCH_RTP_FLAG_FIR, SWITCH_RTP_FLAG_PLI, SWITCH_RTP_FLAG_RESET, + SWITCH_RTP_FLAG_MUTE, SWITCH_RTP_FLAG_INVALID } switch_rtp_flag_t; @@ -1039,6 +1040,7 @@ typedef enum { SWITCH_MESSAGE_INDICATE_STUN_ERROR, SWITCH_MESSAGE_INDICATE_MEDIA_RENEG, SWITCH_MESSAGE_INDICATE_KEEPALIVE, + SWITCH_MESSAGE_INDICATE_HARD_MUTE, SWITCH_MESSAGE_REFER_EVENT, SWITCH_MESSAGE_ANSWER_EVENT, SWITCH_MESSAGE_PROGRESS_EVENT, diff --git a/src/mod/applications/mod_conference/mod_conference.c b/src/mod/applications/mod_conference/mod_conference.c index d0e68a5211..dbcab987c8 100644 --- a/src/mod/applications/mod_conference/mod_conference.c +++ b/src/mod/applications/mod_conference/mod_conference.c @@ -6139,6 +6139,10 @@ static switch_status_t conf_api_sub_mute(conference_member_t *member, switch_str switch_clear_flag_locked(member, MFLAG_CAN_SPEAK); switch_clear_flag_locked(member, MFLAG_TALKING); + if (member->session && !switch_test_flag(member, MFLAG_INDICATE_MUTE)) { + switch_core_media_hard_mute(member->session, SWITCH_TRUE); + } + if (!(data) || !strstr((char *) data, "quiet")) { switch_set_flag(member, MFLAG_INDICATE_MUTE); } @@ -6232,6 +6236,11 @@ static switch_status_t conf_api_sub_unmute(conference_member_t *member, switch_s return SWITCH_STATUS_GENERR; switch_set_flag_locked(member, MFLAG_CAN_SPEAK); + + if (member->session && !switch_test_flag(member, MFLAG_INDICATE_MUTE)) { + switch_core_media_hard_mute(member->session, SWITCH_FALSE); + } + if (!(data) || !strstr((char *) data, "quiet")) { switch_set_flag(member, MFLAG_INDICATE_UNMUTE); } @@ -9264,6 +9273,11 @@ SWITCH_STANDARD_APP(conference_function) /* no conference yet, so check for join-only flag */ if (flags_str) { set_mflags(flags_str,&mflags); + + if (!(mflags & MFLAG_CAN_SPEAK) && (mflags & MFLAG_INDICATE_MUTE)) { + switch_core_media_hard_mute(session, SWITCH_TRUE); + } + if (mflags & MFLAG_JOIN_ONLY) { switch_event_t *event; switch_xml_t jos_xml; diff --git a/src/switch_core_media.c b/src/switch_core_media.c index 8311dbe3ed..e6505ea8e2 100644 --- a/src/switch_core_media.c +++ b/src/switch_core_media.c @@ -7656,8 +7656,17 @@ SWITCH_DECLARE(void) switch_core_media_start_udptl(switch_core_session_t *sessio } } +//? +SWITCH_DECLARE(void) switch_core_media_hard_mute(switch_core_session_t *session, switch_bool_t on) +{ + switch_core_session_message_t msg = { 0 }; + + msg.from = __FILE__; - + msg.message_id = SWITCH_MESSAGE_INDICATE_HARD_MUTE; + msg.numeric_arg = on; + switch_core_session_receive_message(session, &msg); +} //? @@ -7718,6 +7727,22 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_receive_message(switch_core_se } } break; + + case SWITCH_MESSAGE_INDICATE_HARD_MUTE: + { + if (a_engine->rtp_session) { + if (msg->numeric_arg) { + switch_rtp_set_flag(a_engine->rtp_session, SWITCH_RTP_FLAG_MUTE); + } else { + switch_rtp_clear_flag(a_engine->rtp_session, SWITCH_RTP_FLAG_MUTE); + } + + rtp_flush_read_buffer(a_engine->rtp_session, SWITCH_RTP_FLUSH_ONCE); + } + } + + break; + case SWITCH_MESSAGE_INDICATE_DEBUG_MEDIA: { switch_rtp_t *rtp = a_engine->rtp_session; diff --git a/src/switch_rtp.c b/src/switch_rtp.c index 7c3a5dba92..3b17b6ae3b 100644 --- a/src/switch_rtp.c +++ b/src/switch_rtp.c @@ -5915,6 +5915,10 @@ static int rtp_common_read(switch_rtp_t *rtp_session, switch_payload_t *payload_ result_continue: timer_check: + + if (rtp_session->flags[SWITCH_RTP_FLAG_MUTE]) { + do_cng++; + } if (do_cng) { uint8_t *data = (uint8_t *) RTP_BODY(rtp_session);