25 #include <sys/types.h>
33 #include "JackConstants.h"
34 #include "JackDriverLoader.h"
36 #if defined(JACK_DBUS) && defined(__linux__)
37 #include <dbus/dbus.h>
38 #include "audio_reserve.h"
49 #include <CoreFoundation/CFNotificationCenter.h>
50 #include <CoreFoundation/CoreFoundation.h>
52 static void notify_server_start(
const char* server_name)
55 CFStringRef ref = CFStringCreateWithCString(NULL, server_name, kCFStringEncodingMacRoman);
56 CFNotificationCenterPostNotificationWithOptions(CFNotificationCenterGetDistributedCenter(),
57 CFSTR(
"com.grame.jackserver.start"),
60 kCFNotificationDeliverImmediately | kCFNotificationPostToAllSessions);
64 static void notify_server_stop(
const char* server_name)
67 CFStringRef ref1 = CFStringCreateWithCString(NULL, server_name, kCFStringEncodingMacRoman);
68 CFNotificationCenterPostNotificationWithOptions(CFNotificationCenterGetDistributedCenter(),
69 CFSTR(
"com.grame.jackserver.stop"),
72 kCFNotificationDeliverImmediately | kCFNotificationPostToAllSessions);
78 static void notify_server_start(
const char* server_name)
80 static void notify_server_stop(
const char* server_name)
85 static void copyright(FILE* file)
87 fprintf(file,
"jackdmp " VERSION
"\n"
88 "Copyright 2001-2005 Paul Davis and others.\n"
89 "Copyright 2004-2011 Grame.\n"
90 "jackdmp comes with ABSOLUTELY NO WARRANTY\n"
91 "This is free software, and you are welcome to redistribute it\n"
92 "under certain conditions; see the file COPYING for details\n");
95 static void usage(FILE* file)
98 "usage: jackdmp [ --no-realtime OR -r ]\n"
99 " [ --realtime OR -R [ --realtime-priority OR -P priority ] ]\n"
100 " (the two previous arguments are mutually exclusive. The default is --realtime)\n"
101 " [ --name OR -n server-name ]\n"
102 " [ --timeout OR -t client-timeout-in-msecs ]\n"
103 " [ --loopback OR -L loopback-port-number ]\n"
104 " [ --port-max OR -p maximum-number-of-ports]\n"
105 " [ --slave-backend OR -X slave-backend-name ]\n"
106 " [ --internal-client OR -I internal-client-name ]\n"
107 " [ --verbose OR -v ]\n"
109 " [ --clocksource OR -c [ c(ycle) | h(pet) | s(ystem) ]\n"
111 " [ --replace-registry ]\n"
112 " [ --silent OR -s ]\n"
113 " [ --sync OR -S ]\n"
114 " [ --temporary OR -T ]\n"
115 " [ --version OR -V ]\n"
116 " -d master-backend-name [ ... master-backend args ... ]\n"
118 " Available master backends may include: coreaudio, dummy, net or netone.\n\n"
121 " Available master backends may include: portaudio, dummy, net or netone.\n\n"
124 " Available master backends may include: alsa, dummy, freebob, firewire, net or netone.\n\n"
126 #
if defined(__sun__) || defined(sun)
127 " Available master backends may include: boomer, oss, dummy or net.\n\n"
129 " jackdmp -d master-backend-name --help\n"
130 " to display options for each master backend\n\n");
135 jackctl_server_get_driver(
137 const char *driver_name)
150 node_ptr = jack_slist_next(node_ptr);
164 node_ptr = jack_slist_next(node_ptr);
171 jackctl_get_parameter(
172 const JSList * parameters_list,
173 const char * parameter_name)
175 while (parameters_list)
182 parameters_list = jack_slist_next(parameters_list);
188 int main(
int argc,
char** argv)
191 const JSList * server_parameters;
192 const char* server_name =
"default";
195 int replace_registry = 0;
197 const char *options =
"-d:X:I:P:uvshVrRL:STFl:t:mn:p:"
203 struct option long_options[] = {
205 {
"clock-source", 1, 0,
'c' },
207 {
"loopback-driver", 1, 0,
'L' },
208 {
"audio-driver", 1, 0,
'd' },
209 {
"midi-driver", 1, 0,
'X' },
210 {
"internal-client", 1, 0,
'I' },
211 {
"verbose", 0, 0,
'v' },
212 {
"help", 0, 0,
'h' },
213 {
"port-max", 1, 0,
'p' },
214 {
"no-mlock", 0, 0,
'm' },
215 {
"name", 1, 0,
'n' },
216 {
"unlock", 0, 0,
'u' },
217 {
"realtime", 0, 0,
'R' },
218 {
"no-realtime", 0, 0,
'r' },
219 {
"replace-registry", 0, &replace_registry, 0 },
220 {
"loopback", 0, 0,
'L' },
221 {
"realtime-priority", 1, 0,
'P' },
222 {
"timeout", 1, 0,
't' },
223 {
"temporary", 0, 0,
'T' },
224 {
"version", 0, 0,
'V' },
225 {
"silent", 0, 0,
's' },
226 {
"sync", 0, 0,
'S' },
231 int option_index = 0;
232 char* master_driver_name = NULL;
233 char** master_driver_args = NULL;
234 int master_driver_nargs = 1;
238 bool show_version =
false;
243 std::list<char*> internals_list;
244 std::list<char*> slaves_list;
245 std::list<char*>::iterator it;
248 int return_value = -1;
249 bool notify_sent =
false;
252 #if defined(JACK_DBUS) && defined(__linux__)
257 if (server_ctl == NULL) {
258 fprintf(stderr,
"Failed to create server object\n");
265 while (!master_driver_name &&
266 (opt = getopt_long(argc, argv, options,
267 long_options, &option_index)) != EOF) {
272 param = jackctl_get_parameter(server_parameters,
"clock-source");
274 if (tolower (optarg[0]) ==
'h') {
275 value.ui = JACK_TIMER_HPET;
277 }
else if (tolower (optarg[0]) ==
'c') {
278 value.ui = JACK_TIMER_CYCLE_COUNTER;
280 }
else if (tolower (optarg[0]) ==
's') {
281 value.ui = JACK_TIMER_SYSTEM_CLOCK;
292 master_driver_name = optarg;
296 loopback = atoi(optarg);
300 slaves_list.push_back(optarg);
304 internals_list.push_back(optarg);
308 param = jackctl_get_parameter(server_parameters,
"port-max");
310 value.ui = atoi(optarg);
324 param = jackctl_get_parameter(server_parameters,
"verbose");
336 param = jackctl_get_parameter(server_parameters,
"sync");
344 server_name = optarg;
345 param = jackctl_get_parameter(server_parameters,
"name");
353 param = jackctl_get_parameter(server_parameters,
"realtime-priority");
355 value.i = atoi(optarg);
361 param = jackctl_get_parameter(server_parameters,
"realtime");
369 param = jackctl_get_parameter(server_parameters,
"realtime");
377 param = jackctl_get_parameter(server_parameters,
"temporary");
385 param = jackctl_get_parameter(server_parameters,
"client-timeout");
387 value.i = atoi(optarg);
397 fprintf(stderr,
"unknown option character %c\n", optopt);
407 param = jackctl_get_parameter(server_parameters,
"replace-registry");
409 value.b = replace_registry;
414 printf(
"jackdmp version " VERSION
415 " tmpdir " jack_server_dir
417 "\n", JACK_PROTOCOL_VERSION);
421 if (!master_driver_name) {
427 master_driver_ctl = jackctl_server_get_driver(server_ctl, master_driver_name);
428 if (master_driver_ctl == NULL) {
429 fprintf(stderr,
"Unknown driver \"%s\"\n", master_driver_name);
434 fprintf(stderr,
"Driver \"%s\" is not a master \n", master_driver_name);
439 master_driver_nargs = 1 + argc - optind;
441 master_driver_nargs = 1;
444 if (master_driver_nargs == 0) {
445 fprintf(stderr,
"No driver specified ... hmm. JACK won't do"
446 " anything when run like this.\n");
450 master_driver_args = (
char **) malloc(
sizeof(
char *) * master_driver_nargs);
451 master_driver_args[0] = master_driver_name;
453 for (i = 1; i < master_driver_nargs; i++) {
454 master_driver_args[
i] = argv[optind++];
457 if (jackctl_parse_driver_params(master_driver_ctl, master_driver_nargs, master_driver_args)) {
466 fprintf(stderr,
"Failed to open server\n");
471 for (it = slaves_list.begin(); it != slaves_list.end(); it++) {
472 jackctl_driver_t * slave_driver_ctl = jackctl_server_get_driver(server_ctl, *it);
473 if (slave_driver_ctl == NULL) {
474 fprintf(stderr,
"Unknown driver \"%s\"\n", *it);
478 fprintf(stderr,
"Driver \"%s\" is not a slave \n", *it);
482 fprintf(stderr,
"Driver \"%s\" cannot be loaded\n", *it);
489 loopback_driver_ctl = jackctl_server_get_driver(server_ctl,
"loopback");
491 if (loopback_driver_ctl != NULL) {
493 param = jackctl_get_parameter(loopback_parameters,
"channels");
499 fprintf(stderr,
"Driver \"loopback\" cannot be loaded\n");
503 fprintf(stderr,
"Driver \"loopback\" not found\n");
510 fprintf(stderr,
"Failed to start server\n");
515 for (it = internals_list.begin(); it != internals_list.end(); it++) {
516 jackctl_internal_t * internal_driver_ctl = jackctl_server_get_internal(server_ctl, *it);
517 if (internal_driver_ctl == NULL) {
518 fprintf(stderr,
"Unknown internal \"%s\"\n", *it);
522 fprintf(stderr,
"Internal client \"%s\" cannot be loaded\n", *it);
527 notify_server_start(server_name);
536 fprintf(stderr,
"Cannot stop server...\n");
540 if (loopback > 0 && loopback_driver_ctl) {
544 for (it = slaves_list.begin(); it != slaves_list.end(); it++) {
545 jackctl_driver_t * slave_driver_ctl = jackctl_server_get_driver(server_ctl, *it);
546 if (slave_driver_ctl)
551 for (it = internals_list.begin(); it != internals_list.end(); it++) {
552 jackctl_internal_t * internal_driver_ctl = jackctl_server_get_internal(server_ctl, *it);
553 if (internal_driver_ctl)
561 notify_server_stop(server_name);