From: ghjm Date: Wed, 27 Dec 2017 23:44:31 +0000 (-0500) Subject: app_followme: Add a prompt to be read when a call is connected X-Git-Tag: 15.3.0-rc1~90^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d4e9985b27fbc19b2d989f42721c871d1e276e32;p=thirdparty%2Fasterisk.git app_followme: Add a prompt to be read when a call is connected This patch adds the ability to configure a prompt which will be read to the "winner" who pressed 1 (or the configured value) and received the call. ASTERISK-24372 #close Change-Id: I6ec1c6c883347f7d1e1f597189544993c8d65272 --- diff --git a/CHANGES b/CHANGES index 07bbce14a0..bf4327f3ca 100644 --- a/CHANGES +++ b/CHANGES @@ -16,6 +16,11 @@ Core ------------------ * Removed the unused and incomplete SDP processing modules. +app_followme +------------------ + * Added a new prompt, connecting-prompt, which will be played + (if configured) to the "winner" callee before connecting the call. + res_pjsip ------------------ * Users who are matching endpoints by SIP header need to reevaluate their diff --git a/apps/app_followme.c b/apps/app_followme.c index 7b47f4dbb8..dbb11ee26e 100644 --- a/apps/app_followme.c +++ b/apps/app_followme.c @@ -176,6 +176,7 @@ struct call_followme { char plsholdprompt[PATH_MAX]; /*!< Sound prompt name and path */ char statusprompt[PATH_MAX]; /*!< Sound prompt name and path */ char sorryprompt[PATH_MAX]; /*!< Sound prompt name and path */ + char connprompt[PATH_MAX]; /*!< Sound prompt name and path */ AST_LIST_HEAD_NOLOCK(numbers, number) numbers; /*!< Head of the list of follow-me numbers */ AST_LIST_HEAD_NOLOCK(blnumbers, number) blnumbers; /*!< Head of the list of black-listed numbers */ @@ -212,6 +213,7 @@ struct fm_args { char plsholdprompt[PATH_MAX]; /*!< Sound prompt name and path */ char statusprompt[PATH_MAX]; /*!< Sound prompt name and path */ char sorryprompt[PATH_MAX]; /*!< Sound prompt name and path */ + char connprompt[PATH_MAX]; /*!< Sound prompt name and path */ struct ast_flags followmeflags; }; @@ -277,6 +279,7 @@ static char optionsprompt[PATH_MAX] = "followme/options"; static char plsholdprompt[PATH_MAX] = "followme/pls-hold-while-try"; static char statusprompt[PATH_MAX] = "followme/status"; static char sorryprompt[PATH_MAX] = "followme/sorry"; +static char connprompt[PATH_MAX] = ""; static AST_RWLIST_HEAD_STATIC(followmes, call_followme); @@ -333,6 +336,7 @@ static void init_profile(struct call_followme *f, int activate) ast_copy_string(f->plsholdprompt, plsholdprompt, sizeof(f->plsholdprompt)); ast_copy_string(f->statusprompt, statusprompt, sizeof(f->statusprompt)); ast_copy_string(f->sorryprompt, sorryprompt, sizeof(f->sorryprompt)); + ast_copy_string(f->connprompt, connprompt, sizeof(f->connprompt)); if (activate) { f->active = 1; } @@ -366,7 +370,9 @@ static void profile_set_param(struct call_followme *f, const char *param, const ast_copy_string(f->statusprompt, val, sizeof(f->statusprompt)); else if (!strcasecmp(param, "followme-sorry-prompt") || !strcasecmp(param, "sorry_prompt")) ast_copy_string(f->sorryprompt, val, sizeof(f->sorryprompt)); - else if (failunknown) { + else if (!strcasecmp(param, "followme-connecting-prompt") || !strcasecmp(param, "connecting_prompt")) { + ast_copy_string(f->connprompt, val, sizeof(f->connprompt)); + } else if (failunknown) { if (linenum >= 0) ast_log(LOG_WARNING, "Unknown keyword in profile '%s': %s at line %d of followme.conf\n", f->name, param, linenum); else @@ -489,6 +495,13 @@ static int reload_followme(int reload) ast_copy_string(sorryprompt, tmpstr, sizeof(sorryprompt)); } + if ((tmpstr = ast_variable_retrieve(cfg, "general", "connecting-prompt")) && !ast_strlen_zero(tmpstr)) { + ast_copy_string(connprompt, tmpstr, sizeof(connprompt)); + } else if ((tmpstr = ast_variable_retrieve(cfg, "general", "connecting_prompt")) && !ast_strlen_zero(tmpstr)) { + ast_copy_string(connprompt, tmpstr, sizeof(connprompt)); + } + + /* Chug through config file */ while ((cat = ast_category_browse(cfg, cat))) { int new = 0; @@ -1408,6 +1421,7 @@ static int app_exec(struct ast_channel *chan, const char *data) ast_copy_string(targs->plsholdprompt, f->plsholdprompt, sizeof(targs->plsholdprompt)); ast_copy_string(targs->statusprompt, f->statusprompt, sizeof(targs->statusprompt)); ast_copy_string(targs->sorryprompt, f->sorryprompt, sizeof(targs->sorryprompt)); + ast_copy_string(targs->connprompt, f->connprompt, sizeof(targs->connprompt)); /* Copy the numbers we're going to use into another list in case the master list should get modified (and locked) while we're trying to do a follow-me */ AST_LIST_HEAD_INIT_NOLOCK(&targs->cnumbers); @@ -1495,6 +1509,14 @@ static int app_exec(struct ast_channel *chan, const char *data) res = 0; } else { caller = chan; + + /* Play "connecting" message to the winner, if configured. */ + if (!ast_strlen_zero(targs->connprompt)) { + ast_autoservice_start(caller); + ast_stream_and_wait(outbound, targs->connprompt, ""); + ast_autoservice_stop(caller); + } + /* Bridge the two channels. */ memset(&config, 0, sizeof(config)); diff --git a/configs/samples/followme.conf.sample b/configs/samples/followme.conf.sample index 487554d811..25421e6513 100644 --- a/configs/samples/followme.conf.sample +++ b/configs/samples/followme.conf.sample @@ -39,7 +39,11 @@ status_prompt=>followme/status sorry_prompt=>followme/sorry ; The global default for 'I'm sorry, but we were unable to locate your party' message. ; -; +connecting_prompt=> +; The global default sound file name for 'Please say hello to the caller' message. +; Setting to an empty string skips playing the prompt. The default is no prompt +; file name. + [default] musicclass=>default ; The moh class that should be used for the caller while they are waiting to be connected. @@ -95,3 +99,9 @@ status_prompt=>followme/status sorry_prompt=>followme/sorry ; The 'I'm sorry, but we were unable to locate your party' message prompt. Default ; is the global default. +; +connecting_prompt=> +; The sound file name for 'Please say hello to the caller' message. Default is the +; global default. +; +