mirror of
https://github.com/asterisk/asterisk.git
synced 2025-10-13 16:21:01 +00:00
allow for multiple periodic announcements
from bug 5273 with minor changes. git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@8152 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -114,6 +114,7 @@ static struct strategy {
|
|||||||
#define DEFAULT_RETRY 5
|
#define DEFAULT_RETRY 5
|
||||||
#define DEFAULT_TIMEOUT 15
|
#define DEFAULT_TIMEOUT 15
|
||||||
#define RECHECK 1 /* Recheck every second to see we we're at the top yet */
|
#define RECHECK 1 /* Recheck every second to see we we're at the top yet */
|
||||||
|
#define MAX_PERIODIC_ANNOUNCEMENTS 10 /* The maximum periodic announcements we can have */
|
||||||
|
|
||||||
#define RES_OKAY 0 /* Action completed */
|
#define RES_OKAY 0 /* Action completed */
|
||||||
#define RES_EXISTS (-1) /* Entry already exists */
|
#define RES_EXISTS (-1) /* Entry already exists */
|
||||||
@@ -283,6 +284,7 @@ struct queue_ent {
|
|||||||
int prio; /*!< Our priority */
|
int prio; /*!< Our priority */
|
||||||
int last_pos_said; /*!< Last position we told the user */
|
int last_pos_said; /*!< Last position we told the user */
|
||||||
time_t last_periodic_announce_time; /*!< The last time we played a periodic announcement */
|
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_pos; /*!< Last time we told the user their position */
|
||||||
int opos; /*!< Where we started in the queue */
|
int opos; /*!< Where we started in the queue */
|
||||||
int handled; /*!< Whether our call was handled */
|
int handled; /*!< Whether our call was handled */
|
||||||
@@ -347,7 +349,7 @@ struct ast_call_queue {
|
|||||||
char sound_seconds[80]; /*!< Sound file: "seconds." (def. queue-seconds) */
|
char sound_seconds[80]; /*!< Sound file: "seconds." (def. queue-seconds) */
|
||||||
char sound_thanks[80]; /*!< Sound file: "Thank you for your patience." (def. queue-thankyou) */
|
char sound_thanks[80]; /*!< Sound file: "Thank you for your patience." (def. queue-thankyou) */
|
||||||
char sound_reporthold[80]; /*!< Sound file: "Hold time" (def. queue-reporthold) */
|
char sound_reporthold[80]; /*!< Sound file: "Hold time" (def. queue-reporthold) */
|
||||||
char sound_periodicannounce[80];/*!< Sound file: Custom announce, no default */
|
char sound_periodicannounce[MAX_PERIODIC_ANNOUNCEMENTS][80];/* Sound files: Custom announce, no default */
|
||||||
|
|
||||||
int count; /*!< How many entries */
|
int count; /*!< How many entries */
|
||||||
int maxlen; /*!< Max number of entries */
|
int maxlen; /*!< Max number of entries */
|
||||||
@@ -563,6 +565,7 @@ static struct ast_call_queue *alloc_queue(const char *queuename)
|
|||||||
|
|
||||||
static void init_queue(struct ast_call_queue *q)
|
static void init_queue(struct ast_call_queue *q)
|
||||||
{
|
{
|
||||||
|
int i;
|
||||||
q->dead = 0;
|
q->dead = 0;
|
||||||
q->retry = DEFAULT_RETRY;
|
q->retry = DEFAULT_RETRY;
|
||||||
q->timeout = -1;
|
q->timeout = -1;
|
||||||
@@ -585,7 +588,10 @@ static void init_queue(struct ast_call_queue *q)
|
|||||||
ast_copy_string(q->sound_thanks, "queue-thankyou", sizeof(q->sound_thanks));
|
ast_copy_string(q->sound_thanks, "queue-thankyou", sizeof(q->sound_thanks));
|
||||||
ast_copy_string(q->sound_lessthan, "queue-less-than", sizeof(q->sound_lessthan));
|
ast_copy_string(q->sound_lessthan, "queue-less-than", sizeof(q->sound_lessthan));
|
||||||
ast_copy_string(q->sound_reporthold, "queue-reporthold", sizeof(q->sound_reporthold));
|
ast_copy_string(q->sound_reporthold, "queue-reporthold", sizeof(q->sound_reporthold));
|
||||||
ast_copy_string(q->sound_periodicannounce, "queue-periodic-announce", sizeof(q->sound_periodicannounce));
|
ast_copy_string(q->sound_periodicannounce[0], "queue-periodic-announce", sizeof(q->sound_periodicannounce[0]));
|
||||||
|
for (i=1;i<MAX_PERIODIC_ANNOUNCEMENTS;i++) {
|
||||||
|
ast_copy_string(q->sound_periodicannounce[i], "", sizeof(q->sound_periodicannounce[i]));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void clear_queue(struct ast_call_queue *q)
|
static void clear_queue(struct ast_call_queue *q)
|
||||||
@@ -606,6 +612,9 @@ static void clear_queue(struct ast_call_queue *q)
|
|||||||
extra fields in the tables. */
|
extra fields in the tables. */
|
||||||
static void queue_set_param(struct ast_call_queue *q, const char *param, const char *val, int linenum, int failunknown)
|
static void queue_set_param(struct ast_call_queue *q, const char *param, const char *val, int linenum, int failunknown)
|
||||||
{
|
{
|
||||||
|
int i = 0;
|
||||||
|
char *c, *lastc;
|
||||||
|
char buff[80];
|
||||||
if (!strcasecmp(param, "music") || !strcasecmp(param, "musiconhold")) {
|
if (!strcasecmp(param, "music") || !strcasecmp(param, "musiconhold")) {
|
||||||
ast_copy_string(q->moh, val, sizeof(q->moh));
|
ast_copy_string(q->moh, val, sizeof(q->moh));
|
||||||
} else if (!strcasecmp(param, "announce")) {
|
} else if (!strcasecmp(param, "announce")) {
|
||||||
@@ -660,8 +669,24 @@ static void queue_set_param(struct ast_call_queue *q, const char *param, const c
|
|||||||
q->announceholdtime = ANNOUNCEHOLDTIME_ALWAYS;
|
q->announceholdtime = ANNOUNCEHOLDTIME_ALWAYS;
|
||||||
else
|
else
|
||||||
q->announceholdtime = 0;
|
q->announceholdtime = 0;
|
||||||
} else if (!strcasecmp(param, "periodic-announce")) {
|
} else if (!strcasecmp(param, "periodic-announce")) {
|
||||||
ast_copy_string(q->sound_periodicannounce, val, sizeof(q->sound_periodicannounce));
|
if (strchr(val,'|')) {
|
||||||
|
lastc = (char *)val;
|
||||||
|
while ((c = strchr(lastc,'|'))) {
|
||||||
|
if (i > MAX_PERIODIC_ANNOUNCEMENTS)
|
||||||
|
break;
|
||||||
|
strncpy(buff, lastc, abs(lastc - c));
|
||||||
|
buff[abs(lastc - c)] = '\0';
|
||||||
|
ast_copy_string(q->sound_periodicannounce[i], buff, sizeof(q->sound_periodicannounce[i]));
|
||||||
|
lastc = (c + 1);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
if (strlen(lastc)) {
|
||||||
|
ast_copy_string(q->sound_periodicannounce[i], lastc, sizeof(q->sound_periodicannounce[i]));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ast_copy_string(q->sound_periodicannounce[i], val, sizeof(q->sound_periodicannounce[i]));
|
||||||
|
}
|
||||||
} else if (!strcasecmp(param, "periodic-announce-frequency")) {
|
} else if (!strcasecmp(param, "periodic-announce-frequency")) {
|
||||||
q->periodicannouncefrequency = atoi(val);
|
q->periodicannouncefrequency = atoi(val);
|
||||||
} else if (!strcasecmp(param, "retry")) {
|
} else if (!strcasecmp(param, "retry")) {
|
||||||
@@ -1570,8 +1595,13 @@ static int say_periodic_announcement(struct queue_ent *qe)
|
|||||||
if (option_verbose > 2)
|
if (option_verbose > 2)
|
||||||
ast_verbose(VERBOSE_PREFIX_3 "Playing periodic announcement\n");
|
ast_verbose(VERBOSE_PREFIX_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 || !strlen(qe->parent->sound_periodicannounce[qe->last_periodic_announce_sound])) {
|
||||||
|
qe->last_periodic_announce_sound = 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* play the announcement */
|
/* play the announcement */
|
||||||
res = background_file(qe, qe->chan, qe->parent->sound_periodicannounce);
|
res = background_file(qe, qe->chan, qe->parent->sound_periodicannounce[qe->last_periodic_announce_sound]);
|
||||||
|
|
||||||
/* Resume Music on Hold */
|
/* Resume Music on Hold */
|
||||||
ast_moh_start(qe->chan, qe->moh);
|
ast_moh_start(qe->chan, qe->moh);
|
||||||
@@ -1579,6 +1609,9 @@ static int say_periodic_announcement(struct queue_ent *qe)
|
|||||||
/* update last_periodic_announce_time */
|
/* update last_periodic_announce_time */
|
||||||
qe->last_periodic_announce_time = now;
|
qe->last_periodic_announce_time = now;
|
||||||
|
|
||||||
|
/* Update the current periodic announcement to the next announcement */
|
||||||
|
qe->last_periodic_announce_sound++;
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2947,6 +2980,7 @@ static int queue_exec(struct ast_channel *chan, void *data)
|
|||||||
qe.last_pos_said = 0;
|
qe.last_pos_said = 0;
|
||||||
qe.last_pos = 0;
|
qe.last_pos = 0;
|
||||||
qe.last_periodic_announce_time = time(NULL);
|
qe.last_periodic_announce_time = time(NULL);
|
||||||
|
qe.last_periodic_announce_sound = 0;
|
||||||
if (!join_queue(queuename, &qe, &reason)) {
|
if (!join_queue(queuename, &qe, &reason)) {
|
||||||
ast_queue_log(queuename, chan->uniqueid, "NONE", "ENTERQUEUE", "%s|%s", url ? url : "",
|
ast_queue_log(queuename, chan->uniqueid, "NONE", "ENTERQUEUE", "%s|%s", url ? url : "",
|
||||||
chan->cid.cid_num ? chan->cid.cid_num : "");
|
chan->cid.cid_num ? chan->cid.cid_num : "");
|
||||||
|
Reference in New Issue
Block a user