[Freeswitch-svn] [commit] r4399 - in freeswitch/trunk: conf src/mod/applications/mod_conference

Freeswitch SVN anthm at freeswitch.org
Mon Feb 26 13:33:02 EST 2007


Author: anthm
Date: Mon Feb 26 13:33:01 2007
New Revision: 4399

Modified:
   freeswitch/trunk/conf/conference.conf.xml
   freeswitch/trunk/src/mod/applications/mod_conference/mod_conference.c

Log:
update conference to have waste mode for naughty providers

Modified: freeswitch/trunk/conf/conference.conf.xml
==============================================================================
--- freeswitch/trunk/conf/conference.conf.xml	(original)
+++ freeswitch/trunk/conf/conference.conf.xml	Mon Feb 26 13:33:01 2007
@@ -36,6 +36,11 @@
       <param name="interval" value="20"/>
       <!-- Energy level required for audio to be sent to the other users -->
       <param name="energy-level" value="300"/>
+
+      <!--Can be | delim of waste|mute|deaf waste will always transmit data to each channel
+          even during silence -->
+      <!--<param name="member-flags" value="waste"/>-->
+
       <!-- Name of the caller control group to use for this profile -->
       <!-- <param name="caller-controls" value="some name"/> -->
       <!-- TTS Engine to use -->

Modified: freeswitch/trunk/src/mod/applications/mod_conference/mod_conference.c
==============================================================================
--- freeswitch/trunk/src/mod/applications/mod_conference/mod_conference.c	(original)
+++ freeswitch/trunk/src/mod/applications/mod_conference/mod_conference.c	Mon Feb 26 13:33:01 2007
@@ -117,7 +117,8 @@
 	MFLAG_KICKED = (1 << 3), 
 	MFLAG_ITHREAD = (1 << 4), 
 	MFLAG_NOCHANNEL = (1 << 5),
-    MFLAG_INTREE = (1 << 6)
+    MFLAG_INTREE = (1 << 6),
+	MFLAG_WASTE_BANDWIDTH = (1 << 7)
 } member_flag_t;
 
 typedef enum {
@@ -188,6 +189,7 @@
 	char *profile_name;
 	char *domain;
 	uint32_t flags;
+	uint32_t mflags;
 	switch_call_cause_t bridge_hangup_cause;
 	switch_mutex_t *flag_mutex;
 	uint32_t rate;
@@ -1358,8 +1360,13 @@
 			}
 		}
 
+
+		if (switch_test_flag(member, MFLAG_WASTE_BANDWIDTH) && !talking) {
+			memset(read_frame->data, 255, read_frame->datalen);
+		}
+
 		/* skip frames that are not actual media or when we are muted or silent */
-		if ((talking || energy_level == 0) && switch_test_flag(member, MFLAG_CAN_SPEAK)) {
+		if ((talking || energy_level == 0) && switch_test_flag(member, MFLAG_CAN_SPEAK) || switch_test_flag(member, MFLAG_WASTE_BANDWIDTH)) {
 			if (member->read_resampler) {
 				int16_t *bptr = (int16_t *) read_frame->data;
 				int len = (int) read_frame->datalen;;
@@ -1630,7 +1637,7 @@
 				write_frame.data = data;
 				use_buffer = member->mux_buffer;
 
-				if ((write_frame.datalen = (uint32_t)switch_buffer_read(use_buffer, write_frame.data, bytes))) {
+				while ((write_frame.datalen = (uint32_t)switch_buffer_read(use_buffer, write_frame.data, bytes))) {
 					if (write_frame.datalen && switch_test_flag(member, MFLAG_CAN_HEAR)) {
 						write_frame.samples = write_frame.datalen / 2;
 
@@ -1638,16 +1645,18 @@
 						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_mutex_unlock(member->audio_out_mutex);
 				continue;
-			}
+			} 
 		}
 
 		switch_core_timer_next(&timer);
+
 	} /* Rinse ... Repeat */
 
 	if (member->digit_stream != NULL) {
@@ -3624,6 +3633,21 @@
     return status;
 }
 
+static void set_mflags(char *flags, uint32_t *f)
+{
+	if (flags) {
+		if (strstr(flags, "mute")) {
+			*f &= ~MFLAG_CAN_SPEAK;
+		} else if (strstr(flags, "deaf")) {
+			*f &= ~MFLAG_CAN_HEAR;
+		} else if (strstr(flags, "waste")) {
+			*f |= MFLAG_WASTE_BANDWIDTH;
+		}
+	}
+
+}
+
+
 /* Application interface function that is called from the dialplan to join the channel to a conference */
 static void conference_function(switch_core_session_t *session, char *data)
 {
@@ -3640,7 +3664,7 @@
     char *profile_name = NULL;
     switch_xml_t cxml = NULL, cfg = NULL, profiles = NULL;
     char *flags_str;
-    member_flag_t uflags = MFLAG_CAN_SPEAK | MFLAG_CAN_HEAR;
+    member_flag_t mflags = 0;
     switch_core_session_message_t msg = {0};
     uint8_t rl = 0, isbr = 0;
     char *dpin = NULL;
@@ -3655,22 +3679,6 @@
         return;
     }
 
-    /* Start the conference muted or deaf ? */
-    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;
-        }
-    }
 
     /* is this a bridging conference ? */
     if (!strncasecmp(mydata, bridge_prefix, strlen(bridge_prefix))) {
@@ -3966,11 +3974,24 @@
     /* Install our Signed Linear codec so we get the audio in that format */
     switch_core_session_set_read_codec(member.session, &member.read_codec);
 
+    if ((flags_str = strstr(mydata, flags_prefix))) {
+        char *p;
+
+        *flags_str = '\0';
+        flags_str += strlen(flags_prefix);
+        if ((p = strchr(flags_str, '}'))) {
+            *p = '\0';
+        }
+    }
+	
+	mflags = conference->mflags;
+	set_mflags(flags_str, &mflags);
+    switch_set_flag_locked((&member), MFLAG_RUNNING | mflags);
+	
     /* Add the caller to the conference */
     if (conference_add_member(conference, &member) != SWITCH_STATUS_SUCCESS) {
         goto codec_done1;
     }
-    switch_set_flag_locked((&member), MFLAG_RUNNING | uflags);
 
     msg.from = __FILE__;
 
@@ -4447,6 +4468,7 @@
     char *caller_id_name = NULL;
     char *caller_id_number = NULL;
     char *caller_controls = NULL;
+	char *member_flags = NULL;
     uint32_t max_members = 0;
     uint32_t anounce_count = 0;
     char *maxmember_sound = NULL;
@@ -4508,6 +4530,8 @@
             is_locked_sound = val;
         } else if (!strcasecmp(var, "is-unlocked-sound")) {
             is_unlocked_sound = val;
+        } else if (!strcasecmp(var, "member-flags")) {
+			member_flags = val;
         } else if (!strcasecmp(var, "kicked-sound")) {
             kicked_sound = val;
         } else if (!strcasecmp(var, "pin")) {
@@ -4605,6 +4629,11 @@
     conference->caller_id_name = switch_core_strdup(conference->pool, caller_id_name);
     conference->caller_id_number = switch_core_strdup(conference->pool, caller_id_number);
 
+	conference->mflags = MFLAG_CAN_SPEAK | MFLAG_CAN_HEAR;
+
+	if (member_flags) {
+		set_mflags(member_flags, &conference->mflags);
+	} 
 
     if (sound_prefix) {
         conference->sound_prefix = switch_core_strdup(conference->pool, sound_prefix);



More information about the Freeswitch-svn mailing list