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);
SWITCH_RTP_FLAG_FIR,
SWITCH_RTP_FLAG_PLI,
SWITCH_RTP_FLAG_RESET,
+ SWITCH_RTP_FLAG_MUTE,
SWITCH_RTP_FLAG_INVALID
} switch_rtp_flag_t;
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,
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);
}
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);
}
/* 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;
}
}
+//?
+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);
+}
//?
}
}
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;
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);