mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-31 02:37:10 +00:00 
			
		
		
		
	Merge improved announcements for conferences with leader (bug #2382)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@5190 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
		| @@ -555,16 +555,6 @@ static struct ast_cli_entry cli_conf = { | ||||
| 	{ "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 @@ static int conf_run(struct ast_channel *chan, struct ast_conference *conf, int c | ||||
| 	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 @@ static int conf_run(struct ast_channel *chan, struct ast_conference *conf, int c | ||||
| 		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 @@ zapretry: | ||||
| 	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 @@ zapretry: | ||||
| 		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 @@ zapretry: | ||||
| 			} | ||||
| 			 | ||||
| 			/* 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 @@ zapretry: | ||||
| 				} else  | ||||
| 					ast_log(LOG_WARNING, "Failed to read frame: %s\n", strerror(errno)); | ||||
| 			} | ||||
| 			lastmarked = currentmarked; | ||||
| 		} | ||||
| 	} | ||||
| 	if (using_pseudo) | ||||
|   | ||||
							
								
								
									
										10
									
								
								sounds.txt
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								sounds.txt
									
									
									
									
									
								
							| @@ -664,3 +664,13 @@ | ||||
| %vm-leavemsg.gsm% Press 5 to send a voicemail message | ||||
|  | ||||
| %queue-less-than.gsm%less than | ||||
| %conf-waitforleader.gsm%The conference will begin when the leader arrives. | ||||
|  | ||||
| %conf-userwilljoin.gsm%user will join the conference. | ||||
|  | ||||
| %conf-userswilljoin.gsm%users will join the conference. | ||||
|  | ||||
| %conf-leaderhasleft.gsm%The leader has left the conference. | ||||
|  | ||||
| %conf-placeintoconf.gsm%You will now be placed into the conference. | ||||
|  | ||||
|   | ||||
							
								
								
									
										
											BIN
										
									
								
								sounds/conf-leaderhasleft.gsm
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								sounds/conf-leaderhasleft.gsm
									
									
									
									
									
										Executable file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								sounds/conf-placeintoconf.gsm
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								sounds/conf-placeintoconf.gsm
									
									
									
									
									
										Executable file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								sounds/conf-userswilljoin.gsm
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								sounds/conf-userswilljoin.gsm
									
									
									
									
									
										Executable file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								sounds/conf-userwilljoin.gsm
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								sounds/conf-userwilljoin.gsm
									
									
									
									
									
										Executable file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								sounds/conf-waitforleader.gsm
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								sounds/conf-waitforleader.gsm
									
									
									
									
									
										Executable file
									
								
							
										
											Binary file not shown.
										
									
								
							
		Reference in New Issue
	
	Block a user