mirror of
https://github.com/asterisk/asterisk.git
synced 2026-07-28 00:10:25 -07: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:
+83
-42
@@ -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
@@ -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.
|
||||
|
||||
|
||||
Executable
BIN
Binary file not shown.
Executable
BIN
Binary file not shown.
Executable
BIN
Binary file not shown.
Executable
BIN
Binary file not shown.
Executable
BIN
Binary file not shown.
Reference in New Issue
Block a user