From 01f3a08f8a45b7e5bdcf185207a16335f02fd19a Mon Sep 17 00:00:00 2001 From: Russell Bryant Date: Tue, 22 Apr 2008 16:47:00 +0000 Subject: [PATCH] Add a c() option for the Jack() application and JACK_HOOK() funciton for supplying a custom client name. Using the channel name is still the default. This was done at the request of Jared Smith. git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@114533 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- CHANGES | 2 ++ apps/app_jack.c | 34 +++++++++++++++++++++++++++------- 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/CHANGES b/CHANGES index bd71975622..2922c51bef 100644 --- a/CHANGES +++ b/CHANGES @@ -6,6 +6,7 @@ Dialplan Functions ------------------ * Added a new dialplan function, AST_CONFIG(), which allows you to access variables from an Asterisk configuration file. + * The JACK_HOOK function now has a c() option to supply a custom client name. Zaptel channel driver (chan_zap) Changes ---------------------------------------- @@ -31,6 +32,7 @@ Application Changes continue in the dialplan, at the specified label, if the caller hangs up. * ChanSpy and ExtenSpy have a new option, 's' which suppresses speaking the technology name (e.g. SIP, IAX, etc) of the channel being spied on. + * The Jack application now has a c() option to supply a custom client name. SIP Changes ----------- diff --git a/apps/app_jack.c b/apps/app_jack.c index 8faecd1f29..316521484e 100644 --- a/apps/app_jack.c +++ b/apps/app_jack.c @@ -65,7 +65,9 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") " o() - Connect the input port that gets created to the specified\n" \ " jack output port.\n" \ " n - Do not automatically start the JACK server if it is not already\n" \ -" running.\n" +" running.\n" \ +" c() - By default, Asterisk will use the channel name for the jack client\n" \ +" name. Use this option to specify a custom client name.\n" static char *jack_app = "JACK"; static char *jack_synopsis = @@ -82,6 +84,7 @@ COMMON_OPTIONS struct jack_data { AST_DECLARE_STRING_FIELDS( AST_STRING_FIELD(server_name); + AST_STRING_FIELD(client_name); AST_STRING_FIELD(connect_input_port); AST_STRING_FIELD(connect_output_port); ); @@ -350,13 +353,17 @@ static struct jack_data *destroy_jack_data(struct jack_data *jack_data) static int init_jack_data(struct ast_channel *chan, struct jack_data *jack_data) { - const char *chan_name; + const char *client_name; jack_status_t status = 0; jack_options_t jack_options = JackNullOption; - ast_channel_lock(chan); - chan_name = ast_strdupa(chan->name); - ast_channel_unlock(chan); + if (!ast_strlen_zero(jack_data->client_name)) { + client_name = jack_data->client_name; + } else { + ast_channel_lock(chan); + client_name = ast_strdupa(chan->name); + ast_channel_unlock(chan); + } if (!(jack_data->output_rb = jack_ringbuffer_create(RINGBUFFER_SIZE))) return -1; @@ -369,10 +376,10 @@ static int init_jack_data(struct ast_channel *chan, struct jack_data *jack_data) if (!ast_strlen_zero(jack_data->server_name)) { jack_options |= JackServerName; - jack_data->client = jack_client_open(chan_name, jack_options, &status, + jack_data->client = jack_client_open(client_name, jack_options, &status, jack_data->server_name); } else { - jack_data->client = jack_client_open(chan_name, jack_options, &status); + jack_data->client = jack_client_open(client_name, jack_options, &status); } if (status) @@ -610,12 +617,15 @@ enum { OPT_INPUT_PORT = (1 << 1), OPT_OUTPUT_PORT = (1 << 2), OPT_NOSTART_SERVER = (1 << 3), + OPT_CLIENT_NAME = (1 << 4), }; enum { OPT_ARG_SERVER_NAME, OPT_ARG_INPUT_PORT, OPT_ARG_OUTPUT_PORT, + OPT_ARG_CLIENT_NAME, + /* Must be the last element */ OPT_ARG_ARRAY_SIZE, }; @@ -625,6 +635,7 @@ AST_APP_OPTIONS(jack_exec_options, BEGIN_OPTIONS AST_APP_OPTION_ARG('i', OPT_INPUT_PORT, OPT_ARG_INPUT_PORT), AST_APP_OPTION_ARG('o', OPT_OUTPUT_PORT, OPT_ARG_OUTPUT_PORT), AST_APP_OPTION('n', OPT_NOSTART_SERVER), + AST_APP_OPTION_ARG('c', OPT_CLIENT_NAME, OPT_ARG_CLIENT_NAME), END_OPTIONS ); static struct jack_data *jack_data_alloc(void) @@ -664,6 +675,15 @@ static int handle_options(struct jack_data *jack_data, const char *__options_str } } + if (ast_test_flag(&options, OPT_CLIENT_NAME)) { + if (!ast_strlen_zero(option_args[OPT_ARG_CLIENT_NAME])) + ast_string_field_set(jack_data, client_name, option_args[OPT_ARG_CLIENT_NAME]); + else { + ast_log(LOG_ERROR, "A client name must be provided with the c() option\n"); + return -1; + } + } + if (ast_test_flag(&options, OPT_INPUT_PORT)) { if (!ast_strlen_zero(option_args[OPT_ARG_INPUT_PORT])) ast_string_field_set(jack_data, connect_input_port, option_args[OPT_ARG_INPUT_PORT]);