[Asterisk-cvs] asterisk/apps app_meetme.c,1.86,1.87

markster at lists.digium.com markster at lists.digium.com
Thu Mar 17 14:34:30 CST 2005


Update of /usr/cvsroot/asterisk/apps
In directory mongoose.digium.com:/tmp/cvs-serv567/apps

Modified Files:
	app_meetme.c 
Log Message:
Merge improved announcements for conferences with leader (bug #2382)


Index: app_meetme.c
===================================================================
RCS file: /usr/cvsroot/asterisk/apps/app_meetme.c,v
retrieving revision 1.86
retrieving revision 1.87
diff -u -d -r1.86 -r1.87
--- app_meetme.c	12 Mar 2005 05:37:32 -0000	1.86
+++ app_meetme.c	17 Mar 2005 20:29:51 -0000	1.87
@@ -555,16 +555,6 @@
 	{ "meetme", NULL, NULL }, conf_cmd,
 	"Execute a command on a conference or conferee", conf_usage, complete_confcmd };
 
-static int confnonzero(void *ptr)
-{
-	struct ast_conference *conf = ptr;
-	int res;
-	ast_mutex_lock(&conflock);
-	res = (conf->markedusers == 0);
-	ast_mutex_unlock(&conflock);
-	return res;
-}
-
 static void conf_flush(int fd)
 {
 	int x;
@@ -593,6 +583,8 @@
 	int musiconhold = 0;
 	int firstpass = 0;
 	int origquiet;
+	int lastmarked = 0;
+	int currentmarked = 0;
 	int ret = -1;
 	int x;
 	int menu_active = 0;
@@ -692,35 +684,13 @@
 		ast_record_review(chan,"vm-rec-name",user->namerecloc, 10,"sln", &duration, NULL);
 	}
 
-	while((confflags & CONFFLAG_WAITMARKED) && (conf->markedusers == 0)) {
-		confflags &= ~CONFFLAG_QUIET;
-		confflags |= origquiet;
-		/* XXX Announce that we're waiting on the conference lead to join */
-		if (!(confflags & CONFFLAG_QUIET)) {
-			res = ast_streamfile(chan, "vm-dialout", chan->language);
-			if (!res)
-				res = ast_waitstream(chan, "");
-		} else
-			res = 0;
-		/* If we're waiting with hold music, set to silent mode */
-		if (!res) {
-			confflags |= CONFFLAG_QUIET;
-			ast_moh_start(chan, NULL);
-			res = ast_safe_sleep_conditional(chan, 60000, confnonzero, conf);
-			ast_moh_stop(chan);
-		}
-		if (res < 0) {
-			ast_log(LOG_DEBUG, "Got hangup on '%s' already\n", chan->name);
-			goto outrun;
-		}
-	}
-	
-	if (!(confflags & CONFFLAG_QUIET) && conf->users == 1) {
-		if (!ast_streamfile(chan, "conf-onlyperson", chan->language)) {
-			if (ast_waitstream(chan, "") < 0)
-				goto outrun;
-		} else
-			goto outrun;
+	if (!(confflags & CONFFLAG_QUIET)) {
+		if (conf->users == 1 && !(confflags & CONFFLAG_WAITMARKED))
+			if (!ast_streamfile(chan, "conf-onlyperson", chan->language))
+				ast_waitstream(chan, "");
+		if ((confflags & CONFFLAG_WAITMARKED) && conf->markedusers == 0)
+			if (!ast_streamfile(chan, "conf-waitforleader", chan->language))
+				ast_waitstream(chan, "");
 	}
 
 	/* Set it into linear mode (write) */
@@ -835,7 +805,8 @@
 	if (!firstpass && !(confflags & CONFFLAG_MONITOR) && !(confflags & CONFFLAG_ADMIN)) {
 		firstpass = 1;
 		if (!(confflags & CONFFLAG_QUIET))
-			conf_play(chan, conf, ENTER);
+			if ((confflags & CONFFLAG_WAITMARKED) && conf->markedusers >= 1)
+				conf_play(chan, conf, ENTER);
 	}
 	conf_flush(fd);
 	ast_mutex_unlock(&conflock);
@@ -879,13 +850,82 @@
 		for(;;) {
 			outfd = -1;
 			ms = -1;
+			currentmarked = conf->markedusers;
+			if (!(confflags & CONFFLAG_QUIET) && (confflags & CONFFLAG_MARKEDUSER) && (confflags & CONFFLAG_WAITMARKED) && lastmarked == 0) {
+				if (currentmarked == 1 && conf->users > 1) {
+					ast_say_number(chan, conf->users - 1, AST_DIGIT_ANY, chan->language, (char *) NULL);
+					if (conf->users - 1 == 1) {
+						if (!ast_streamfile(chan, "conf-userwilljoin", chan->language))
+							ast_waitstream(chan, "");
+					} else {
+						if (!ast_streamfile(chan, "conf-userswilljoin", chan->language))
+							ast_waitstream(chan, "");
+					}
+				}
+				if (conf->users == 1 && ! (confflags & CONFFLAG_MARKEDUSER))
+					if (!ast_streamfile(chan, "conf-onlyperson", chan->language))
+						ast_waitstream(chan, "");
+			}
+
 			c = ast_waitfor_nandfds(&chan, 1, &fd, nfds, NULL, &outfd, &ms);
 			
 			/* Update the struct with the actual confflags */
 			user->userflags = confflags;
 			
+			if (confflags & CONFFLAG_WAITMARKED) {
+				if(currentmarked == 0) {
+					if (lastmarked != 0) {
+						if (!(confflags & CONFFLAG_QUIET))
+							if (!ast_streamfile(chan, "conf-leaderhasleft", chan->language))
+								ast_waitstream(chan, "");
+						if(confflags & CONFFLAG_MARKEDEXIT)
+							break;
+						else {
+							ztc.confmode = ZT_CONF_CONF;
+							if (ioctl(fd, ZT_SETCONF, &ztc)) {
+								ast_log(LOG_WARNING, "Error setting conference\n");
+								close(fd);
+								goto outrun;
+							}
+						}
+					}
+					if (musiconhold == 0 && (confflags & CONFFLAG_MOH)) {
+						ast_moh_start(chan, NULL);
+						musiconhold = 1;
+					} else {
+						ztc.confmode = ZT_CONF_CONF;
+						if (ioctl(fd, ZT_SETCONF, &ztc)) {
+							ast_log(LOG_WARNING, "Error setting conference\n");
+							close(fd);
+							goto outrun;
+						}
+					}
+				} else if(currentmarked >= 1 && lastmarked == 0) {
+					if (confflags & CONFFLAG_MONITOR)
+						ztc.confmode = ZT_CONF_CONFMON | ZT_CONF_LISTENER;
+					else if (confflags & CONFFLAG_TALKER)
+						ztc.confmode = ZT_CONF_CONF | ZT_CONF_TALKER;
+					else
+						ztc.confmode = ZT_CONF_CONF | ZT_CONF_TALKER | ZT_CONF_LISTENER;
+					if (ioctl(fd, ZT_SETCONF, &ztc)) {
+						ast_log(LOG_WARNING, "Error setting conference\n");
+						close(fd);
+						goto outrun;
+					}
+					if (musiconhold && (confflags & CONFFLAG_MOH)) {
+						ast_moh_stop(chan);
+						musiconhold = 0;
+					}
+					if ( !(confflags & CONFFLAG_QUIET) && !(confflags & CONFFLAG_MARKEDUSER)) {
+						if (!ast_streamfile(chan, "conf-placeintoconf", chan->language))
+							ast_waitstream(chan, "");
+						conf_play(chan, conf, ENTER);
+					}
+				}
+			}
+
 			/* trying to add moh for single person conf */
-			if (confflags & CONFFLAG_MOH) {
+			if ((confflags & CONFFLAG_MOH) && !( confflags & CONFFLAG_WAITMARKED)) {
 				if (conf->users == 1) {
 					if (musiconhold == 0) {
 						ast_moh_start(chan, NULL);
@@ -900,7 +940,7 @@
 			}
 			
 			/* Leave if the last marked user left */
-			if (conf->markedusers == 0 && confflags & CONFFLAG_MARKEDEXIT) {
+			if (currentmarked == 0 && (confflags & CONFFLAG_MARKEDEXIT)) {
 				ret = -1;
 				break;
 			}
@@ -1152,6 +1192,7 @@
 				} else 
 					ast_log(LOG_WARNING, "Failed to read frame: %s\n", strerror(errno));
 			}
+			lastmarked = currentmarked;
 		}
 	}
 	if (using_pseudo)




More information about the svn-commits mailing list