[Asterisk-code-review] app_originate: Add ability to set codecs (asterisk[16])

N A asteriskteam at digium.com
Thu Aug 19 07:09:01 CDT 2021


N A has uploaded this change for review. ( https://gerrit.asterisk.org/c/asterisk/+/16331 )


Change subject: app_originate: Add ability to set codecs
......................................................................

app_originate: Add ability to set codecs

A list of codecs to use for dialplan-originated calls can
now be specified in Originate, similar to the ability
in call files and the manager action.

Additionally, we now default to just using the slin codec
for originated calls, rather than all the slin* codecs up
through slin192, which has been known to cause issues
and inconsistencies from AMI and call file behavior.

ASTERISK-29543

Change-Id: I96a1aeb83d54b635b7a51e1b4680f03791622883
---
M apps/app_originate.c
A doc/CHANGES-staging/app_originate_codecs.txt
2 files changed, 30 insertions(+), 17 deletions(-)



  git pull ssh://gerrit.asterisk.org:29418/asterisk refs/changes/31/16331/1

diff --git a/apps/app_originate.c b/apps/app_originate.c
index 2af46e3..1736c6c 100644
--- a/apps/app_originate.c
+++ b/apps/app_originate.c
@@ -95,6 +95,10 @@
 						<argument name="argN" />
 					</argument>
 				</option>
+				<option name="C">
+					<para>Comma-separated list of codecs to use for this call.
+					Default is <literal>slin</literal>.</para>
+				</option>
 				<option name="c">
 					<para>The caller ID number to use for the called channel. Default is
 					the current channel's Caller ID number.</para>
@@ -114,7 +118,7 @@
 			</parameter>
 		</syntax>
 		<description>
-		<para>This application originates an outbound call and connects it to a specified extension or application.  This application will block until the outgoing call fails or gets answered.  At that point, this application will exit with the status variable set and dialplan processing will continue.</para>
+		<para>This application originates an outbound call and connects it to a specified extension or application.  This application will block until the outgoing call fails or gets answered, unless the async option is used.  At that point, this application will exit with the status variable set and dialplan processing will continue.</para>
 		<para>This application sets the following channel variable before exiting:</para>
 		<variablelist>
 			<variable name="ORIGINATE_STATUS">
@@ -141,7 +145,8 @@
 	OPT_ASYNC =             (1 << 2),
 	OPT_CALLER_NUM =        (1 << 3),
 	OPT_CALLER_NAME =       (1 << 4),
-	OPT_VARIABLES =         (1 << 5),
+	OPT_CODECS =            (1 << 5),
+	OPT_VARIABLES =         (1 << 6),
 };
 
 enum {
@@ -149,6 +154,7 @@
 	OPT_ARG_PREDIAL_CALLER,
 	OPT_ARG_CALLER_NUM,
 	OPT_ARG_CALLER_NAME,
+	OPT_ARG_CODECS,
 	OPT_ARG_VARIABLES,
 	/* note: this entry _MUST_ be the last one in the enum */
 	OPT_ARG_ARRAY_SIZE,
@@ -158,6 +164,7 @@
 	AST_APP_OPTION('a', OPT_ASYNC),
 	AST_APP_OPTION_ARG('b', OPT_PREDIAL_CALLEE, OPT_ARG_PREDIAL_CALLEE),
 	AST_APP_OPTION_ARG('B', OPT_PREDIAL_CALLER, OPT_ARG_PREDIAL_CALLER),
+	AST_APP_OPTION_ARG('C', OPT_CODECS, OPT_ARG_CODECS),
 	AST_APP_OPTION_ARG('c', OPT_CALLER_NUM, OPT_ARG_CALLER_NUM),
 	AST_APP_OPTION_ARG('n', OPT_CALLER_NAME, OPT_ARG_CALLER_NAME),
 	AST_APP_OPTION_ARG('v', OPT_VARIABLES, OPT_ARG_VARIABLES),
@@ -178,7 +185,7 @@
 	char *opt_args[OPT_ARG_ARRAY_SIZE];
 	char *predial_callee = NULL;
 	char *parse, *cnum = NULL, *cname = NULL;
-	
+
 	struct ast_variable *vars = NULL;
 	char *chantech, *chandata;
 	int res = -1;
@@ -186,22 +193,15 @@
 	int outgoing_status = 0;
 	unsigned int timeout = 30;
 	static const char default_exten[] = "s";
-	struct ast_format_cap *cap_slin = ast_format_cap_alloc(AST_FORMAT_CAP_FLAG_DEFAULT);
+	struct ast_format_cap *capabilities;
+	capabilities = ast_format_cap_alloc(AST_FORMAT_CAP_FLAG_DEFAULT);
 
 	ast_autoservice_start(chan);
-	if (!cap_slin) {
+	if (!capabilities) {
 		goto return_cleanup;
 	}
 
-	ast_format_cap_append(cap_slin, ast_format_slin, 0);
-	ast_format_cap_append(cap_slin, ast_format_slin12, 0);
-	ast_format_cap_append(cap_slin, ast_format_slin16, 0);
-	ast_format_cap_append(cap_slin, ast_format_slin24, 0);
-	ast_format_cap_append(cap_slin, ast_format_slin32, 0);
-	ast_format_cap_append(cap_slin, ast_format_slin44, 0);
-	ast_format_cap_append(cap_slin, ast_format_slin48, 0);
-	ast_format_cap_append(cap_slin, ast_format_slin96, 0);
-	ast_format_cap_append(cap_slin, ast_format_slin192, 0);
+	ast_format_cap_append(capabilities, ast_format_slin, 0);
 
 	if (ast_strlen_zero(data)) {
 		ast_log(LOG_ERROR, "Originate() requires arguments\n");
@@ -257,6 +257,13 @@
 		goto return_cleanup;
 	}
 
+	if (ast_test_flag64(&opts, OPT_CODECS)) {
+		if (!ast_strlen_zero(opt_args[OPT_ARG_CODECS])) {
+			ast_format_cap_remove_by_type(capabilities, AST_MEDIA_TYPE_UNKNOWN);
+			ast_format_cap_update_by_allow_disallow(capabilities, opt_args[OPT_ARG_CODECS], 1);
+		}
+	}
+
 	if (ast_test_flag64(&opts, OPT_CALLER_NUM)) {
 		if (!ast_strlen_zero(opt_args[OPT_ARG_CALLER_NUM])) {
 			cnum = opt_args[OPT_ARG_CALLER_NUM];
@@ -318,7 +325,7 @@
 		ast_debug(1, "Originating call to '%s/%s' and connecting them to extension %s,%s,%d\n",
 				chantech, chandata, args.arg1, exten, priority);
 
-		res = ast_pbx_outgoing_exten_predial(chantech, cap_slin, chandata,
+		res = ast_pbx_outgoing_exten_predial(chantech, capabilities, chandata,
 				timeout * 1000, args.arg1, exten, priority, &outgoing_status,
 				ast_test_flag64(&opts, OPT_ASYNC) ? AST_OUTGOING_NO_WAIT : AST_OUTGOING_WAIT,
 				cid_num, cid_name, vars, NULL, NULL, 0, NULL,
@@ -329,7 +336,7 @@
 		ast_debug(1, "Originating call to '%s/%s' and connecting them to %s(%s)\n",
 				chantech, chandata, args.arg1, S_OR(args.arg2, ""));
 
-		res = ast_pbx_outgoing_app_predial(chantech, cap_slin, chandata,
+		res = ast_pbx_outgoing_app_predial(chantech, capabilities, chandata,
 				timeout * 1000, args.arg1, args.arg2, &outgoing_status,
 				ast_test_flag64(&opts, OPT_ASYNC) ? AST_OUTGOING_NO_WAIT : AST_OUTGOING_WAIT,
 				cid_num, cid_name, vars, NULL, NULL, NULL,
@@ -380,7 +387,7 @@
 	if (vars) {
 		ast_variables_destroy(vars);
 	}
-	ao2_cleanup(cap_slin);
+	ao2_cleanup(capabilities);
 	ast_autoservice_stop(chan);
 
 	return continue_in_dialplan ? 0 : -1;
diff --git a/doc/CHANGES-staging/app_originate_codecs.txt b/doc/CHANGES-staging/app_originate_codecs.txt
new file mode 100644
index 0000000..a0f52b1
--- /dev/null
+++ b/doc/CHANGES-staging/app_originate_codecs.txt
@@ -0,0 +1,6 @@
+Subject: app_originate
+
+Codecs can now be specified for dialplan-originated
+calls, as with call files and the manager action.
+By default, only the slin codec is now used, instead
+of all the slin* codecs.

-- 
To view, visit https://gerrit.asterisk.org/c/asterisk/+/16331
To unsubscribe, or for help writing mail filters, visit https://gerrit.asterisk.org/settings

Gerrit-Project: asterisk
Gerrit-Branch: 16
Gerrit-Change-Id: I96a1aeb83d54b635b7a51e1b4680f03791622883
Gerrit-Change-Number: 16331
Gerrit-PatchSet: 1
Gerrit-Owner: N A <mail at interlinked.x10host.com>
Gerrit-MessageType: newchange
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.digium.com/pipermail/asterisk-code-review/attachments/20210819/7d7b4bc9/attachment.html>


More information about the asterisk-code-review mailing list