jack2 codebase
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

244 lines
7.0KB

  1. /*
  2. Copyright (C) 2008 Grame
  3. This program is free software; you can redistribute it and/or modify
  4. it under the terms of the GNU General Public License as published by
  5. the Free Software Foundation; either version 2 of the License, or
  6. (at your option) any later version.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. GNU General Public License for more details.
  11. You should have received a copy of the GNU General Public License
  12. along with this program; if not, write to the Free Software
  13. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  14. */
  15. #include <stdio.h>
  16. #include <errno.h>
  17. #include <unistd.h>
  18. #include <stdlib.h>
  19. #include <string.h>
  20. #include <getopt.h>
  21. #include <jack/jack.h>
  22. #include <jack/control.h>
  23. static jackctl_driver_t * jackctl_server_get_driver(jackctl_server_t *server, const char *driver_name)
  24. {
  25. const JSList * node_ptr = jackctl_server_get_drivers_list(server);
  26. while (node_ptr) {
  27. if (strcmp(jackctl_driver_get_name((jackctl_driver_t *)node_ptr->data), driver_name) == 0) {
  28. return (jackctl_driver_t *)node_ptr->data;
  29. }
  30. node_ptr = jack_slist_next(node_ptr);
  31. }
  32. return NULL;
  33. }
  34. static jackctl_internal_t * jackctl_server_get_internal(jackctl_server_t *server, const char *internal_name)
  35. {
  36. const JSList * node_ptr = jackctl_server_get_internals_list(server);
  37. while (node_ptr) {
  38. if (strcmp(jackctl_internal_get_name((jackctl_internal_t *)node_ptr->data), internal_name) == 0) {
  39. return (jackctl_internal_t *)node_ptr->data;
  40. }
  41. node_ptr = jack_slist_next(node_ptr);
  42. }
  43. return NULL;
  44. }
  45. #if 0
  46. static jackctl_parameter_t *
  47. jackctl_get_parameter(
  48. const JSList * parameters_list,
  49. const char * parameter_name)
  50. {
  51. while (parameters_list)
  52. {
  53. if (strcmp(jackctl_parameter_get_name((jackctl_parameter_t *)parameters_list->data), parameter_name) == 0)
  54. {
  55. return (jackctl_parameter_t *)parameters_list->data;
  56. }
  57. parameters_list = jack_slist_next(parameters_list);
  58. }
  59. return NULL;
  60. }
  61. #endif
  62. static void print_value(union jackctl_parameter_value value, jackctl_param_type_t type)
  63. {
  64. switch (type) {
  65. case JackParamInt:
  66. printf("parameter value = %d\n", value.i);
  67. break;
  68. case JackParamUInt:
  69. printf("parameter value = %u\n", value.ui);
  70. break;
  71. case JackParamChar:
  72. printf("parameter value = %c\n", value.c);
  73. break;
  74. case JackParamString:
  75. printf("parameter value = %s\n", value.str);
  76. break;
  77. case JackParamBool:
  78. printf("parameter value = %d\n", value.b);
  79. break;
  80. }
  81. }
  82. static void print_parameters(const JSList * node_ptr)
  83. {
  84. while (node_ptr != NULL) {
  85. jackctl_parameter_t * parameter = (jackctl_parameter_t *)node_ptr->data;
  86. printf("\nparameter name = %s\n", jackctl_parameter_get_name(parameter));
  87. printf("parameter id = %c\n", jackctl_parameter_get_id(parameter));
  88. printf("parameter short decs = %s\n", jackctl_parameter_get_short_description(parameter));
  89. printf("parameter long decs = %s\n", jackctl_parameter_get_long_description(parameter));
  90. print_value(jackctl_parameter_get_default_value(parameter), jackctl_parameter_get_type(parameter));
  91. node_ptr = jack_slist_next(node_ptr);
  92. }
  93. }
  94. static void print_driver(jackctl_driver_t * driver)
  95. {
  96. printf("\n--------------------------\n");
  97. printf("driver = %s\n", jackctl_driver_get_name(driver));
  98. printf("-------------------------- \n");
  99. print_parameters(jackctl_driver_get_parameters(driver));
  100. }
  101. static void print_internal(jackctl_internal_t * internal)
  102. {
  103. printf("\n-------------------------- \n");
  104. printf("internal = %s\n", jackctl_internal_get_name(internal));
  105. printf("-------------------------- \n");
  106. print_parameters(jackctl_internal_get_parameters(internal));
  107. }
  108. static void usage()
  109. {
  110. fprintf (stderr, "\n"
  111. "usage: jack_server_control \n"
  112. " [ --driver OR -d driver_name ]\n"
  113. " [ --client OR -c client_name ]\n"
  114. );
  115. }
  116. int main(int argc, char *argv[])
  117. {
  118. jackctl_server_t * server;
  119. const JSList * parameters;
  120. const JSList * drivers;
  121. const JSList * internals;
  122. const JSList * node_ptr;
  123. sigset_t signals;
  124. int opt, option_index;
  125. const char* driver_name = "dummy";
  126. const char* client_name = "audioadapter";
  127. const char *options = "d:c:";
  128. struct option long_options[] = {
  129. {"driver", 1, 0, 'd'},
  130. {"client", 1, 0, 'c'},
  131. };
  132. while ((opt = getopt_long (argc, argv, options, long_options, &option_index)) != EOF) {
  133. switch (opt) {
  134. case 'd':
  135. driver_name = optarg;
  136. break;
  137. case 'c':
  138. client_name = optarg;
  139. break;
  140. default:
  141. usage();
  142. exit(0);
  143. }
  144. }
  145. server = jackctl_server_create(NULL, NULL);
  146. parameters = jackctl_server_get_parameters(server);
  147. /*
  148. jackctl_parameter_t* param;
  149. union jackctl_parameter_value value;
  150. param = jackctl_get_parameter(parameters, "verbose");
  151. if (param != NULL) {
  152. value.b = true;
  153. jackctl_parameter_set_value(param, &value);
  154. }
  155. */
  156. printf("\n========================== \n");
  157. printf("List of server parameters \n");
  158. printf("========================== \n");
  159. print_parameters(parameters);
  160. printf("\n========================== \n");
  161. printf("List of drivers \n");
  162. printf("========================== \n");
  163. drivers = jackctl_server_get_drivers_list(server);
  164. node_ptr = drivers;
  165. while (node_ptr != NULL) {
  166. print_driver((jackctl_driver_t *)node_ptr->data);
  167. node_ptr = jack_slist_next(node_ptr);
  168. }
  169. printf("\n========================== \n");
  170. printf("List of internal clients \n");
  171. printf("========================== \n");
  172. internals = jackctl_server_get_internals_list(server);
  173. node_ptr = internals;
  174. while (node_ptr != NULL) {
  175. print_internal((jackctl_internal_t *)node_ptr->data);
  176. node_ptr = jack_slist_next(node_ptr);
  177. }
  178. // No error checking in this simple example...
  179. jackctl_server_open(server, jackctl_server_get_driver(server, driver_name));
  180. jackctl_server_start(server);
  181. jackctl_server_load_internal(server, jackctl_server_get_internal(server, client_name));
  182. /*
  183. // Switch master test
  184. jackctl_driver_t* master;
  185. usleep(5000000);
  186. printf("jackctl_server_load_master\n");
  187. master = jackctl_server_get_driver(server, "coreaudio");
  188. jackctl_server_switch_master(server, master);
  189. usleep(5000000);
  190. printf("jackctl_server_load_master\n");
  191. master = jackctl_server_get_driver(server, "dummy");
  192. jackctl_server_switch_master(server, master);
  193. */
  194. signals = jackctl_setup_signals(0);
  195. jackctl_wait_signals(signals);
  196. jackctl_server_stop(server);
  197. jackctl_server_close(server);
  198. jackctl_server_destroy(server);
  199. return 0;
  200. }