25 #include <sys/types.h>
35 #include "JackConstants.h"
36 #include "JackPlatformPlug.h"
38 #if defined(JACK_DBUS) && defined(__linux__)
39 #include <dbus/dbus.h>
40 #include "audio_reserve.h"
51 #include <CoreFoundation/CFNotificationCenter.h>
52 #include <CoreFoundation/CoreFoundation.h>
54 static void notify_server_start(
const char* server_name)
57 CFStringRef ref = CFStringCreateWithCString(NULL, server_name, kCFStringEncodingMacRoman);
58 CFNotificationCenterPostNotificationWithOptions(CFNotificationCenterGetDistributedCenter(),
59 CFSTR(
"com.grame.jackserver.start"),
62 kCFNotificationDeliverImmediately | kCFNotificationPostToAllSessions);
66 static void notify_server_stop(
const char* server_name)
69 CFStringRef ref1 = CFStringCreateWithCString(NULL, server_name, kCFStringEncodingMacRoman);
70 CFNotificationCenterPostNotificationWithOptions(CFNotificationCenterGetDistributedCenter(),
71 CFSTR(
"com.grame.jackserver.stop"),
74 kCFNotificationDeliverImmediately | kCFNotificationPostToAllSessions);
80 static void notify_server_start(
const char* server_name)
82 static void notify_server_stop(
const char* server_name)
87 static void copyright(FILE* file)
89 fprintf(file,
"jackdmp " VERSION
"\n"
90 "Copyright 2001-2005 Paul Davis and others.\n"
91 "Copyright 2004-2012 Grame.\n"
92 "jackdmp comes with ABSOLUTELY NO WARRANTY\n"
93 "This is free software, and you are welcome to redistribute it\n"
94 "under certain conditions; see the file COPYING for details\n");
97 static void usage(FILE* file)
100 "usage: jackdmp [ --no-realtime OR -r ]\n"
101 " [ --realtime OR -R [ --realtime-priority OR -P priority ] ]\n"
102 " (the two previous arguments are mutually exclusive. The default is --realtime)\n"
103 " [ --name OR -n server-name ]\n"
104 " [ --timeout OR -t client-timeout-in-msecs ]\n"
105 " [ --loopback OR -L loopback-port-number ]\n"
106 " [ --port-max OR -p maximum-number-of-ports]\n"
107 " [ --slave-backend OR -X slave-backend-name ]\n"
108 " [ --internal-client OR -I internal-client-name ]\n"
109 " [ --verbose OR -v ]\n"
111 " [ --clocksource OR -c [ c(ycle) | h(pet) | s(ystem) ]\n"
113 " [ --replace-registry ]\n"
114 " [ --silent OR -s ]\n"
115 " [ --sync OR -S ]\n"
116 " [ --temporary OR -T ]\n"
117 " [ --version OR -V ]\n"
118 " -d master-backend-name [ ... master-backend args ... ]\n"
120 " Available master backends may include: coreaudio, dummy, net or netone.\n\n"
123 " Available master backends may include: portaudio, dummy, net or netone.\n\n"
126 " Available master backends may include: alsa, dummy, freebob, firewire, net or netone.\n\n"
128 #
if defined(__sun__) || defined(sun)
129 " Available master backends may include: boomer, oss, dummy or net.\n\n"
131 " jackdmp -d master-backend-name --help\n"
132 " to display options for each master backend\n\n");
144 node_ptr = jack_slist_next(node_ptr);
158 node_ptr = jack_slist_next(node_ptr);
166 while (parameters_list) {
170 parameters_list = jack_slist_next(parameters_list);
177 extern "C" void silent_jack_error_callback(
const char *desc);
179 int main(
int argc,
char** argv)
182 const JSList * server_parameters;
183 const char* server_name =
"default";
186 int replace_registry = 0;
188 const char *options =
"-d:X:I:P:uvshVrRL:STFl:t:mn:p:"
194 struct option long_options[] = {
196 {
"clock-source", 1, 0,
'c' },
198 {
"loopback-driver", 1, 0,
'L' },
199 {
"audio-driver", 1, 0,
'd' },
200 {
"midi-driver", 1, 0,
'X' },
201 {
"internal-client", 1, 0,
'I' },
202 {
"verbose", 0, 0,
'v' },
203 {
"help", 0, 0,
'h' },
204 {
"port-max", 1, 0,
'p' },
205 {
"no-mlock", 0, 0,
'm' },
206 {
"name", 1, 0,
'n' },
207 {
"unlock", 0, 0,
'u' },
208 {
"realtime", 0, 0,
'R' },
209 {
"no-realtime", 0, 0,
'r' },
210 {
"replace-registry", 0, &replace_registry, 0 },
211 {
"loopback", 0, 0,
'L' },
212 {
"realtime-priority", 1, 0,
'P' },
213 {
"timeout", 1, 0,
't' },
214 {
"temporary", 0, 0,
'T' },
215 {
"version", 0, 0,
'V' },
216 {
"silent", 0, 0,
's' },
217 {
"sync", 0, 0,
'S' },
222 int option_index = 0;
223 char* master_driver_name = NULL;
224 char** master_driver_args = NULL;
225 int master_driver_nargs = 1;
227 bool show_version =
false;
232 std::list<char*> internals_list;
233 std::list<char*> slaves_list;
234 std::list<char*>::iterator it;
237 int return_value = -1;
238 bool notify_sent =
false;
241 #if defined(JACK_DBUS) && defined(__linux__)
246 if (server_ctl == NULL) {
247 fprintf(stderr,
"Failed to create server object\n");
254 while (!master_driver_name &&
255 (opt = getopt_long(argc, argv, options,
256 long_options, &option_index)) != EOF) {
261 param = jackctl_get_parameter(server_parameters,
"clock-source");
263 if (tolower (optarg[0]) ==
'h') {
264 value.ui = JACK_TIMER_HPET;
266 }
else if (tolower (optarg[0]) ==
'c') {
267 value.ui = JACK_TIMER_CYCLE_COUNTER;
269 }
else if (tolower (optarg[0]) ==
's') {
270 value.ui = JACK_TIMER_SYSTEM_CLOCK;
281 master_driver_name = optarg;
285 loopback = atoi(optarg);
289 slaves_list.push_back(optarg);
293 internals_list.push_back(optarg);
297 param = jackctl_get_parameter(server_parameters,
"port-max");
299 value.ui = atoi(optarg);
305 param = jackctl_get_parameter(server_parameters,
"verbose");
317 param = jackctl_get_parameter(server_parameters,
"sync");
325 server_name = optarg;
326 param = jackctl_get_parameter(server_parameters,
"name");
334 param = jackctl_get_parameter(server_parameters,
"realtime-priority");
336 value.i = atoi(optarg);
342 param = jackctl_get_parameter(server_parameters,
"realtime");
350 param = jackctl_get_parameter(server_parameters,
"realtime");
358 param = jackctl_get_parameter(server_parameters,
"temporary");
366 param = jackctl_get_parameter(server_parameters,
"client-timeout");
368 value.i = atoi(optarg);
378 fprintf(stderr,
"unknown option character %c\n", optopt);
388 param = jackctl_get_parameter(server_parameters,
"replace-registry");
390 value.b = replace_registry;
395 printf(
"jackdmp version " VERSION
396 " tmpdir " jack_server_dir
398 "\n", JACK_PROTOCOL_VERSION);
402 if (!master_driver_name) {
408 master_driver_ctl = jackctl_server_get_driver(server_ctl, master_driver_name);
409 if (master_driver_ctl == NULL) {
410 fprintf(stderr,
"Unknown driver \"%s\"\n", master_driver_name);
415 fprintf(stderr,
"Driver \"%s\" is not a master \n", master_driver_name);
420 master_driver_nargs = 1 + argc - optind;
422 master_driver_nargs = 1;
425 if (master_driver_nargs == 0) {
426 fprintf(stderr,
"No driver specified ... hmm. JACK won't do"
427 " anything when run like this.\n");
431 master_driver_args = (
char **) malloc(
sizeof(
char *) * master_driver_nargs);
432 master_driver_args[0] = master_driver_name;
434 for (i = 1; i < master_driver_nargs; i++) {
435 master_driver_args[
i] = argv[optind++];
447 fprintf(stderr,
"Failed to open server\n");
452 for (it = slaves_list.begin(); it != slaves_list.end(); it++) {
453 jackctl_driver_t * slave_driver_ctl = jackctl_server_get_driver(server_ctl, *it);
454 if (slave_driver_ctl == NULL) {
455 fprintf(stderr,
"Unknown driver \"%s\"\n", *it);
459 fprintf(stderr,
"Driver \"%s\" is not a slave \n", *it);
463 fprintf(stderr,
"Driver \"%s\" cannot be loaded\n", *it);
470 loopback_driver_ctl = jackctl_server_get_driver(server_ctl,
"loopback");
472 if (loopback_driver_ctl != NULL) {
474 param = jackctl_get_parameter(loopback_parameters,
"channels");
480 fprintf(stderr,
"Driver \"loopback\" cannot be loaded\n");
484 fprintf(stderr,
"Driver \"loopback\" not found\n");
491 fprintf(stderr,
"Failed to start server\n");
496 for (it = internals_list.begin(); it != internals_list.end(); it++) {
497 jackctl_internal_t * internal_driver_ctl = jackctl_server_get_internal(server_ctl, *it);
498 if (internal_driver_ctl == NULL) {
499 fprintf(stderr,
"Unknown internal \"%s\"\n", *it);
503 fprintf(stderr,
"Internal client \"%s\" cannot be loaded\n", *it);
508 notify_server_start(server_name);
517 fprintf(stderr,
"Cannot stop server...\n");
521 if (loopback > 0 && loopback_driver_ctl) {
525 for (it = slaves_list.begin(); it != slaves_list.end(); it++) {
526 jackctl_driver_t * slave_driver_ctl = jackctl_server_get_driver(server_ctl, *it);
527 if (slave_driver_ctl)
532 for (it = internals_list.begin(); it != internals_list.end(); it++) {
533 jackctl_internal_t * internal_driver_ctl = jackctl_server_get_internal(server_ctl, *it);
534 if (internal_driver_ctl)
542 notify_server_stop(server_name);
SERVER_EXPORT int jackctl_driver_params_parse(jackctl_driver *driver_ptr, int argc, char *argv[])
SERVER_EXPORT jackctl_sigmask_t * jackctl_setup_signals(unsigned int flags)
SERVER_EXPORT bool jackctl_server_open(jackctl_server *server_ptr, jackctl_driver *driver_ptr)
SERVER_EXPORT jackctl_server_t * jackctl_server_create(bool(*on_device_acquire)(const char *device_name), void(*on_device_release)(const char *device_name))
SERVER_EXPORT const char * jackctl_internal_get_name(jackctl_internal *internal_ptr)
int32_t i
member used for JackParamInt
void jack_set_error_function(void(*func)(const char *)) JACK_OPTIONAL_WEAK_EXPORT
SERVER_EXPORT const char * jackctl_parameter_get_name(jackctl_parameter *parameter_ptr)
SERVER_EXPORT bool jackctl_server_stop(jackctl_server *server_ptr)
Type for parameter value.
SERVER_EXPORT const JSList * jackctl_driver_get_parameters(jackctl_driver *driver_ptr)
SERVER_EXPORT bool jackctl_server_close(jackctl_server *server_ptr)
SERVER_EXPORT bool jackctl_server_remove_slave(jackctl_server *server_ptr, jackctl_driver *driver_ptr)
SERVER_EXPORT const JSList * jackctl_server_get_internals_list(jackctl_server *server_ptr)
SERVER_EXPORT const JSList * jackctl_server_get_drivers_list(jackctl_server *server_ptr)
SERVER_EXPORT bool jackctl_server_start(jackctl_server *server_ptr)
SERVER_EXPORT bool jackctl_parameter_set_value(jackctl_parameter *parameter_ptr, const union jackctl_parameter_value *value_ptr)
SERVER_EXPORT bool jackctl_server_add_slave(jackctl_server *server_ptr, jackctl_driver *driver_ptr)
#define JACK_PARAM_STRING_MAX
Max length of string parameter value, excluding terminating null char.
SERVER_EXPORT const char * jackctl_driver_get_name(jackctl_driver *driver_ptr)
SERVER_EXPORT bool jackctl_server_unload_internal(jackctl_server *server_ptr, jackctl_internal *internal)
SERVER_EXPORT void jackctl_server_destroy(jackctl_server *server_ptr)
SERVER_EXPORT jackctl_driver_type_t jackctl_driver_get_type(jackctl_driver *driver_ptr)
SERVER_EXPORT const JSList * jackctl_server_get_parameters(jackctl_server *server_ptr)
SERVER_EXPORT void jackctl_wait_signals(jackctl_sigmask_t *sigmask)
SERVER_EXPORT bool jackctl_server_load_internal(jackctl_server *server_ptr, jackctl_internal *internal)