[asterisk-users] [PATCH] Make Queue announcements more consistent (1.4.26.2)
James Lamanna
jlamanna at gmail.com
Mon Apr 26 09:21:16 CDT 2010
Hi,
After playing around with queues a bunch on 1.4.26.2, I noticed a few things,
which the patch below addresses. It addresses:
- Callers in position 0 will hear periodic/position announcements at a
very different rate than all other callers.
-- Announcements while in position 0 could be delayed up to
"timeout+retry" seconds.
-- This patch reduces that possible delay to only "timeout" seconds
- The say_position and periodic_announcement times are in elapsed time
that _includes_ the
time of the announcement.
-- This patch changes those times to be the time _between_ playing
of those announcements
Thanks.
-- James
--- asterisk-1.4.26.2/apps/app_queue.c 2009-08-10 13:14:34.000000000 -0700
+++ asterisk-1.4.26.2.new/apps/app_queue.c 2010-04-25 22:25:08.000000000 -0700
@@ -345,6 +345,7 @@
time_t last_periodic_announce_time; /*!< The last time we played a
periodic announcement */
int last_periodic_announce_sound; /*!< The last periodic
announcement we made */
time_t last_pos; /*!< Last time we told the user
their position */
+ time_t last_ring_time; /*!< Last time we tried to ring
the agents */
int opos; /*!< Where we started in the queue */
int handled; /*!< Whether our call was handled */
int pending; /*!< Non-zero if we are
attempting to call a member */
@@ -1653,6 +1654,7 @@
res = 0;
/* Set our last_pos indicators */
+ time(&now);
qe->last_pos = now;
qe->last_pos_said = qe->pos;
@@ -2131,6 +2133,8 @@
if (!res)
ast_moh_start(qe->chan, qe->moh, NULL);
+ /* Refresh now so that frequency is time _between_ recordings */
+ time(&now);
/* update last_periodic_announce_time */
qe->last_periodic_announce_time = now;
@@ -3292,7 +3296,8 @@
static int wait_a_bit(struct queue_ent *qe)
{
/* Don't need to hold the lock while we setup the outgoing calls */
- int retrywait = qe->parent->retry * 1000;
+ //int retrywait = qe->parent->retry * 1000;
+ int retrywait = RECHECK * 1000;
int res = ast_waitfordigit(qe->chan, retrywait);
if (res > 0 && !valid_exit(qe, res))
@@ -4003,6 +4008,7 @@
qe.max_penalty = max_penalty;
qe.last_pos_said = 0;
qe.last_pos = 0;
+ qe.last_ring_time = 0;
qe.last_periodic_announce_time = time(NULL);
qe.last_periodic_announce_sound = 0;
qe.valid_digits = 0;
@@ -4074,9 +4080,12 @@
break;
}
/* Try calling all queue members for 'timeout' seconds */
- res = try_calling(&qe, args.options, args.announceoverride,
args.url, &tries, &noption, args.agi);
- if (res)
- goto stop;
+ if ((time(NULL) - qe.last_ring_time) > qe.parent->retry) {
+ res = try_calling(&qe, args.options, args.announceoverride,
args.url, &tries, &noption, args.agi);
+ qe.last_ring_time = time(NULL);
+ if (res)
+ goto stop;
+ }
stat = get_member_status(qe.parent, qe.max_penalty);
@@ -4125,7 +4134,7 @@
/* If using dynamic realtime members, we should regenerate the
member list for this queue */
update_realtime_members(qe.parent);
- /* OK, we didn't get anybody; wait for 'retry' seconds; may get a
digit to exit with */
+ /* OK, we didn't get anybody; poll our retry */
res = wait_a_bit(&qe);
if (res)
goto stop;
More information about the asterisk-users
mailing list