From 90237dca11d0adf129198cef4a6a0716a52618b5 Mon Sep 17 00:00:00 2001 From: Sean Bright Date: Tue, 23 May 2017 16:42:04 -0400 Subject: res_agi: Allow configuration of audio format of EAGI pipe This change allows the format of the EAGI audio pipe to be changed by setting the dialplan variable 'EAGI_AUDIO_FORMAT' to the name of one of the loaded formats. ASTERISK-26124 #close Change-Id: I7a10fad401ad2a21c68c2e7246fa357d5cee5bbd --- CHANGES | 11 +++++++++++ res/res_agi.c | 22 +++++++++++++++++++--- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/CHANGES b/CHANGES index 7ae196c9f..94405bf4a 100644 --- a/CHANGES +++ b/CHANGES @@ -8,6 +8,17 @@ === ============================================================================== +------------------------------------------------------------------------------ +--- Functionality changes from Asterisk 13.16.0 to Asterisk 13.17.0 ---------- +------------------------------------------------------------------------------ + +res_agi +------------------ + * The EAGI() application will now look for a dialplan variable named + EAGI_AUDIO_FORMAT and use that format with the 'enhanced' audio pipe that + EAGI provides. If not specified, it will continue to use the default signed + linear (slin). + ------------------------------------------------------------------------------ --- Functionality changes from Asterisk 13.15.0 to Asterisk 13.16.0 ---------- ------------------------------------------------------------------------------ diff --git a/res/res_agi.c b/res/res_agi.c index cd0d621eb..aace243ca 100644 --- a/res/res_agi.c +++ b/res/res_agi.c @@ -4554,15 +4554,30 @@ static int eagi_exec(struct ast_channel *chan, const char *data) { int res; struct ast_format *readformat; + struct ast_format *requested_format = NULL; + const char *requested_format_name; if (ast_check_hangup(chan)) { ast_log(LOG_ERROR, "EAGI cannot be run on a dead/hungup channel, please use AGI.\n"); return 0; } + + requested_format_name = pbx_builtin_getvar_helper(chan, "EAGI_AUDIO_FORMAT"); + if (requested_format_name) { + requested_format = ast_format_cache_get(requested_format_name); + if (requested_format) { + ast_verb(3, "<%s> Setting EAGI audio pipe format to %s\n", + ast_channel_name(chan), ast_format_get_name(requested_format)); + } else { + ast_log(LOG_ERROR, "Could not find requested format: %s\n", requested_format_name); + } + } + readformat = ao2_bump(ast_channel_readformat(chan)); - if (ast_set_read_format(chan, ast_format_slin)) { + if (ast_set_read_format(chan, requested_format ?: ast_format_slin)) { ast_log(LOG_WARNING, "Unable to set channel '%s' to linear mode\n", ast_channel_name(chan)); - ao2_ref(readformat, -1); + ao2_cleanup(requested_format); + ao2_cleanup(readformat); return -1; } res = agi_exec_full(chan, data, 1, 0); @@ -4572,7 +4587,8 @@ static int eagi_exec(struct ast_channel *chan, const char *data) ast_format_get_name(readformat)); } } - ao2_ref(readformat, -1); + ao2_cleanup(requested_format); + ao2_cleanup(readformat); return res; } -- cgit v1.2.3