]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
add ability to set mute and deaf flag from the dialplan +flags{<mute>|<deaf>}
authorAnthony Minessale <anthony.minessale@gmail.com>
Mon, 10 Jul 2006 16:28:54 +0000 (16:28 +0000)
committerAnthony Minessale <anthony.minessale@gmail.com>
Mon, 10 Jul 2006 16:28:54 +0000 (16:28 +0000)
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@1811 d0543943-73ff-0310-b7d9-9358b9ac24b2

src/mod/applications/mod_conference/mod_conference.c

index 64b4e5e1b98ef28bdffcc2b209608ffbb703054e..6ad417c5b095a48e8aecf349ea6720a27f938933 100644 (file)
@@ -676,8 +676,6 @@ static void conference_loop(conference_member_t *member)
                char *digit;
                char msg[512];
 
-               switch_core_timer_next(&timer);
-
         if (switch_channel_has_dtmf(channel)) {
             switch_channel_dequeue_dtmf(channel, dtmf, sizeof(dtmf));
         }
@@ -863,28 +861,33 @@ static void conference_loop(conference_member_t *member)
                                                switch_buffer_zero(member->mux_buffer);
                                                switch_mutex_unlock(member->audio_out_mutex);
                                        }
+                                       switch_core_timer_next(&timer);
                                }
                        }
                } else {
-                       /* Flush the output buffer and write all the data (presumably muxed) back to the channel */
-                       switch_mutex_lock(member->audio_out_mutex);
-                       write_frame.data = data;
-                       while ((write_frame.datalen = (uint32_t)switch_buffer_read(member->mux_buffer, write_frame.data, bytes))) {
-                               if (write_frame.datalen && switch_test_flag(member, MFLAG_CAN_HEAR)) {
-                                       write_frame.samples = write_frame.datalen / 2;
-
-                                       /* Check for output volume adjustments */
-                                       if (member->volume_out_level) {
-                                               switch_change_sln_volume(write_frame.data, write_frame.samples, member->volume_out_level);
-                                       }
+                       if (switch_buffer_inuse(member->mux_buffer)) {
+                               /* Flush the output buffer and write all the data (presumably muxed) back to the channel */
+                               switch_mutex_lock(member->audio_out_mutex);
+                               write_frame.data = data;
+                               while ((write_frame.datalen = (uint32_t)switch_buffer_read(member->mux_buffer, write_frame.data, bytes))) {
+                                       if (write_frame.datalen && switch_test_flag(member, MFLAG_CAN_HEAR)) {
+                                               write_frame.samples = write_frame.datalen / 2;
+                                               
+                                               /* Check for output volume adjustments */
+                                               if (member->volume_out_level) {
+                                                       switch_change_sln_volume(write_frame.data, write_frame.samples, member->volume_out_level);
+                                               }
 
-                                       switch_core_session_write_frame(member->session, &write_frame, -1, 0);
+                                               switch_core_session_write_frame(member->session, &write_frame, -1, 0);
+                                       }
                                }
+                               switch_mutex_unlock(member->audio_out_mutex);
+                       } else {
+                               switch_core_timer_next(&timer);
                        }
-                       switch_mutex_unlock(member->audio_out_mutex);
                }
        } /* Rinse ... Repeat */
-
+       
        switch_clear_flag_locked(member, MFLAG_RUNNING);
        switch_core_timer_destroy(&timer);
 
@@ -2076,10 +2079,13 @@ static void conference_function(switch_core_session_t *session, char *data)
        char *mydata = switch_core_session_strdup(session, data);
        char *conf_name = NULL;
        char *bridge_prefix = "bridge:";
+       char *flags_prefix = "+flags{";
        char *bridgeto = NULL;
        char *profile_name = NULL;
        switch_xml_t cxml = NULL, cfg = NULL, profile = NULL, profiles = NULL;
-
+       char *flags_str;
+       member_flag_t uflags = MFLAG_CAN_SPEAK | MFLAG_CAN_HEAR;
+       
        channel = switch_core_session_get_channel(session);
     assert(channel != NULL);
 
@@ -2094,6 +2100,23 @@ static void conference_function(switch_core_session_t *session, char *data)
                return;
        }
 
+
+       if ((flags_str=strstr(mydata, flags_prefix))) {
+               char *p;
+
+               *flags_str = '\0';
+               flags_str += strlen(flags_prefix);
+               if ((p = strchr(flags_str, '}'))) {
+                       *p = '\0';
+               }
+
+               if (strstr(flags_str, "mute")) {
+                       uflags &= ~MFLAG_CAN_SPEAK;
+               } else if (strstr(flags_str, "deaf")) {
+                       uflags &= ~MFLAG_CAN_HEAR;
+               }
+       }
+
        if (!strncasecmp(mydata, bridge_prefix, strlen(bridge_prefix))) {
                char *uuid = switch_core_session_get_uuid(session);
                
@@ -2269,7 +2292,7 @@ static void conference_function(switch_core_session_t *session, char *data)
        if (conference_add_member(conference, &member) != SWITCH_STATUS_SUCCESS) {
                goto codec_done1;
        }
-       switch_set_flag_locked((&member), MFLAG_RUNNING | MFLAG_CAN_SPEAK | MFLAG_CAN_HEAR);
+       switch_set_flag_locked((&member), MFLAG_RUNNING | uflags);
 
        /* Run the confernece loop */
        conference_loop(&member);