diff options
author | joq <joq@0c269be4-1314-0410-8aa9-9f06e86f4224> | 2004-11-28 00:29:46 +0000 |
---|---|---|
committer | joq <joq@0c269be4-1314-0410-8aa9-9f06e86f4224> | 2004-11-28 00:29:46 +0000 |
commit | 6dcf31179c66aa27318913e79525f654f15bcb9c (patch) | |
tree | 50bf28515668932b03c624d0542605287d3f7237 /example-clients/ipload.c | |
parent | 7cc82b9e162e2e199c857237116ff8488857bbfb (diff) | |
download | jack1-6dcf31179c66aa27318913e79525f654f15bcb9c.tar.gz |
[0.99.14] jack_client_open() part 2
git-svn-id: svn+ssh://jackaudio.org/trunk/jack@806 0c269be4-1314-0410-8aa9-9f06e86f4224
Diffstat (limited to 'example-clients/ipload.c')
-rw-r--r-- | example-clients/ipload.c | 175 |
1 files changed, 155 insertions, 20 deletions
diff --git a/example-clients/ipload.c b/example-clients/ipload.c index 6abf81e..1f905cb 100644 --- a/example-clients/ipload.c +++ b/example-clients/ipload.c @@ -1,34 +1,169 @@ #include <stdio.h> +#include <string.h> +#include <signal.h> +#include <unistd.h> +#include <getopt.h> #include <jack/jack.h> +#include <jack/intclient.h> + +jack_client_t *client; +jack_intclient_t intclient; +char *client_name; +char *intclient_name; +char *load_name; +char *load_init = NULL; +char *server_name = NULL; +int wait_opt = 0; + +void +signal_handler (int sig) +{ + jack_status_t status; + + fprintf (stderr, "signal received, unloading..."); + status = jack_internal_client_unload (client, intclient); + if (status & JackFailure) + fprintf (stderr, "(failed), status = 0x%x\n", status); + else + fprintf (stderr, "(succeeded)\n"); + jack_client_close (client); + exit (0); +} + +void +show_usage () +{ + fprintf (stderr, "usage: %s [ options ] client-name [ load-name " + "[ init-string]]\n\noptions:\n", client_name); + fprintf (stderr, + "\t-h, --help \t\t print help message\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" + "\n" + ); +} + +int +parse_args (int argc, char *argv[]) +{ + int c; + int option_index = 0; + char *short_options = "hi:s:w"; + struct option long_options[] = { + { "help", 0, 0, 'h' }, + { "init", required_argument, 0, 'i' }, + { "server", required_argument, 0, 's' }, + { "wait", 0, 0, 'w' }, + { 0, 0, 0, 0 } + }; + + client_name = strrchr(argv[0], '/'); + if (client_name == NULL) { + client_name = argv[0]; + } else { + client_name++; + } + + while ((c = getopt_long (argc, argv, short_options, long_options, + &option_index)) >= 0) { + switch (c) { + case 'i': + load_init = optarg; + break; + case 's': + server_name = optarg; + break; + case 'w': + wait_opt = 1; + break; + case 'h': + default: + show_usage (); + return 1; + } + } + + if (optind == argc) { /* no positional args? */ + show_usage (); + return 1; + } + if (optind < argc) + load_name = intclient_name = argv[optind++]; + + if (optind < argc) + load_name = argv[optind++]; + + if (optind < argc) + load_init = argv[optind++]; + + //fprintf (stderr, "client-name = `%s', load-name = `%s', " + // "load-init = `%s', wait = %d\n", + // intclient_name, load_name, load_init, wait_opt); + + return 0; /* args OK */ +} int main (int argc, char *argv[]) { - char *name; - char *so_name; - char *so_data; + jack_status_t status; - if (argc < 3) { - fprintf (stderr, "usage: %s client-name so-name [ so-data ]\n", argv[0]); - return -1; + /* parse and validate command arguments */ + if (parse_args (argc, argv)) + exit (1); /* invalid command line */ + + /* first, become a JACK client */ + client = jack_client_open (client_name, JackServerName, + &status, server_name); + if (client == NULL) { + fprintf (stderr, "jack_client_open() failed, status = 0x%x\n", + status); + if (status & JackServerFailed) { + fprintf (stderr, "Unable to connect to JACK server\n"); + } + exit (1); + } + if (status & JackServerStarted) { + fprintf (stderr, "JACK server started\n"); + } + if (status & JackNameNotUnique) { + client_name = jack_get_client_name(client); + fprintf (stderr, "unique name `%s' assigned\n", client_name); } - name = argv[1]; - so_name = argv[2]; - - if (argc < 4) { - so_data = ""; - } else { - so_data = argv[3]; + /* then, load the internal client */ + intclient = jack_internal_client_load (client, intclient_name, + (JackLoadName|JackLoadInit), + &status, load_name, load_init); + if (status & JackFailure) { + fprintf (stderr, "could not load %s, status = %d\n", + load_name, status); + return 2; } - - if (jack_internal_client_new (name, so_name, so_data) != 0) { - fprintf (stderr, "could not load %s\n", so_name); - return -1; - } else { - fprintf (stdout, "%s is running.\n", name); - return 0; + if (status & JackNameNotUnique) { + intclient_name = + jack_get_internal_client_name (client, intclient); + fprintf (stderr, "unique internal client name `%s' assigned\n", + intclient_name); + } + + fprintf (stdout, "%s is running.\n", load_name); + + if (wait_opt) { + /* define a signal handler to unload the client, then + * wait for it to exit */ + signal (SIGQUIT, signal_handler); + signal (SIGTERM, signal_handler); + signal (SIGHUP, signal_handler); + signal (SIGINT, signal_handler); + + while (1) { + sleep (1); + } } + + return 0; } |