Index: apps/app_meetme.c =================================================================== RCS file: /usr/cvsroot/asterisk/apps/app_meetme.c,v retrieving revision 1.83 diff -u -r1.83 app_meetme.c --- apps/app_meetme.c 26 Feb 2005 06:49:07 -0000 1.83 +++ apps/app_meetme.c 28 Feb 2005 02:36:59 -0000 @@ -556,6 +556,8 @@ int musiconhold = 0; int firstpass = 0; int origquiet; + int lastmarked = 0; + int currentmarked = 0; int ret = -1; int x; int menu_active = 0; @@ -654,35 +656,13 @@ if (!(confflags & CONFFLAG_QUIET) && (confflags & CONFFLAG_INTROUSER)) 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) */ @@ -797,7 +777,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); } ast_mutex_unlock(&conflock); if (confflags & CONFFLAG_AGI) { @@ -840,13 +821,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); @@ -861,7 +911,7 @@ } /* Leave if the last marked user left */ - if (conf->markedusers == 0 && confflags & CONFFLAG_MARKEDEXIT) { + if (currentmarked == 0 && (confflags & CONFFLAG_MARKEDEXIT)) { ret = -1; break; } @@ -1096,6 +1146,7 @@ } else ast_log(LOG_WARNING, "Failed to read frame: %s\n", strerror(errno)); } + lastmarked = currentmarked; } } if (using_pseudo)