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:
Mark Spencer
2005-03-17 20:29:51 +00:00
parent 0b23f4a6a7
commit ecec5ad9fc
7 changed files with 93 additions and 42 deletions
+83 -42
View File
@@ -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
View File
@@ -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
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.