]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
Add new hard_mute control to allow apps to request low level mute e.g. from the rtp...
authorAnthony Minessale <anthm@freeswitch.org>
Mon, 27 Oct 2014 19:13:36 +0000 (15:13 -0400)
committerAnthony Minessale <anthm@freeswitch.org>
Mon, 27 Oct 2014 19:13:42 +0000 (15:13 -0400)
src/include/switch_core_media.h
src/include/switch_types.h
src/mod/applications/mod_conference/mod_conference.c
src/switch_core_media.c
src/switch_rtp.c

index 2256814d0141f846333db173803902ad5dc3add7..d5baac404a46e8fa3a8b2f4daf3ff83218a3fd2a 100644 (file)
@@ -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);
 
 
index 9fd067c0f508799ff83acffd328ec63a1ca141e6..6b9f303f4775d0e5d04a10fe05a9224063ab5b83 100644 (file)
@@ -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,
index d0e68a521141938c330fb583a56a38bbb4aff035..dbcab987c81e112a788e123f1653ce2a2b7bba49 100644 (file)
@@ -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;
index 8311dbe3ed6ac5db7121503f6e3e3c787b44048f..e6505ea8e2461a2405467e53c5430d2b3a6e04c0 100644 (file)
@@ -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;
index 7c3a5dba92a6f1b5d48acec20dcf08548c699bed..3b17b6ae3b479ab82de59674301ed93cee084a5f 100644 (file)
@@ -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);