| @@ -32,11 +32,17 @@ char *intclient_name; | |||
| char *load_name; | |||
| char *load_init = ""; | |||
| char *server_name = NULL; | |||
| int autoclose_opt = 0; | |||
| int wait_opt = 0; | |||
| volatile int idling = 1; | |||
| static void | |||
| signal_handler (int sig) | |||
| { | |||
| /* do nothing if internal client closed itself */ | |||
| if (idling == 0) | |||
| return; | |||
| jack_status_t status; | |||
| fprintf (stderr, "signal received, unloading..."); | |||
| @@ -45,10 +51,26 @@ signal_handler (int sig) | |||
| fprintf (stderr, "(failed), status = 0x%2.0x\n", status); | |||
| else | |||
| fprintf (stderr, "(succeeded)\n"); | |||
| if (autoclose_opt) | |||
| jack_deactivate(client); | |||
| jack_client_close (client); | |||
| exit (0); | |||
| } | |||
| static void | |||
| registration_callback (const char *name, int reg, void *arg) | |||
| { | |||
| if (reg || strcmp(intclient_name, name)) | |||
| return; | |||
| /* this will stop the wait loop and thus close this application. */ | |||
| idling = 0; | |||
| return; | |||
| /* unused */ | |||
| (void)arg; | |||
| } | |||
| static void | |||
| show_usage () | |||
| { | |||
| @@ -56,6 +78,7 @@ show_usage () | |||
| "[ init-string]]\n\noptions:\n", client_name); | |||
| fprintf (stderr, | |||
| "\t-h, --help \t\t print help message\n" | |||
| "\t-a, --autoclose\t automatically close when intclient is unloaded\n" | |||
| "\t-i, --init string\t initialize string\n" | |||
| "\t-s, --server name\t select JACK server\n" | |||
| "\t-w, --wait \t\t wait for signal, then unload\n" | |||
| @@ -68,9 +91,10 @@ parse_args (int argc, char *argv[]) | |||
| { | |||
| int c; | |||
| int option_index = 0; | |||
| char *short_options = "hi:s:w"; | |||
| char *short_options = "hai:s:w"; | |||
| struct option long_options[] = { | |||
| { "help", 0, 0, 'h' }, | |||
| { "autoclose", 0, 0, 'a' }, | |||
| { "init", required_argument, 0, 'i' }, | |||
| { "server", required_argument, 0, 's' }, | |||
| { "wait", 0, 0, 'w' }, | |||
| @@ -87,6 +111,9 @@ parse_args (int argc, char *argv[]) | |||
| while ((c = getopt_long (argc, argv, short_options, long_options, | |||
| &option_index)) >= 0) { | |||
| switch (c) { | |||
| case 'a': | |||
| autoclose_opt = 1; | |||
| break; | |||
| case 'i': | |||
| load_init = optarg; | |||
| break; | |||
| @@ -103,6 +130,10 @@ parse_args (int argc, char *argv[]) | |||
| } | |||
| } | |||
| /* autoclose makes no sense without wait */ | |||
| if (autoclose_opt && ! wait_opt) | |||
| autoclose_opt = 0; | |||
| if (optind == argc) { /* no positional args? */ | |||
| show_usage (); | |||
| return 1; | |||
| @@ -176,6 +207,11 @@ main (int argc, char *argv[]) | |||
| free(name); | |||
| } | |||
| if (autoclose_opt) { | |||
| jack_set_client_registration_callback(client, registration_callback, NULL); | |||
| jack_activate(client); | |||
| } | |||
| if (wait_opt) { | |||
| /* define a signal handler to unload the client, then | |||
| * wait for it to exit */ | |||
| @@ -190,7 +226,7 @@ main (int argc, char *argv[]) | |||
| signal(SIGINT, signal_handler); | |||
| #endif | |||
| while (1) { | |||
| while (idling) { | |||
| #ifdef WIN32 | |||
| Sleep(1000); | |||
| #else | |||
| @@ -199,7 +235,11 @@ main (int argc, char *argv[]) | |||
| } | |||
| } | |||
| jack_client_close(client); | |||
| if (autoclose_opt) { | |||
| jack_deactivate(client); | |||
| } | |||
| jack_client_close(client); | |||
| return 0; | |||
| } | |||