/* Copyright (C) 2009 Grame 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 the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include #include #ifndef WIN32 #include #endif #include #include #include #include #include jack_net_slave_t* net; static void signal_handler(int sig) { jack_net_slave_close(net); fprintf(stderr, "signal received, exiting ...\n"); exit(0); } static void usage () { fprintf (stderr, "\n" "usage: jack_net_slave \n" " [ -C capture channels (default = 2)]\n" " [ -P playback channels (default = 2) ]\n" " [ -a hostname (default = %s) ]\n" " [ -p port (default = %d)]\n", DEFAULT_MULTICAST_IP, DEFAULT_PORT); } static void net_shutdown(void* data) { printf("Restarting...\n"); } static int net_process(jack_nframes_t buffer_size, int audio_input, float** audio_input_buffer, int midi_input, void** midi_input_buffer, int audio_output, float** audio_output_buffer, int midi_output, void** midi_output_buffer, void* data) { int i; // Copy input to output for (i = 0; i < audio_input; i++) { memcpy(audio_output_buffer[i], audio_input_buffer[i], buffer_size * sizeof(float)); } return 0; } int main (int argc, char *argv[]) { int audio_input = 2; int audio_output = 2; int udp_port = DEFAULT_PORT; const char* multicast_ip = DEFAULT_MULTICAST_IP; const char *options = "C:P:a:p:h"; int option_index; int opt; struct option long_options[] = { {"audio input", 1, 0, 'C'}, {"audio output", 1, 0, 'P'}, {"hostname", 1, 0, 'a'}, {"port", 1, 0, 'p'}, {0, 0, 0, 0} }; while ((opt = getopt_long (argc, argv, options, long_options, &option_index)) != EOF) { switch (opt) { case 'C': audio_input = atoi(optarg); break; case 'P': audio_output = atoi(optarg); break; case 'a': multicast_ip = strdup(optarg); break; case 'p': udp_port = atoi(optarg); break; case 'h': usage(); return -1; } } jack_slave_t request = { audio_input, audio_output, 0, 0, DEFAULT_MTU, -1, JackFloatEncoder, 0, 2 }; jack_master_t result; printf("Waiting for a master...\n"); if ((net = jack_net_slave_open(multicast_ip, udp_port, "net_slave", &request, &result)) == 0) { fprintf(stderr, "JACK server not running?\n"); return 1; } printf("Master is found and running...\n"); jack_set_net_slave_process_callback(net, net_process, NULL); jack_set_net_slave_shutdown_callback(net, net_shutdown, NULL); if (jack_net_slave_activate(net) != 0) { fprintf(stderr, "Cannot activate slave client\n"); return 1; } /* install a signal handler to properly quits jack client */ #ifdef WIN32 signal(SIGINT, signal_handler); signal(SIGABRT, signal_handler); signal(SIGTERM, signal_handler); #else signal(SIGQUIT, signal_handler); signal(SIGTERM, signal_handler); signal(SIGHUP, signal_handler); signal(SIGINT, signal_handler); #endif /* run until interrupted */ while (1) { #ifdef WIN32 Sleep(1000); #else sleep(1); #endif }; // Wait for application end jack_net_slave_deactivate(net); jack_net_slave_close(net); exit(0); }