jackdbus/example-clients/netslave.c

169 lines
4.1 KiB
C

/*
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 <stdlib.h>
#include <stdio.h>
#include <errno.h>
#ifndef WIN32
#include <unistd.h>
#endif
#include <math.h>
#include <signal.h>
#include <getopt.h>
#include <string.h>
#include <jack/net.h>
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);
}