From 4fc97b0b87dc764cef4563befc892d6f96b5cee5 Mon Sep 17 00:00:00 2001 From: torben Date: Sun, 29 May 2011 00:46:27 +0000 Subject: [PATCH] [controlAPI] add server_control.c example git-svn-id: svn+ssh://jackaudio.org/trunk/jack@4413 0c269be4-1314-0410-8aa9-9f06e86f4224 --- example-clients/Makefile.am | 5 + example-clients/server_control.c | 237 +++++++++++++++++++++++++++++++ 2 files changed, 242 insertions(+) create mode 100644 example-clients/server_control.c diff --git a/example-clients/Makefile.am b/example-clients/Makefile.am index dd64852..85ccd6c 100644 --- a/example-clients/Makefile.am +++ b/example-clients/Makefile.am @@ -21,6 +21,7 @@ bin_PROGRAMS = jack_simple_client \ jack_midisine \ jack_midiseq \ jack_latent_client \ + jack_server_control \ $(JACKREC) if HAVE_SNDFILE @@ -67,6 +68,10 @@ jack_latent_client_SOURCES = latent_client.c jack_latent_client_LDFLAGS = @OS_LDFLAGS@ jack_latent_client_LDADD = $(top_builddir)/libjack/libjack.la +jack_server_control_SOURCES = server_control.c +jack_server_control_LDFLAGS = @OS_LDFLAGS@ +jack_server_control_LDADD = $(top_builddir)/libjack/libjack.la $(top_builddir)/jackd/libjackserver.la + if HAVE_SNDFILE jack_rec_SOURCES = capture_client.c jack_rec_LDFLAGS = @SNDFILE_LIBS@ @OS_LDFLAGS@ diff --git a/example-clients/server_control.c b/example-clients/server_control.c new file mode 100644 index 0000000..cd6c9f1 --- /dev/null +++ b/example-clients/server_control.c @@ -0,0 +1,237 @@ +/* + Copyright (C) 2008 Grame + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include +#include +#include +#include +#include +#include +#include +#include + +static jackctl_driver_t * jackctl_server_get_driver(jackctl_server_t *server, const char *driver_name) +{ + const JSList * node_ptr = jackctl_server_get_drivers_list(server); + + while (node_ptr) { + if (strcmp(jackctl_driver_get_name((jackctl_driver_t *)node_ptr->data), driver_name) == 0) { + return (jackctl_driver_t *)node_ptr->data; + } + node_ptr = jack_slist_next(node_ptr); + } + + return NULL; +} + +static jackctl_internal_t * jackctl_server_get_internal(jackctl_server_t *server, const char *internal_name) +{ + const JSList * node_ptr = jackctl_server_get_internals_list(server); + + while (node_ptr) { + if (strcmp(jackctl_internal_get_name((jackctl_internal_t *)node_ptr->data), internal_name) == 0) { + return (jackctl_internal_t *)node_ptr->data; + } + node_ptr = jack_slist_next(node_ptr); + } + + return NULL; +} + +static jackctl_parameter_t * +jackctl_get_parameter( + const JSList * parameters_list, + const char * parameter_name) +{ + while (parameters_list) + { + if (strcmp(jackctl_parameter_get_name((jackctl_parameter_t *)parameters_list->data), parameter_name) == 0) + { + return (jackctl_parameter_t *)parameters_list->data; + } + + parameters_list = jack_slist_next(parameters_list); + } + + return NULL; +} + +static void print_value(union jackctl_parameter_value value, jackctl_param_type_t type) +{ + switch (type) { + + case JackParamInt: + printf("parameter value = %d\n", value.i); + break; + + case JackParamUInt: + printf("parameter value = %u\n", value.ui); + break; + + case JackParamChar: + printf("parameter value = %c\n", value.c); + break; + + case JackParamString: + printf("parameter value = %s\n", value.str); + break; + + case JackParamBool: + printf("parameter value = %d\n", value.b); + break; + } +} + +static void print_parameters(const JSList * node_ptr) +{ + while (node_ptr != NULL) { + jackctl_parameter_t * parameter = (jackctl_parameter_t *)node_ptr->data; + printf("\nparameter name = %s\n", jackctl_parameter_get_name(parameter)); + printf("parameter id = %c\n", jackctl_parameter_get_id(parameter)); + printf("parameter short decs = %s\n", jackctl_parameter_get_short_description(parameter)); + printf("parameter long decs = %s\n", jackctl_parameter_get_long_description(parameter)); + print_value(jackctl_parameter_get_default_value(parameter), jackctl_parameter_get_type(parameter)); + node_ptr = jack_slist_next(node_ptr); + } +} + +static void print_driver(jackctl_driver_t * driver) +{ + printf("\n--------------------------\n"); + printf("driver = %s\n", jackctl_driver_get_name(driver)); + printf("-------------------------- \n"); + print_parameters(jackctl_driver_get_parameters(driver)); +} + +static void print_internal(jackctl_internal_t * internal) +{ + printf("\n-------------------------- \n"); + printf("internal = %s\n", jackctl_internal_get_name(internal)); + printf("-------------------------- \n"); + print_parameters(jackctl_internal_get_parameters(internal)); +} + +static void usage() +{ + fprintf (stderr, "\n" + "usage: jack_server_control \n" + " [ --driver OR -d driver_name ]\n" + " [ --client OR -c client_name ]\n" + ); +} + +int main(int argc, char *argv[]) +{ + jackctl_server_t * server; + const JSList * parameters; + const JSList * drivers; + const JSList * internals; + const JSList * node_ptr; + sigset_t signals; + int opt, option_index; + const char* driver_name = "dummy"; + const char* client_name = "audioadapter"; + + const char *options = "d:c:"; + struct option long_options[] = { + {"driver", 1, 0, 'd'}, + {"client", 1, 0, 'c'}, + }; + + while ((opt = getopt_long (argc, argv, options, long_options, &option_index)) != EOF) { + switch (opt) { + case 'd': + driver_name = optarg; + break; + case 'c': + client_name = optarg; + break; + default: + usage(); + exit(0); + } + } + + server = jackctl_server_create(NULL, NULL); + parameters = jackctl_server_get_parameters(server); + + /* + jackctl_parameter_t* param; + union jackctl_parameter_value value; + param = jackctl_get_parameter(parameters, "verbose"); + if (param != NULL) { + value.b = true; + jackctl_parameter_set_value(param, &value); + } + */ + + printf("\n========================== \n"); + printf("List of server parameters \n"); + printf("========================== \n"); + + print_parameters(parameters); + + printf("\n========================== \n"); + printf("List of drivers \n"); + printf("========================== \n"); + + drivers = jackctl_server_get_drivers_list(server); + node_ptr = drivers; + while (node_ptr != NULL) { + print_driver((jackctl_driver_t *)node_ptr->data); + node_ptr = jack_slist_next(node_ptr); + } + + printf("\n========================== \n"); + printf("List of internal clients \n"); + printf("========================== \n"); + + internals = jackctl_server_get_internals_list(server); + node_ptr = internals; + while (node_ptr != NULL) { + print_internal((jackctl_internal_t *)node_ptr->data); + node_ptr = jack_slist_next(node_ptr); + } + + signals = jackctl_setup_signals(0); + + jackctl_server_start(server, jackctl_server_get_driver(server, driver_name)); + jackctl_server_load_internal(server, jackctl_server_get_internal(server, client_name)); + + /* + // Switch master test + + jackctl_driver_t* master; + + usleep(5000000); + printf("jackctl_server_load_master\n"); + master = jackctl_server_get_driver(server, "coreaudio"); + jackctl_server_switch_master(server, master); + + usleep(5000000); + printf("jackctl_server_load_master\n"); + master = jackctl_server_get_driver(server, "dummy"); + jackctl_server_switch_master(server, master); + + */ + + jackctl_wait_signals(signals); + + jackctl_server_destroy(server); + return 0; +}