aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--apps/app_queue.c50
-rw-r--r--channels/chan_zap.c5
-rw-r--r--res/res_agi.c6
3 files changed, 32 insertions, 29 deletions
diff --git a/apps/app_queue.c b/apps/app_queue.c
index 4fd6b5364..704573de5 100644
--- a/apps/app_queue.c
+++ b/apps/app_queue.c
@@ -1181,13 +1181,16 @@ static int say_position(struct queue_ent *qe)
ast_verbose(VERBOSE_PREFIX_3 "Told %s in %s their queue position (which was %d)\n",
qe->chan->name, qe->parent->name, qe->pos);
res = play_file(qe->chan, qe->parent->sound_thanks);
+ if (res && !valid_exit(qe, res))
+ res = 0;
playout:
/* Set our last_pos indicators */
qe->last_pos = now;
qe->last_pos_said = qe->pos;
+
/* Don't restart music on hold if we're about to exit the caller from the queue */
- if (res)
+ if (!res)
ast_moh_start(qe->chan, qe->moh);
return res;
@@ -1556,7 +1559,7 @@ static int background_file(struct queue_ent *qe, struct ast_channel *chan, char
if (!res) {
/* Wait for a keypress */
res = ast_waitstream(chan, AST_DIGIT_ANY);
- if (res <= 0 || !valid_exit(qe, res))
+ if (res < 0 || !valid_exit(qe, res))
res = 0;
/* Stop playback */
@@ -1594,8 +1597,9 @@ static int say_periodic_announcement(struct queue_ent *qe)
/* play the announcement */
res = background_file(qe, qe->chan, qe->parent->sound_periodicannounce);
- /* Resume Music on Hold */
- ast_moh_start(qe->chan, qe->moh);
+ /* Resume Music on Hold if the caller is going to stay in the queue */
+ if (!res)
+ ast_moh_start(qe->chan, qe->moh);
/* update last_periodic_announce_time */
qe->last_periodic_announce_time = now;
@@ -1920,18 +1924,17 @@ static int wait_our_turn(struct queue_ent *qe, int ringing, enum queue_result *r
}
/* Make a position announcement, if enabled */
- if (qe->parent->announcefrequency && !ringing)
- res = say_position(qe);
- if (res)
+ if (qe->parent->announcefrequency && !ringing &&
+ (res = say_position(qe)))
break;
/* Make a periodic announcement, if enabled */
- if (qe->parent->periodicannouncefrequency && !ringing)
- res = say_periodic_announcement(qe);
+ if (qe->parent->periodicannouncefrequency && !ringing &&
+ (res = say_periodic_announcement(qe)))
+ break;
/* Wait a second before checking again */
- if (!res) res = ast_waitfordigit(qe->chan, RECHECK * 1000);
- if (res)
+ if ((res = ast_waitfordigit(qe->chan, RECHECK * 1000)))
break;
}
return res;
@@ -2230,7 +2233,7 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce
if (res < 0) {
ast_queue_log(queuename, qe->chan->uniqueid, peer->name, "SYSCOMPAT", "%s", "");
ast_log(LOG_WARNING, "Had to drop call because I couldn't make %s compatible with %s\n", qe->chan->name, peer->name);
- record_abandoned(qe);
+ record_abandoned(qe);
ast_hangup(peer);
return -1;
}
@@ -2307,13 +2310,10 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce
(long)(time(NULL) - callstart));
}
- if(bridge != AST_PBX_NO_HANGUP_PEER)
+ if (bridge != AST_PBX_NO_HANGUP_PEER)
ast_hangup(peer);
update_queue(qe->parent, member);
- if (bridge == 0)
- res = 1; /* JDG: bridge successfull, leave app_queue */
- else
- res = bridge; /* bridge error, stay in the queue */
+ res = bridge ? 0 : -1;
}
out:
hangupcalls(outgoing, NULL);
@@ -2991,9 +2991,8 @@ check_turns:
if (makeannouncement) {
/* Make a position announcement, if enabled */
- if (qe.parent->announcefrequency && !ringing)
- res = say_position(&qe);
- if (res) {
+ if (qe.parent->announcefrequency && !ringing &&
+ (res = say_position(&qe))) {
ast_queue_log(queuename, chan->uniqueid, "NONE", "EXITWITHKEY", "%s|%d", qe.digits, qe.pos);
break;
}
@@ -3002,10 +3001,8 @@ check_turns:
makeannouncement = 1;
/* Make a periodic announcement, if enabled */
- if (qe.parent->periodicannouncefrequency && !ringing)
- res = say_periodic_announcement(&qe);
-
- if (res && valid_exit(&qe, res)) {
+ if (qe.parent->periodicannouncefrequency && !ringing &&
+ (res = say_periodic_announcement(&qe))) {
ast_queue_log(queuename, chan->uniqueid, "NONE", "EXITWITHKEY", "%c|%d", res, qe.pos);
break;
}
@@ -3018,8 +3015,9 @@ check_turns:
record_abandoned(&qe);
ast_queue_log(queuename, chan->uniqueid, "NONE", "ABANDON", "%d|%d|%ld", qe.pos, qe.opos, (long)time(NULL) - qe.start);
}
- } else if (res > 0)
+ } else if (valid_exit(&qe, res)) {
ast_queue_log(queuename, chan->uniqueid, "NONE", "EXITWITHKEY", "%s|%d", qe.digits, qe.pos);
+ }
break;
}
@@ -3082,7 +3080,7 @@ check_turns:
if (!is_our_turn(&qe)) {
if (option_debug)
ast_log(LOG_DEBUG, "Darn priorities, going back in queue (%s)!\n",
- qe.chan->name);
+ qe.chan->name);
goto check_turns;
}
}
diff --git a/channels/chan_zap.c b/channels/chan_zap.c
index 847063a5b..c167db2ba 100644
--- a/channels/chan_zap.c
+++ b/channels/chan_zap.c
@@ -2119,9 +2119,8 @@ static int zt_call(struct ast_channel *ast, char *rdest, int timeout)
prilocaldialplan = PRI_LOCAL_ISDN;
}
}
- pri_sr_set_caller(sr, l ? (l + ldp_strip) : NULL, n, prilocaldialplan,
- l ? (p->use_callingpres ? ast->cid.cid_pres : PRES_ALLOWED_USER_NUMBER_PASSED_SCREEN) :
- PRES_NUMBER_NOT_AVAILABLE);
+ pri_sr_set_caller(sr, l ? (l + ldp_strip) : NULL, n, prilocaldialplan,
+ p->use_callingpres ? ast->cid.cid_pres : (l ? PRES_ALLOWED_USER_NUMBER_PASSED_SCREEN : PRES_NUMBER_NOT_AVAILABLE));
pri_sr_set_redirecting(sr, ast->cid.cid_rdnis, p->pri->localdialplan - 1, PRES_ALLOWED_USER_NUMBER_PASSED_SCREEN, PRI_REDIR_UNCONDITIONAL);
#ifdef SUPPORT_USERUSER
diff --git a/res/res_agi.c b/res/res_agi.c
index 8f9654443..14713fcc2 100644
--- a/res/res_agi.c
+++ b/res/res_agi.c
@@ -941,6 +941,9 @@ static int handle_recordfile(struct ast_channel *chan, AGI *agi, int argc, char
return RESULT_FAILURE;
}
+ /* Request a video update */
+ ast_indicate(chan, AST_CONTROL_VIDUPDATE);
+
chan->stream = fs;
ast_applystream(chan,fs);
/* really should have checks */
@@ -1004,6 +1007,9 @@ static int handle_recordfile(struct ast_channel *chan, AGI *agi, int argc, char
}
}
break;
+ case AST_FRAME_VIDEO:
+ ast_writestream(fs, f);
+ break;
}
ast_frfree(f);
if (gotsilence)