245 lines
7.0 KiB
C++
245 lines
7.0 KiB
C++
/*
|
|
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 <stdio.h>
|
|
#include <errno.h>
|
|
#include <unistd.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <getopt.h>
|
|
#include <jack/jack.h>
|
|
#include <jack/control.h>
|
|
|
|
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;
|
|
}
|
|
|
|
#if 0
|
|
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;
|
|
}
|
|
#endif
|
|
|
|
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;
|
|
jackctl_sigmask_t * sigmask;
|
|
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'},
|
|
{0, 0, 0, 0}
|
|
};
|
|
|
|
while ((opt = getopt_long (argc, argv, options, long_options, &option_index)) != -1) {
|
|
switch (opt) {
|
|
case 'd':
|
|
driver_name = optarg;
|
|
break;
|
|
case 'c':
|
|
client_name = optarg;
|
|
break;
|
|
default:
|
|
usage();
|
|
exit(0);
|
|
}
|
|
}
|
|
|
|
server = jackctl_server_create2(NULL, 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);
|
|
}
|
|
|
|
// No error checking in this simple example...
|
|
|
|
jackctl_server_open(server, jackctl_server_get_driver(server, driver_name));
|
|
jackctl_server_start(server);
|
|
|
|
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);
|
|
|
|
*/
|
|
|
|
sigmask = jackctl_setup_signals(0);
|
|
jackctl_wait_signals(sigmask);
|
|
jackctl_server_stop(server);
|
|
jackctl_server_close(server);
|
|
jackctl_server_destroy(server);
|
|
return 0;
|
|
}
|