aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormmichelson <mmichelson@f38db490-d61c-443f-a65b-d21fe96a405b>2008-03-18 18:58:42 +0000
committermmichelson <mmichelson@f38db490-d61c-443f-a65b-d21fe96a405b>2008-03-18 18:58:42 +0000
commitcc9a99e058da404d7c3865587e91e90001a47652 (patch)
treed90be3a3a25e6b16ae4645fc2718ae07ed1261d6
parenteb959bd1abd35b5244cd1a44bac6799810d8f2e8 (diff)
Add option 'randomperiodicannounce' to queues.conf. Setting this will
allow the list of periodic announcments specified to be played in a random order instead of being played sequentially. (closes issue #6681) Reported by: alt_phil Tested by: putnopvut git-svn-id: http://svn.digium.com/svn/asterisk/trunk@109621 f38db490-d61c-443f-a65b-d21fe96a405b
-rw-r--r--CHANGES3
-rw-r--r--apps/app_queue.c20
-rw-r--r--configs/queues.conf.sample4
3 files changed, 22 insertions, 5 deletions
diff --git a/CHANGES b/CHANGES
index e5ae21fb9..f7bf3fc90 100644
--- a/CHANGES
+++ b/CHANGES
@@ -339,6 +339,9 @@ Queue changes
* Added a new parameter for member definition, called state_interface. This may be
used so that a member may be called via one interface but have a different interface's
device state reported.
+ * New configuration option: randomperiodicannounce. If a list of periodic announcements is
+ specified by the periodic-announce option, then one will be chosen randomly when it is time
+ to play a periodic announcment
MeetMe Changes
--------------
diff --git a/apps/app_queue.c b/apps/app_queue.c
index b034b9e3a..e531dc465 100644
--- a/apps/app_queue.c
+++ b/apps/app_queue.c
@@ -466,6 +466,8 @@ struct call_queue {
int announcefrequency; /*!< How often to announce their position */
int minannouncefrequency; /*!< The minimum number of seconds between position announcements (def. 15) */
int periodicannouncefrequency; /*!< How often to play periodic announcement */
+ int numperiodicannounce; /*!< The number of periodic announcements configured */
+ int randomperiodicannounce; /*!< Are periodic announcments randomly chosen */
int roundingseconds; /*!< How many seconds do we round to? */
int holdtime; /*!< Current avg holdtime, based on recursive boxcar filter */
int callscompleted; /*!< Number of queue calls completed */
@@ -935,6 +937,8 @@ static void init_queue(struct call_queue *q)
q->weight = 0;
q->timeoutrestart = 0;
q->periodicannouncefrequency = 0;
+ q->randomperiodicannounce = 0;
+ q->numperiodicannounce = 0;
if (!q->members) {
if (q->strategy == QUEUE_STRATEGY_LINEAR)
/* linear strategy depends on order, so we have to place all members in a single bucket */
@@ -1237,11 +1241,15 @@ static void queue_set_param(struct call_queue *q, const char *param, const char
if (i == MAX_PERIODIC_ANNOUNCEMENTS)
break;
}
+ q->numperiodicannounce = i;
} else {
ast_str_set(&q->sound_periodicannounce[0], 0, "%s", val);
+ q->numperiodicannounce = 1;
}
} else if (!strcasecmp(param, "periodic-announce-frequency")) {
q->periodicannouncefrequency = atoi(val);
+ } else if (!strcasecmp(param, "random-periodic-announce")) {
+ q->randomperiodicannounce = ast_true(val);
} else if (!strcasecmp(param, "retry")) {
q->retry = atoi(val);
if (q->retry <= 0)
@@ -2388,10 +2396,10 @@ static int say_periodic_announcement(struct queue_ent *qe, int ringing)
ast_moh_stop(qe->chan);
ast_verb(3, "Playing periodic announcement\n");
-
- /* Check to make sure we have a sound file. If not, reset to the first sound file */
- if (qe->last_periodic_announce_sound >= MAX_PERIODIC_ANNOUNCEMENTS ||
- !qe->parent->sound_periodicannounce[qe->last_periodic_announce_sound] ||
+
+ if (qe->parent->randomperiodicannounce) {
+ qe->last_periodic_announce_sound = ((unsigned long) ast_random()) % qe->parent->numperiodicannounce;
+ } else if (qe->last_periodic_announce_sound >= qe->parent->numperiodicannounce ||
ast_strlen_zero(qe->parent->sound_periodicannounce[qe->last_periodic_announce_sound]->str)) {
qe->last_periodic_announce_sound = 0;
}
@@ -2414,7 +2422,9 @@ static int say_periodic_announcement(struct queue_ent *qe, int ringing)
qe->last_periodic_announce_time = now;
/* Update the current periodic announcement to the next announcement */
- qe->last_periodic_announce_sound++;
+ if (!qe->parent->randomperiodicannounce) {
+ qe->last_periodic_announce_sound++;
+ }
return res;
}
diff --git a/configs/queues.conf.sample b/configs/queues.conf.sample
index bef075b70..0b171f6ef 100644
--- a/configs/queues.conf.sample
+++ b/configs/queues.conf.sample
@@ -210,6 +210,10 @@ shared_lastcall=no
;
;periodic-announce-frequency=60
;
+; Should the periodic announcements be played in a random order? Default is no.
+;
+;random-periodic-announce=no
+;
; Should we include estimated hold time in position announcements?
; Either yes, no, or only once.
; Hold time will be announced as the estimated time.