summaryrefslogtreecommitdiff
path: root/example-clients/ipload.c
diff options
context:
space:
mode:
authorjoq <joq@0c269be4-1314-0410-8aa9-9f06e86f4224>2004-11-28 00:29:46 +0000
committerjoq <joq@0c269be4-1314-0410-8aa9-9f06e86f4224>2004-11-28 00:29:46 +0000
commit6dcf31179c66aa27318913e79525f654f15bcb9c (patch)
tree50bf28515668932b03c624d0542605287d3f7237 /example-clients/ipload.c
parent7cc82b9e162e2e199c857237116ff8488857bbfb (diff)
downloadjack1-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.c175
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;
}