From b283a02a7df767a62d7b9db57be2c6eba99f70d1 Mon Sep 17 00:00:00 2001 From: Mark Spencer Date: Mon, 28 Jun 2004 20:17:20 +0000 Subject: [PATCH] Merge seconds announcement for queue hold time (bug #1941) git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@3332 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- apps/app_queue.c | 41 ++++++++++++++++++++++++++++++------- configs/queues.conf.sample | 7 +++++++ sounds.txt | 2 ++ sounds/queue-seconds.gsm | Bin 0 -> 1386 bytes 4 files changed, 43 insertions(+), 7 deletions(-) create mode 100755 sounds/queue-seconds.gsm diff --git a/apps/app_queue.c b/apps/app_queue.c index 102baa7e2b..29efabb5e5 100755 --- a/apps/app_queue.c +++ b/apps/app_queue.c @@ -187,6 +187,7 @@ struct ast_call_queue { char context[80]; /* Context for this queue */ int strategy; /* Queueing strategy */ int announcefrequency; /* How often to announce their position */ + int roundingseconds; /* How many seconds do we round to? */ int announceholdtime; /* When to announce holdtime: 0 = never, -1 = every announcement, 1 = only once */ int holdtime; /* Current avg holdtime for this queue, based on recursive boxcar filter */ int callscompleted; /* Number of queue calls completed */ @@ -200,6 +201,7 @@ struct ast_call_queue { char sound_calls[80]; /* Sound file: "calls waiting to speak to a representative." (def. queue-callswaiting)*/ char sound_holdtime[80]; /* Sound file: "The current estimated total holdtime is" (def. queue-holdtime) */ char sound_minutes[80]; /* Sound file: "minutes." (def. queue-minutes) */ + char sound_seconds[80]; /* Sound file: "seconds." (def. queue-seconds) */ char sound_thanks[80]; /* Sound file: "Thank you for your patience." (def. queue-thankyou) */ int count; /* How many entries are in the queue */ @@ -386,7 +388,7 @@ static int play_file(struct ast_channel *chan, char *filename) static int say_position(struct queue_ent *qe) { - int res = 0, avgholdmins; + int res = 0, avgholdmins, avgholdsecs; time_t now; /* Check to see if this is ludicrous -- if we just announced position, don't do it again*/ @@ -408,18 +410,33 @@ static int say_position(struct queue_ent *qe) res += ast_say_number(qe->chan, qe->pos, AST_DIGIT_ANY, qe->chan->language, (char *) NULL); /* Needs gender */ res += play_file(qe->chan, qe->parent->sound_calls); } - /* Round hold time to nearest minute */ - avgholdmins = ( (qe->parent->holdtime + 30) - (now - qe->start) ) / 60; + avgholdmins = abs(( (qe->parent->holdtime + 30) - (now - qe->start) ) / 60); + + /* If they have specified a rounding then round the seconds as well */ + if(qe->parent->roundingseconds) { + avgholdsecs = (abs(( (qe->parent->holdtime + 30) - (now - qe->start) )) - 60 * avgholdmins) / qe->parent->roundingseconds; + avgholdsecs*= qe->parent->roundingseconds; + } else { + avgholdsecs=0; + } + if (option_verbose > 2) - ast_verbose(VERBOSE_PREFIX_3 "Hold time for %s is %d minutes\n", qe->parent->name, avgholdmins); + ast_verbose(VERBOSE_PREFIX_3 "Hold time for %s is %d minutes %d seconds\n", qe->parent->name, avgholdmins, avgholdsecs); /* If the hold time is >1 min, if it's enabled, and if it's not supposed to be only once and we have already said it, say it */ - if (avgholdmins > 1 && (qe->parent->announceholdtime) && (!(qe->parent->announceholdtime==1 && qe->last_pos)) ) { + if ((avgholdmins+avgholdsecs) > 0 && (qe->parent->announceholdtime) && (!(qe->parent->announceholdtime==1 && qe->last_pos)) ) { res += play_file(qe->chan, qe->parent->sound_holdtime); - res += ast_say_number(qe->chan, avgholdmins, AST_DIGIT_ANY, qe->chan->language, (char*) NULL); - res += play_file(qe->chan, qe->parent->sound_minutes); + if(avgholdmins>0) { + res += ast_say_number(qe->chan, avgholdmins, AST_DIGIT_ANY, qe->chan->language, (char*) NULL); + res += play_file(qe->chan, qe->parent->sound_minutes); + } + if(avgholdsecs>0) { + res += ast_say_number(qe->chan, avgholdsecs, AST_DIGIT_ANY, qe->chan->language, (char*) NULL); + res += play_file(qe->chan, qe->parent->sound_seconds); + } + } posout: @@ -1708,6 +1725,7 @@ static void reload_queues(void) q->maxlen = 0; q->announcefrequency = 0; q->announceholdtime = 0; + q->roundingseconds = 0; /* Default - don't announce seconds */ q->holdtime = 0; q->callscompleted = 0; q->callsabandoned = 0; @@ -1724,6 +1742,7 @@ static void reload_queues(void) strcpy(q->sound_calls, "queue-callswaiting"); strcpy(q->sound_holdtime, "queue-holdtime"); strcpy(q->sound_minutes, "queue-minutes"); + strcpy(q->sound_seconds, "queue-seconds"); strcpy(q->sound_thanks, "queue-thankyou"); prev = q->members; if (prev) { @@ -1783,10 +1802,18 @@ static void reload_queues(void) strncpy(q->sound_holdtime, var->value, sizeof(q->sound_holdtime) - 1); } else if (!strcasecmp(var->name, "queue-minutes")) { strncpy(q->sound_minutes, var->value, sizeof(q->sound_minutes) - 1); + } else if (!strcasecmp(var->name, "queue-seconds")) { + strncpy(q->sound_seconds, var->value, sizeof(q->sound_seconds) - 1); } else if (!strcasecmp(var->name, "queue-thankyou")) { strncpy(q->sound_thanks, var->value, sizeof(q->sound_thanks) - 1); } else if (!strcasecmp(var->name, "announce-frequency")) { q->announcefrequency = atoi(var->value); + } else if (!strcasecmp(var->name, "announce-round-seconds")) { + q->roundingseconds = atoi(var->value); + if(q->roundingseconds>60 || q->roundingseconds<0) { + ast_log(LOG_WARNING, "'%s' isn't a valid value for queue-rounding-seconds using 0 instead at line %d of queue.conf\n", var->value, var->lineno); + q->roundingseconds=0; + } } else if (!strcasecmp(var->name, "announce-holdtime")) { q->announceholdtime = (!strcasecmp(var->value,"once")) ? 1 : ast_true(var->value); } else if (!strcasecmp(var->name, "retry")) { diff --git a/configs/queues.conf.sample b/configs/queues.conf.sample index 4d483393c4..66ed932420 100755 --- a/configs/queues.conf.sample +++ b/configs/queues.conf.sample @@ -73,6 +73,12 @@ ; Either yes, no, or only once; hold time will not be announced if <1 minute ; ;announce-holdtime = yes|no|once + +; +; What's the rounding time for the seconds? +; If this is non zero then we announce the seconds as well as the minutes rounded to this value +; +; announce-round-seconds = 10 ; ; Use these sound files in making position/holdtime announcements. The ; defaults are as listed below -- change only if you need to. @@ -82,6 +88,7 @@ ;queue-callswaiting = queue-callswaiting ; ("calls waiting.") ;queue-holdtime = queue-holdtime ; ("The current est. holdtime is") ;queue-minutes = queue-minutes ; ("minutes.") +;queue-seconds = queue-seconds ; ("seconds.") ;queue-thankyou = queue-thankyou ; ("Thank you for your patience.") ; ; Calls may be recorded using Asterisk's monitor resource diff --git a/sounds.txt b/sounds.txt index ce7e5a4a87..4a6276d47d 100755 --- a/sounds.txt +++ b/sounds.txt @@ -82,6 +82,8 @@ %queue-minutes.gsm%Minutes +%queue-seconds.gsm%Seconds + %queue-thankyou.gsm%Thank you for your patience %queue-thereare.gsm%You are currently caller number diff --git a/sounds/queue-seconds.gsm b/sounds/queue-seconds.gsm new file mode 100755 index 0000000000000000000000000000000000000000..a2d55d5bc66bdf93a9ab7e2c9df7f23d2f0d44be GIT binary patch literal 1386 zc-jGK1(o{OVMz#>Pyi^~akm>#Kt~#lxZGMmHsq2y8^nM~BXTI)*{YmML1JJh8*!*+ zuOKATc06QYz&~VOE23*4%Y9Y2+}P}#Qj&_G(%Ov_+^WE+(z-_8=^&>QWul|mAjHI_ zwp`gRoK``{0UF$KwIY_l#N2AQ9_pZ&VnrMRqd_#Qm^QB2vBcKpte}e1L}doL!bIC? zpCnNtgzL>Hq+-H5+^T62*eZjXikCu8W9~|7f}%$i6~x=jq)6J0_M%i{+N74WLDZ#8 z?gfb|Npy^dHfZJ6MUuH=sR;{YZPdHtO1R@Ym7CP*erSYq=&|axHZ7~D-&|-zymP5m z*`eC(bjqBquAnm1Ev+F7d1&^mC3WTTNmv=;$!obMGfsO^MY&7LrIHM8)#zlYguO{# zgjK(le9Ho(eyoarCQ7wkuq(Yt_WDd`F4bmi-9~*#=vm14ti1*f;+3r0e+W4Ab|GrL zCwTiJQ9RXTL#l;;B-ByHb0WaT3&*N7je#XOD^}3rgrdisY@^@SWGb$cz(UyCNzUcK zA~PGDdX>CDhV$5{(Sl&e;clfQ)oX2)6U0E)WNEh|yui03a&aqTAr_w2S1Vw_X(U$J zrP(vgPF2C9*y|}9{b8rp*l@HIScu7NZ$^k$u1RHY8AIAEw89)#t{EoKP~MEK9__6; zB%CUJ8$wm4hN${ca%fA{nl$r_uBj%RvNR0nXGz$*V&1BhAWd9JQ#g)SFgn zM3Se(5VglOmd7N9Qc0xVskViRM{MaP%3cdgW7FAXYQ$3n)`x1xqE$n%pT*~MRl`S7 z?N*jmWSZ0+Jw?>oRI3BAMnd8jh3Q)6c$-LGrm)4iYjK3Uw?xS6k~pZ;-Yas$Uqbh5 zmM0Rx;>9-Yy4J@duyk3@m1d&DQEj#4(_3q!0L0=_Zc(m`8ij!PosK^YPz?X2bi z+gxNKLD6EJsnd4BNu#nh-00w^8__i6w@JrtHX3!b1iW#&fm(c+zQS(Lz6Dsd>HhQMa?naZt_z&jId zIUSh5IU;Skp}5?VIvmnrj3$y+AQr{8 z=&F)nxa^Uo6W%~t?RuwVh@eWMOt|FN+!K=I)ZjgAZaXcJAjeTrs}*A4yOXg+9d^LV zopwfH*PTRLBe;OLwMvPdVnD{5HYAeDz`EQnw~MgAwI+_aW!7L*mlTqq^J;bKs>>kP zEzPx6q~O%rmQ0p=K|3u?saMz`W73kFVJOn0H419MDCRAirQG1A%C3fc?9cP!@{eOCX4>mEz&J*osKw*d}^UTa4jj5yjUf-vRoQc{b~G zK-Sx7_bsYGxns>pC&J0#a2av0i@ z07)cq#~jumNgGYZ9i07)Z~NhDAJNhFd