diff --git a/example-clients/ipload.c b/example-clients/ipload.c index 4868de3b..702a79e4 100644 --- a/example-clients/ipload.c +++ b/example-clients/ipload.c @@ -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; }