Add option 'randomperiodicannounce' to queues.conf. Setting this will
authorMark Michelson <mmichelson@digium.com>
Tue, 18 Mar 2008 18:58:42 +0000 (18:58 +0000)
committerMark Michelson <mmichelson@digium.com>
Tue, 18 Mar 2008 18:58:42 +0000 (18:58 +0000)
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: https://origsvn.digium.com/svn/asterisk/trunk@109621 65c4cc65-6c06-0410-ace0-fbb531ad65f3

CHANGES
apps/app_queue.c
configs/queues.conf.sample

diff --git a/CHANGES b/CHANGES
index e5ae21f..f7bf3fc 100644 (file)
--- 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
 --------------
index b034b9e..e531dc4 100644 (file)
@@ -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;
 }
index bef075b..0b171f6 100644 (file)
@@ -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.