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.

251 lines
7.1KB

  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. #ifndef WIN32
  18. #include <unistd.h>
  19. #endif
  20. #include <stdlib.h>
  21. #include <string.h>
  22. #include <getopt.h>
  23. #include <jack/jack.h>
  24. #include <jack/control.h>
  25. #ifdef _MSC_VER
  26. #define alloca _alloca
  27. #endif
  28. static jackctl_driver_t * jackctl_server_get_driver(jackctl_server_t *server, const char *driver_name)
  29. {
  30. const JSList * node_ptr = jackctl_server_get_drivers_list(server);
  31. while (node_ptr) {
  32. if (strcmp(jackctl_driver_get_name((jackctl_driver_t *)node_ptr->data), driver_name) == 0) {
  33. return (jackctl_driver_t *)node_ptr->data;
  34. }
  35. node_ptr = jack_slist_next(node_ptr);
  36. }
  37. return NULL;
  38. }
  39. static jackctl_internal_t * jackctl_server_get_internal(jackctl_server_t *server, const char *internal_name)
  40. {
  41. const JSList * node_ptr = jackctl_server_get_internals_list(server);
  42. while (node_ptr) {
  43. if (strcmp(jackctl_internal_get_name((jackctl_internal_t *)node_ptr->data), internal_name) == 0) {
  44. return (jackctl_internal_t *)node_ptr->data;
  45. }
  46. node_ptr = jack_slist_next(node_ptr);
  47. }
  48. return NULL;
  49. }
  50. #if 0
  51. static jackctl_parameter_t *
  52. jackctl_get_parameter(
  53. const JSList * parameters_list,
  54. const char * parameter_name)
  55. {
  56. while (parameters_list)
  57. {
  58. if (strcmp(jackctl_parameter_get_name((jackctl_parameter_t *)parameters_list->data), parameter_name) == 0)
  59. {
  60. return (jackctl_parameter_t *)parameters_list->data;
  61. }
  62. parameters_list = jack_slist_next(parameters_list);
  63. }
  64. return NULL;
  65. }
  66. #endif
  67. static void print_value(union jackctl_parameter_value value, jackctl_param_type_t type)
  68. {
  69. switch (type) {
  70. case JackParamInt:
  71. printf("parameter value = %d\n", value.i);
  72. break;
  73. case JackParamUInt:
  74. printf("parameter value = %u\n", value.ui);
  75. break;
  76. case JackParamChar:
  77. printf("parameter value = %c\n", value.c);
  78. break;
  79. case JackParamString:
  80. printf("parameter value = %s\n", value.str);
  81. break;
  82. case JackParamBool:
  83. printf("parameter value = %d\n", value.b);
  84. break;
  85. }
  86. }
  87. static void print_parameters(const JSList * node_ptr)
  88. {
  89. while (node_ptr != NULL) {
  90. jackctl_parameter_t * parameter = (jackctl_parameter_t *)node_ptr->data;
  91. printf("\nparameter name = %s\n", jackctl_parameter_get_name(parameter));
  92. printf("parameter id = %c\n", jackctl_parameter_get_id(parameter));
  93. printf("parameter short decs = %s\n", jackctl_parameter_get_short_description(parameter));
  94. printf("parameter long decs = %s\n", jackctl_parameter_get_long_description(parameter));
  95. print_value(jackctl_parameter_get_default_value(parameter), jackctl_parameter_get_type(parameter));
  96. node_ptr = jack_slist_next(node_ptr);
  97. }
  98. }
  99. static void print_driver(jackctl_driver_t * driver)
  100. {
  101. printf("\n--------------------------\n");
  102. printf("driver = %s\n", jackctl_driver_get_name(driver));
  103. printf("-------------------------- \n");
  104. print_parameters(jackctl_driver_get_parameters(driver));
  105. }
  106. static void print_internal(jackctl_internal_t * internal)
  107. {
  108. printf("\n-------------------------- \n");
  109. printf("internal = %s\n", jackctl_internal_get_name(internal));
  110. printf("-------------------------- \n");
  111. print_parameters(jackctl_internal_get_parameters(internal));
  112. }
  113. static void usage()
  114. {
  115. fprintf (stderr, "\n"
  116. "usage: jack_server_control \n"
  117. " [ --driver OR -d driver_name ]\n"
  118. " [ --client OR -c client_name ]\n"
  119. );
  120. }
  121. int main(int argc, char *argv[])
  122. {
  123. jackctl_server_t * server;
  124. const JSList * parameters;
  125. const JSList * drivers;
  126. const JSList * internals;
  127. const JSList * node_ptr;
  128. jackctl_sigmask_t * sigmask;
  129. int opt, option_index;
  130. const char* driver_name = "dummy";
  131. const char* client_name = "audioadapter";
  132. const char *options = "d:c:";
  133. struct option long_options[] = {
  134. {"driver", 1, 0, 'd'},
  135. {"client", 1, 0, 'c'},
  136. {0, 0, 0, 0}
  137. };
  138. while ((opt = getopt_long (argc, argv, options, long_options, &option_index)) != -1) {
  139. switch (opt) {
  140. case 'd':
  141. driver_name = optarg;
  142. break;
  143. case 'c':
  144. client_name = optarg;
  145. break;
  146. default:
  147. usage();
  148. exit(0);
  149. }
  150. }
  151. server = jackctl_server_create(NULL, NULL);
  152. parameters = jackctl_server_get_parameters(server);
  153. /*
  154. jackctl_parameter_t* param;
  155. union jackctl_parameter_value value;
  156. param = jackctl_get_parameter(parameters, "verbose");
  157. if (param != NULL) {
  158. value.b = true;
  159. jackctl_parameter_set_value(param, &value);
  160. }
  161. */
  162. printf("\n========================== \n");
  163. printf("List of server parameters \n");
  164. printf("========================== \n");
  165. print_parameters(parameters);
  166. printf("\n========================== \n");
  167. printf("List of drivers \n");
  168. printf("========================== \n");
  169. drivers = jackctl_server_get_drivers_list(server);
  170. node_ptr = drivers;
  171. while (node_ptr != NULL) {
  172. print_driver((jackctl_driver_t *)node_ptr->data);
  173. node_ptr = jack_slist_next(node_ptr);
  174. }
  175. printf("\n========================== \n");
  176. printf("List of internal clients \n");
  177. printf("========================== \n");
  178. internals = jackctl_server_get_internals_list(server);
  179. node_ptr = internals;
  180. while (node_ptr != NULL) {
  181. print_internal((jackctl_internal_t *)node_ptr->data);
  182. node_ptr = jack_slist_next(node_ptr);
  183. }
  184. // No error checking in this simple example...
  185. jackctl_server_open(server, jackctl_server_get_driver(server, driver_name));
  186. jackctl_server_start(server);
  187. jackctl_server_load_internal(server, jackctl_server_get_internal(server, client_name));
  188. /*
  189. // Switch master test
  190. jackctl_driver_t* master;
  191. usleep(5000000);
  192. printf("jackctl_server_load_master\n");
  193. master = jackctl_server_get_driver(server, "coreaudio");
  194. jackctl_server_switch_master(server, master);
  195. usleep(5000000);
  196. printf("jackctl_server_load_master\n");
  197. master = jackctl_server_get_driver(server, "dummy");
  198. jackctl_server_switch_master(server, master);
  199. */
  200. sigmask = jackctl_setup_signals(0);
  201. jackctl_wait_signals(sigmask);
  202. jackctl_server_stop(server);
  203. jackctl_server_close(server);
  204. jackctl_server_destroy(server);
  205. return 0;
  206. }