| @@ -1,6 +1,6 @@ | |||||
| /* | /* | ||||
| Copyright (C) 2002 Jeremy Hall | Copyright (C) 2002 Jeremy Hall | ||||
| This program is free software; you can redistribute it and/or modify | This program is free software; you can redistribute it and/or modify | ||||
| it under the terms of the GNU General Public License as published by | it under the terms of the GNU General Public License as published by | ||||
| the Free Software Foundation; either version 2 of the License, or | the Free Software Foundation; either version 2 of the License, or | ||||
| @@ -14,12 +14,13 @@ | |||||
| You should have received a copy of the GNU General Public License | You should have received a copy of the GNU General Public License | ||||
| along with this program; if not, write to the Free Software | along with this program; if not, write to the Free Software | ||||
| Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||||
| */ | */ | ||||
| #include <stdio.h> | #include <stdio.h> | ||||
| #include <errno.h> | #include <errno.h> | ||||
| #ifndef WIN32 | |||||
| #include <unistd.h> | #include <unistd.h> | ||||
| #endif | |||||
| #include <string.h> | #include <string.h> | ||||
| #include <stdlib.h> | #include <stdlib.h> | ||||
| #include <getopt.h> | #include <getopt.h> | ||||
| @@ -32,6 +33,13 @@ | |||||
| #define TRUE 1 | #define TRUE 1 | ||||
| #define FALSE 0 | #define FALSE 0 | ||||
| volatile int done = 0; | |||||
| void port_connect_callback(jack_port_id_t a, jack_port_id_t b, int connect, void* arg) | |||||
| { | |||||
| done = 1; | |||||
| } | |||||
| void | void | ||||
| show_version (char *my_name) | show_version (char *my_name) | ||||
| { | { | ||||
| @@ -50,7 +58,6 @@ show_usage (char *my_name) | |||||
| fprintf (stderr, "For more information see http://jackaudio.org/\n"); | fprintf (stderr, "For more information see http://jackaudio.org/\n"); | ||||
| } | } | ||||
| int | int | ||||
| main (int argc, char *argv[]) | main (int argc, char *argv[]) | ||||
| { | { | ||||
| @@ -73,11 +80,11 @@ main (int argc, char *argv[]) | |||||
| int rc = 1; | int rc = 1; | ||||
| struct option long_options[] = { | struct option long_options[] = { | ||||
| { "server", 1, 0, 's' }, | |||||
| { "help", 0, 0, 'h' }, | |||||
| { "version", 0, 0, 'v' }, | |||||
| { "uuid", 0, 0, 'u' }, | |||||
| { 0, 0, 0, 0 } | |||||
| { "server", 1, 0, 's' }, | |||||
| { "help", 0, 0, 'h' }, | |||||
| { "version", 0, 0, 'v' }, | |||||
| { "uuid", 0, 0, 'u' }, | |||||
| { 0, 0, 0, 0 } | |||||
| }; | }; | ||||
| while ((c = getopt_long (argc, argv, "s:hvu", long_options, &option_index)) >= 0) { | while ((c = getopt_long (argc, argv, "s:hvu", long_options, &option_index)) >= 0) { | ||||
| @@ -120,7 +127,7 @@ main (int argc, char *argv[]) | |||||
| fprintf(stderr, "ERROR! client should be called jack_connect or jack_disconnect. client is called %s\n", my_name); | fprintf(stderr, "ERROR! client should be called jack_connect or jack_disconnect. client is called %s\n", my_name); | ||||
| return 1; | return 1; | ||||
| } | } | ||||
| if (argc < 3) { | if (argc < 3) { | ||||
| show_usage(my_name); | show_usage(my_name); | ||||
| return 1; | return 1; | ||||
| @@ -133,6 +140,8 @@ main (int argc, char *argv[]) | |||||
| return 1; | return 1; | ||||
| } | } | ||||
| jack_set_port_connect_callback(client, port_connect_callback, NULL); | |||||
| /* find the two ports */ | /* find the two ports */ | ||||
| if( use_uuid ) { | if( use_uuid ) { | ||||
| @@ -174,11 +183,11 @@ main (int argc, char *argv[]) | |||||
| if ((port1 = jack_port_by_name(client, portA)) == 0) { | if ((port1 = jack_port_by_name(client, portA)) == 0) { | ||||
| fprintf (stderr, "ERROR %s not a valid port\n", portA); | fprintf (stderr, "ERROR %s not a valid port\n", portA); | ||||
| goto exit; | goto exit; | ||||
| } | |||||
| } | |||||
| if ((port2 = jack_port_by_name(client, portB)) == 0) { | if ((port2 = jack_port_by_name(client, portB)) == 0) { | ||||
| fprintf (stderr, "ERROR %s not a valid port\n", portB); | fprintf (stderr, "ERROR %s not a valid port\n", portB); | ||||
| goto exit; | goto exit; | ||||
| } | |||||
| } | |||||
| port1_flags = jack_port_flags (port1); | port1_flags = jack_port_flags (port1); | ||||
| port2_flags = jack_port_flags (port2); | port2_flags = jack_port_flags (port2); | ||||
| @@ -200,21 +209,38 @@ main (int argc, char *argv[]) | |||||
| goto exit; | goto exit; | ||||
| } | } | ||||
| /* tell the JACK server that we are ready to roll */ | |||||
| if (jack_activate (client)) { | |||||
| fprintf (stderr, "cannot activate client"); | |||||
| goto exit; | |||||
| } | |||||
| /* connect the ports. Note: you can't do this before | /* connect the ports. Note: you can't do this before | ||||
| the client is activated (this may change in the future). | the client is activated (this may change in the future). | ||||
| */ | */ | ||||
| if (connecting) { | if (connecting) { | ||||
| if (jack_connect(client, jack_port_name(src_port), jack_port_name(dst_port))) { | if (jack_connect(client, jack_port_name(src_port), jack_port_name(dst_port))) { | ||||
| fprintf (stderr, "cannot connect client, already connected?\n"); | |||||
| goto exit; | goto exit; | ||||
| } | } | ||||
| } | } | ||||
| if (disconnecting) { | if (disconnecting) { | ||||
| if (jack_disconnect(client, jack_port_name(src_port), jack_port_name(dst_port))) { | if (jack_disconnect(client, jack_port_name(src_port), jack_port_name(dst_port))) { | ||||
| fprintf (stderr, "cannot disconnect client, already disconnected?\n"); | |||||
| goto exit; | goto exit; | ||||
| } | } | ||||
| } | } | ||||
| // Wait for connection/disconnection to be effective | |||||
| while(!done) { | |||||
| #ifdef WIN32 | |||||
| Sleep(10); | |||||
| #else | |||||
| usleep(10000); | |||||
| #endif | |||||
| } | |||||
| /* everything was ok, so setting exitcode to 0 */ | /* everything was ok, so setting exitcode to 0 */ | ||||
| rc = 0; | rc = 0; | ||||
| @@ -222,4 +248,3 @@ exit: | |||||
| jack_client_close (client); | jack_client_close (client); | ||||
| exit (rc); | exit (rc); | ||||
| } | } | ||||