summaryrefslogtreecommitdiff
path: root/example-clients
diff options
context:
space:
mode:
authorfalkTX <falktx@falktx.com>2020-09-20 01:11:13 +0100
committerfalkTX <falktx@falktx.com>2020-09-20 01:11:13 +0100
commitb19c12ba569628845b014953848c25a5498e4169 (patch)
tree8d849f87292faab2ffc12c310b76b4055fc49d7e /example-clients
parentb3603d6fb3afa201ae251ae0826bad627cbcdef4 (diff)
downloadjack2-b19c12ba569628845b014953848c25a5498e4169.tar.gz
Split example-clients and tools, as done for jack1
Signed-off-by: falkTX <falktx@falktx.com>
Diffstat (limited to 'example-clients')
-rw-r--r--example-clients/alias.c133
-rw-r--r--example-clients/alsa_in.c846
-rw-r--r--example-clients/alsa_out.c848
-rw-r--r--example-clients/bufsize.c124
-rw-r--r--example-clients/connect.c248
-rw-r--r--example-clients/evmon.c164
-rw-r--r--example-clients/freewheel.c87
-rw-r--r--example-clients/ipload.c246
-rw-r--r--example-clients/ipunload.c93
-rwxr-xr-xexample-clients/jack_control403
-rw-r--r--example-clients/lsp.c291
-rw-r--r--example-clients/midi_dump.c233
-rw-r--r--example-clients/monitor_client.c66
-rw-r--r--example-clients/netsource.c802
-rw-r--r--example-clients/property.c326
-rw-r--r--example-clients/samplerate.c87
-rw-r--r--example-clients/session_notify.c186
-rw-r--r--example-clients/transport.c508
-rw-r--r--example-clients/tw.c264
-rw-r--r--example-clients/wait.c152
-rw-r--r--example-clients/wscript77
21 files changed, 9 insertions, 6175 deletions
diff --git a/example-clients/alias.c b/example-clients/alias.c
deleted file mode 100644
index cb2b3f99..00000000
--- a/example-clients/alias.c
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- 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 <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <string.h>
-#include <getopt.h>
-#include <jack/jack.h>
-
-char * my_name;
-
-void
-show_version (void)
-{
- //fprintf (stderr, "%s: JACK Audio Connection Kit version " VERSION "\n", my_name);
-}
-
-void
-show_usage (void)
-{
- show_version ();
- fprintf (stderr, "\nUsage: %s [options] portname alias\n", my_name);
- fprintf (stderr, "List active Jack ports, and optionally display extra information.\n\n");
- fprintf (stderr, "Display options:\n");
- fprintf (stderr, " -u, --unalias remove `alias' as an alias for `port'\n");
- fprintf (stderr, " -h, --help Display this help message\n");
- fprintf (stderr, " --version Output version information and exit\n\n");
- fprintf (stderr, "For more information see http://jackaudio.org/\n");
-}
-
-int
-main (int argc, char *argv[])
-{
- jack_client_t *client;
- jack_status_t status;
- char* portname;
- char* alias;
- int unset = 0;
- int ret;
- int c;
- int option_index;
- extern int optind;
- jack_port_t* port;
-
- struct option long_options[] = {
- { "unalias", 0, 0, 'u' },
- { "help", 0, 0, 'h' },
- { "version", 0, 0, 'v' },
- { 0, 0, 0, 0 }
- };
-
- if (argc < 3) {
- show_usage ();
- return 1;
- }
-
- my_name = strrchr(argv[0], '/');
- if (my_name == 0) {
- my_name = argv[0];
- } else {
- my_name ++;
- }
-
- while ((c = getopt_long (argc, argv, "uhv", long_options, &option_index)) >= 0) {
- switch (c) {
- case 'u':
- unset = 1;
- break;
- case 'h':
- show_usage ();
- return 1;
- break;
- case 'v':
- show_version ();
- return 1;
- break;
- default:
- show_usage ();
- return 1;
- break;
- }
- }
-
- portname = argv[optind++];
- alias = argv[optind];
-
- /* Open a client connection to the JACK server. Starting a
- * new server only to list its ports seems pointless, so we
- * specify JackNoStartServer. */
- //JOQ: need a new server name option
-
- client = jack_client_open ("lsp", JackNoStartServer, &status);
-
- if (client == NULL) {
- if (status & JackServerFailed) {
- fprintf (stderr, "JACK server not running\n");
- } else {
- fprintf (stderr, "jack_client_open() failed, "
- "status = 0x%2.0x\n", status);
- }
- return 1;
- }
-
- if ((port = jack_port_by_name (client, portname)) == 0) {
- fprintf (stderr, "No port named \"%s\"\n", portname);
- return 1;
- }
-
- if (!unset) {
- ret = jack_port_set_alias (port, alias);
- } else {
- ret = jack_port_unset_alias (port, alias);
- }
-
- jack_client_close (client);
-
- return ret;
-
-}
diff --git a/example-clients/alsa_in.c b/example-clients/alsa_in.c
deleted file mode 100644
index 99d27d13..00000000
--- a/example-clients/alsa_in.c
+++ /dev/null
@@ -1,846 +0,0 @@
-/** @file simple_client.c
- *
- * @brief This simple client demonstrates the basic features of JACK
- * as they would be used by many applications.
- */
-
-#include <stdio.h>
-#include <errno.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <string.h>
-#include <signal.h>
-
-#include <math.h>
-
-#include <jack/jack.h>
-#include <jack/jslist.h>
-#include "memops.h"
-
-#include "alsa/asoundlib.h"
-
-#include <samplerate.h>
-
-// Here are the lists of the jack ports...
-
-JSList *capture_ports = NULL;
-JSList *capture_srcs = NULL;
-JSList *playback_ports = NULL;
-JSList *playback_srcs = NULL;
-jack_client_t *client;
-
-snd_pcm_t *alsa_handle;
-
-int jack_sample_rate;
-int jack_buffer_size;
-
-int quit = 0;
-double resample_mean = 1.0;
-double static_resample_factor = 1.0;
-double resample_lower_limit = 0.25;
-double resample_upper_limit = 4.0;
-
-double *offset_array;
-double *window_array;
-int offset_differential_index = 0;
-
-double offset_integral = 0;
-
-// ------------------------------------------------------ commandline parameters
-
-int sample_rate = 0; /* stream rate */
-int num_channels = 2; /* count of channels */
-int period_size = 1024;
-int num_periods = 2;
-
-int target_delay = 0; /* the delay which the program should try to approach. */
-int max_diff = 0; /* the diff value, when a hard readpointer skip should occur */
-int catch_factor = 100000;
-int catch_factor2 = 10000;
-double pclamp = 15.0;
-double controlquant = 10000.0;
-int smooth_size = 256;
-int good_window=0;
-int verbose = 0;
-int instrument = 0;
-int samplerate_quality = 2;
-
-// Debug stuff:
-
-volatile float output_resampling_factor = 1.0;
-volatile int output_new_delay = 0;
-volatile float output_offset = 0.0;
-volatile float output_integral = 0.0;
-volatile float output_diff = 0.0;
-volatile int running_freewheel = 0;
-
-snd_pcm_uframes_t real_buffer_size;
-snd_pcm_uframes_t real_period_size;
-
-// buffers
-
-char *tmpbuf;
-char *outbuf;
-float *resampbuf;
-
-// format selection, and corresponding functions from memops in a nice set of structs.
-
-typedef struct alsa_format {
- snd_pcm_format_t format_id;
- size_t sample_size;
- void (*jack_to_soundcard) (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state);
- void (*soundcard_to_jack) (jack_default_audio_sample_t *dst, char *src, unsigned long nsamples, unsigned long src_skip);
- const char *name;
-} alsa_format_t;
-
-alsa_format_t formats[] = {
- { SND_PCM_FORMAT_FLOAT_LE, 4, sample_move_dS_floatLE, sample_move_floatLE_sSs, "float" },
- { SND_PCM_FORMAT_S32, 4, sample_move_d32u24_sS, sample_move_dS_s32u24, "32bit" },
- { SND_PCM_FORMAT_S24_3LE, 3, sample_move_d24_sS, sample_move_dS_s24, "24bit - real" },
- { SND_PCM_FORMAT_S24, 4, sample_move_d24_sS, sample_move_dS_s24, "24bit" },
- { SND_PCM_FORMAT_S16, 2, sample_move_d16_sS, sample_move_dS_s16, "16bit" }
-#ifdef __ANDROID__
- ,{ SND_PCM_FORMAT_S16_LE, 2, sample_move_d16_sS, sample_move_dS_s16, "16bit little-endian" }
-#endif
-};
-#define NUMFORMATS (sizeof(formats)/sizeof(formats[0]))
-int format=0;
-
-// Alsa stuff... i don't want to touch this bullshit in the next years.... please...
-
-static int xrun_recovery(snd_pcm_t *handle, int err) {
-// printf( "xrun !!!.... %d\n", err );
- if (err == -EPIPE) { /* under-run */
- err = snd_pcm_prepare(handle);
- if (err < 0)
- printf("Can't recover from underrun, prepare failed: %s\n", snd_strerror(err));
- return 0;
- } else if (err == -ESTRPIPE) {
- while ((err = snd_pcm_resume(handle)) == -EAGAIN)
- usleep(100); /* wait until the suspend flag is released */
- if (err < 0) {
- err = snd_pcm_prepare(handle);
- if (err < 0)
- printf("Can't recover from suspend, prepare failed: %s\n", snd_strerror(err));
- }
- return 0;
- }
- return err;
-}
-
-static int set_hwformat( snd_pcm_t *handle, snd_pcm_hw_params_t *params )
-{
-#ifdef __ANDROID__
- format = 5;
- snd_pcm_hw_params_set_format(handle, params, formats[format].format_id);
- return 0;
-#else
- int i;
- int err;
-
- for( i=0; i<NUMFORMATS; i++ ) {
- /* set the sample format */
- err = snd_pcm_hw_params_set_format(handle, params, formats[i].format_id);
- if (err == 0) {
- format = i;
- return 0;
- }
- }
-
- return err;
-#endif
-}
-
-static int set_hwparams(snd_pcm_t *handle, snd_pcm_hw_params_t *params, snd_pcm_access_t access, int rate, int channels, int period, int nperiods ) {
- int err, dir=0;
- unsigned int buffer_time;
- unsigned int period_time;
- unsigned int rrate;
- unsigned int rchannels;
-
- /* choose all parameters */
- err = snd_pcm_hw_params_any(handle, params);
- if (err < 0) {
- printf("Broken configuration for playback: no configurations available: %s\n", snd_strerror(err));
- return err;
- }
- /* set the interleaved read/write format */
- err = snd_pcm_hw_params_set_access(handle, params, access);
- if (err < 0) {
- printf("Access type not available for playback: %s\n", snd_strerror(err));
- return err;
- }
-
- /* set the sample format */
- err = set_hwformat(handle, params);
- if (err < 0) {
- printf("Sample format not available for playback: %s\n", snd_strerror(err));
- return err;
- }
- /* set the count of channels */
- rchannels = channels;
- err = snd_pcm_hw_params_set_channels_near(handle, params, &rchannels);
- if (err < 0) {
- printf("Channels count (%i) not available for record: %s\n", channels, snd_strerror(err));
- return err;
- }
- if (rchannels != channels) {
- printf("WARNING: channel count does not match (requested %d got %d)\n", channels, rchannels);
- num_channels = rchannels;
- }
- /* set the stream rate */
- rrate = rate;
- err = snd_pcm_hw_params_set_rate_near(handle, params, &rrate, 0);
- if (err < 0) {
- printf("Rate %iHz not available for playback: %s\n", rate, snd_strerror(err));
- return err;
- }
- if (rrate != rate) {
- printf("WARNING: Rate doesn't match (requested %iHz, get %iHz)\n", rate, rrate);
- sample_rate = rrate;
- }
- /* set the buffer time */
-
- buffer_time = 1000000*(uint64_t)period*nperiods/rate;
- err = snd_pcm_hw_params_set_buffer_time_near(handle, params, &buffer_time, &dir);
- if (err < 0) {
- printf("Unable to set buffer time %i for playback: %s\n", 1000000*period*nperiods/rate, snd_strerror(err));
- return err;
- }
- err = snd_pcm_hw_params_get_buffer_size( params, &real_buffer_size );
- if (err < 0) {
- printf("Unable to get buffer size back: %s\n", snd_strerror(err));
- return err;
- }
- if( real_buffer_size != nperiods * period ) {
- printf( "WARNING: buffer size does not match: (requested %d, got %d)\n", nperiods * period, (int) real_buffer_size );
- }
- /* set the period time */
- period_time = 1000000*(uint64_t)period/rate;
- err = snd_pcm_hw_params_set_period_time_near(handle, params, &period_time, &dir);
- if (err < 0) {
- printf("Unable to set period time %i for playback: %s\n", 1000000*period/rate, snd_strerror(err));
- return err;
- }
- err = snd_pcm_hw_params_get_period_size(params, &real_period_size, NULL );
- if (err < 0) {
- printf("Unable to get period size back: %s\n", snd_strerror(err));
- return err;
- }
- if( real_period_size != period ) {
- printf( "WARNING: period size does not match: (requested %i, got %i)\n", period, (int)real_period_size );
- }
- /* write the parameters to device */
- err = snd_pcm_hw_params(handle, params);
- if (err < 0) {
- printf("Unable to set hw params for playback: %s\n", snd_strerror(err));
- return err;
- }
- return 0;
-}
-
-static int set_swparams(snd_pcm_t *handle, snd_pcm_sw_params_t *swparams, int period) {
- int err;
-
- /* get the current swparams */
- err = snd_pcm_sw_params_current(handle, swparams);
- if (err < 0) {
- printf("Unable to determine current swparams for capture: %s\n", snd_strerror(err));
- return err;
- }
- /* start the transfer when the buffer is full */
- err = snd_pcm_sw_params_set_start_threshold(handle, swparams, period );
- if (err < 0) {
- printf("Unable to set start threshold mode for capture: %s\n", snd_strerror(err));
- return err;
- }
- err = snd_pcm_sw_params_set_stop_threshold(handle, swparams, -1 );
- if (err < 0) {
- printf("Unable to set start threshold mode for capture: %s\n", snd_strerror(err));
- return err;
- }
- /* allow the transfer when at least period_size samples can be processed */
- err = snd_pcm_sw_params_set_avail_min(handle, swparams, 2*period );
- if (err < 0) {
- printf("Unable to set avail min for capture: %s\n", snd_strerror(err));
- return err;
- }
- /* align all transfers to 1 sample */
- err = snd_pcm_sw_params_set_xfer_align(handle, swparams, 1);
- if (err < 0) {
- printf("Unable to set transfer align for capture: %s\n", snd_strerror(err));
- return err;
- }
- /* write the parameters to the playback device */
- err = snd_pcm_sw_params(handle, swparams);
- if (err < 0) {
- printf("Unable to set sw params for capture: %s\n", snd_strerror(err));
- return err;
- }
- return 0;
-}
-
-// ok... i only need this function to communicate with the alsa bloat api...
-
-static snd_pcm_t *open_audiofd( char *device_name, int capture, int rate, int channels, int period, int nperiods ) {
- int err;
- snd_pcm_t *handle;
- snd_pcm_hw_params_t *hwparams;
- snd_pcm_sw_params_t *swparams;
-
- snd_pcm_hw_params_alloca(&hwparams);
- snd_pcm_sw_params_alloca(&swparams);
-
- if ((err = snd_pcm_open(&(handle), device_name, capture ? SND_PCM_STREAM_CAPTURE : SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK )) < 0) {
- printf("Capture open error: %s\n", snd_strerror(err));
- return NULL;
- }
-
- if ((err = set_hwparams(handle, hwparams,SND_PCM_ACCESS_RW_INTERLEAVED, rate, channels, period, nperiods )) < 0) {
- printf("Setting of hwparams failed: %s\n", snd_strerror(err));
- return NULL;
- }
- if ((err = set_swparams(handle, swparams, period)) < 0) {
- printf("Setting of swparams failed: %s\n", snd_strerror(err));
- return NULL;
- }
-
- snd_pcm_start( handle );
- snd_pcm_wait( handle, 200 );
-
- return handle;
-}
-
-double hann( double x )
-{
- return 0.5 * (1.0 - cos( 2*M_PI * x ) );
-}
-
-/**
- * The freewheel callback.
- */
-void freewheel (int starting, void* arg) {
- running_freewheel = starting;
-}
-
-/**
- * The process callback for this JACK application.
- * It is called by JACK at the appropriate times.
- */
-int process (jack_nframes_t nframes, void *arg) {
-
- if (running_freewheel) {
- JSList *node = capture_ports;
-
- while ( node != NULL)
- {
- jack_port_t *port = (jack_port_t *) node->data;
- float *buf = jack_port_get_buffer (port, nframes);
-
- memset(buf, 0, sizeof(float)*nframes);
-
- node = jack_slist_next (node);
- }
-
- return 0;
- }
-
- int rlen;
- int err;
- snd_pcm_sframes_t delay = target_delay;
- int put_back_samples=0;
- int i;
-
- delay = snd_pcm_avail( alsa_handle );
-
- delay -= round( jack_frames_since_cycle_start( client ) / static_resample_factor );
- // Do it the hard way.
- // this is for compensating xruns etc...
-
- if( delay > (target_delay+max_diff) ) {
-
- output_new_delay = (int) delay;
-
- while ((delay-target_delay) > 0) {
- snd_pcm_uframes_t to_read = ((delay-target_delay) > 512) ? 512 : (delay-target_delay);
- snd_pcm_readi( alsa_handle, tmpbuf, to_read );
- delay -= to_read;
- }
-
- delay = target_delay;
-
- // Set the resample_rate... we need to adjust the offset integral, to do this.
- // first look at the PI controller, this code is just a special case, which should never execute once
- // everything is swung in.
- offset_integral = - (resample_mean - static_resample_factor) * catch_factor * catch_factor2;
- // Also clear the array. we are beginning a new control cycle.
- for( i=0; i<smooth_size; i++ )
- offset_array[i] = 0.0;
- }
- if( delay < (target_delay-max_diff) ) {
- snd_pcm_rewind( alsa_handle, target_delay - delay );
- output_new_delay = (int) delay;
- delay = target_delay;
-
- // Set the resample_rate... we need to adjust the offset integral, to do this.
- offset_integral = - (resample_mean - static_resample_factor) * catch_factor * catch_factor2;
- // Also clear the array. we are beginning a new control cycle.
- for( i=0; i<smooth_size; i++ )
- offset_array[i] = 0.0;
- }
- /* ok... now we should have target_delay +- max_diff on the alsa side.
- *
- * calculate the number of frames, we want to get.
- */
-
- double offset = delay - target_delay;
-
- // Save offset.
- offset_array[(offset_differential_index++)% smooth_size ] = offset;
-
- // Build the mean of the windowed offset array
- // basically fir lowpassing.
- double smooth_offset = 0.0;
- for( i=0; i<smooth_size; i++ )
- smooth_offset +=
- offset_array[ (i + offset_differential_index-1) % smooth_size] * window_array[i];
- smooth_offset /= (double) smooth_size;
-
- // this is the integral of the smoothed_offset
- offset_integral += smooth_offset;
-
- // Clamp offset.
- // the smooth offset still contains unwanted noise
- // which would go straight onto the resample coeff.
- // it only used in the P component and the I component is used for the fine tuning anyways.
- if( fabs( smooth_offset ) < pclamp )
- smooth_offset = 0.0;
-
- // ok. now this is the PI controller.
- // u(t) = K * ( e(t) + 1/T \int e(t') dt' )
- // K = 1/catch_factor and T = catch_factor2
- double current_resample_factor = static_resample_factor - smooth_offset / (double) catch_factor - offset_integral / (double) catch_factor / (double)catch_factor2;
-
- // now quantize this value around resample_mean, so that the noise which is in the integral component doesn't hurt.
- current_resample_factor = floor( (current_resample_factor - resample_mean) * controlquant + 0.5 ) / controlquant + resample_mean;
-
- // Output "instrumentatio" gonna change that to real instrumentation in a few.
- output_resampling_factor = (float) current_resample_factor;
- output_diff = (float) smooth_offset;
- output_integral = (float) offset_integral;
- output_offset = (float) offset;
-
- // Clamp a bit.
- if( current_resample_factor < resample_lower_limit ) current_resample_factor = resample_lower_limit;
- if( current_resample_factor > resample_upper_limit ) current_resample_factor = resample_upper_limit;
-
- // Now Calculate how many samples we need.
- rlen = ceil( ((double)nframes) / current_resample_factor )+2;
- assert( rlen > 2 );
-
- // Calculate resample_mean so we can init ourselves to saner values.
- resample_mean = 0.9999 * resample_mean + 0.0001 * current_resample_factor;
-
- // get the data...
-again:
- err = snd_pcm_readi(alsa_handle, outbuf, rlen);
- if( err < 0 ) {
- printf( "err = %d\n", err );
- if (xrun_recovery(alsa_handle, err) < 0) {
- //printf("Write error: %s\n", snd_strerror(err));
- //exit(EXIT_FAILURE);
- }
- goto again;
- }
- if( err != rlen ) {
- //printf( "read = %d\n", rlen );
- }
-
- /*
- * render jack ports to the outbuf...
- */
-
- int chn = 0;
- JSList *node = capture_ports;
- JSList *src_node = capture_srcs;
- SRC_DATA src;
-
- while ( node != NULL)
- {
- jack_port_t *port = (jack_port_t *) node->data;
- float *buf = jack_port_get_buffer (port, nframes);
-
- SRC_STATE *src_state = src_node->data;
-
- formats[format].soundcard_to_jack( resampbuf, outbuf + format[formats].sample_size * chn, rlen, num_channels*format[formats].sample_size );
-
- src.data_in = resampbuf;
- src.input_frames = rlen;
-
- src.data_out = buf;
- src.output_frames = nframes;
- src.end_of_input = 0;
-
- src.src_ratio = current_resample_factor;
-
- src_process( src_state, &src );
-
- put_back_samples = rlen-src.input_frames_used;
-
- src_node = jack_slist_next (src_node);
- node = jack_slist_next (node);
- chn++;
- }
-
- // Put back the samples libsamplerate did not consume.
- //printf( "putback = %d\n", put_back_samples );
- snd_pcm_rewind( alsa_handle, put_back_samples );
-
- return 0;
-}
-
-/**
- * the latency callback.
- * sets up the latencies on the ports.
- */
-
-void
-latency_cb (jack_latency_callback_mode_t mode, void *arg)
-{
- jack_latency_range_t range;
- JSList *node;
-
- range.min = range.max = round(target_delay * static_resample_factor);
-
- if (mode == JackCaptureLatency) {
- for (node = capture_ports; node; node = jack_slist_next (node)) {
- jack_port_t *port = node->data;
- jack_port_set_latency_range (port, mode, &range);
- }
- } else {
- for (node = playback_ports; node; node = jack_slist_next (node)) {
- jack_port_t *port = node->data;
- jack_port_set_latency_range (port, mode, &range);
- }
- }
-}
-
-
-/**
- * Allocate the necessary jack ports...
- */
-
-void alloc_ports( int n_capture, int n_playback ) {
-
- int port_flags = JackPortIsOutput;
- int chn;
- jack_port_t *port;
- char buf[32];
-
- capture_ports = NULL;
- for (chn = 0; chn < n_capture; chn++)
- {
- snprintf (buf, sizeof(buf) - 1, "capture_%u", chn+1);
-
- port = jack_port_register (client, buf,
- JACK_DEFAULT_AUDIO_TYPE,
- port_flags, 0);
-
- if (!port)
- {
- printf( "jacknet_client: cannot register port for %s", buf);
- break;
- }
-
- capture_srcs = jack_slist_append( capture_srcs, src_new( 4-samplerate_quality, 1, NULL ) );
- capture_ports = jack_slist_append (capture_ports, port);
- }
-
- port_flags = JackPortIsInput;
-
- playback_ports = NULL;
- for (chn = 0; chn < n_playback; chn++)
- {
- snprintf (buf, sizeof(buf) - 1, "playback_%u", chn+1);
-
- port = jack_port_register (client, buf,
- JACK_DEFAULT_AUDIO_TYPE,
- port_flags, 0);
-
- if (!port)
- {
- printf( "jacknet_client: cannot register port for %s", buf);
- break;
- }
-
- playback_srcs = jack_slist_append( playback_srcs, src_new( 4-samplerate_quality, 1, NULL ) );
- playback_ports = jack_slist_append (playback_ports, port);
- }
-}
-
-/**
- * This is the shutdown callback for this JACK application.
- * It is called by JACK if the server ever shuts down or
- * decides to disconnect the client.
- */
-
-void jack_shutdown (void *arg) {
-
- exit (1);
-}
-
-/**
- * be user friendly.
- * be user friendly.
- * be user friendly.
- */
-
-void printUsage() {
-fprintf(stderr, "usage: alsa_out [options]\n"
- "\n"
- " -j <jack name> - client name\n"
- " -S <server name> - server to connect\n"
- " -d <alsa_device> \n"
- " -c <channels> \n"
- " -p <period_size> \n"
- " -n <num_period> \n"
- " -r <sample_rate> \n"
- " -q <sample_rate quality [0..4]\n"
- " -m <max_diff> \n"
- " -t <target_delay> \n"
- " -i turns on instrumentation\n"
- " -v turns on printouts\n"
- "\n");
-}
-
-
-/**
- * the main function....
- */
-
-void
-sigterm_handler( int signal )
-{
- quit = 1;
-}
-
-
-int main (int argc, char *argv[]) {
- char jack_name[30] = "alsa_in";
- char alsa_device[30] = "hw:0";
- char *server_name = NULL;
- int jack_opts = 0;
-
- extern char *optarg;
- extern int optind, optopt;
- int errflg=0;
- int c;
-
- while ((c = getopt(argc, argv, "ivj:r:c:p:n:d:q:m:t:f:F:C:Q:s:S:")) != -1) {
- switch(c) {
- case 'j':
- strcpy(jack_name,optarg);
- break;
- case 'r':
- sample_rate = atoi(optarg);
- break;
- case 'c':
- num_channels = atoi(optarg);
- break;
- case 'p':
- period_size = atoi(optarg);
- break;
- case 'n':
- num_periods = atoi(optarg);
- break;
- case 'd':
- strcpy(alsa_device,optarg);
- break;
- case 't':
- target_delay = atoi(optarg);
- break;
- case 'q':
- samplerate_quality = atoi(optarg);
- break;
- case 'm':
- max_diff = atoi(optarg);
- break;
- case 'f':
- catch_factor = atoi(optarg);
- break;
- case 'F':
- catch_factor2 = atoi(optarg);
- break;
- case 'C':
- pclamp = (double) atoi(optarg);
- break;
- case 'Q':
- controlquant = (double) atoi(optarg);
- break;
- case 'v':
- verbose = 1;
- break;
- case 'i':
- instrument = 1;
- break;
- case 's':
- smooth_size = atoi(optarg);
- break;
- case 'S':
- server_name = optarg;
- jack_opts |= JackServerName;
- break;
- case ':':
- fprintf(stderr,
- "Option -%c requires an operand\n", optopt);
- errflg++;
- break;
- case '?':
- fprintf(stderr,
- "Unrecognized option: -%c\n", optopt);
- errflg++;
- }
- }
- if (errflg) {
- printUsage();
- exit(2);
- }
-
- if( (samplerate_quality < 0) || (samplerate_quality > 4) ) {
- fprintf (stderr, "invalid samplerate quality\n");
- return 1;
- }
- if ((client = jack_client_open (jack_name, jack_opts, NULL, server_name)) == 0) {
- fprintf (stderr, "jack server not running?\n");
- return 1;
- }
-
- /* tell the JACK server to call `process()' whenever
- there is work to be done.
- */
-
- jack_set_process_callback (client, process, 0);
-
- /* tell the JACK server to call `freewheel()' whenever
- freewheel mode changes.
- */
-
- jack_set_freewheel_callback (client, freewheel, 0);
-
- /* tell the JACK server to call `jack_shutdown()' if
- it ever shuts down, either entirely, or if it
- just decides to stop calling us.
- */
-
- jack_on_shutdown (client, jack_shutdown, 0);
-
- if (jack_set_latency_callback)
- jack_set_latency_callback (client, latency_cb, 0);
-
- // get jack sample_rate
-
- jack_sample_rate = jack_get_sample_rate( client );
-
- if( !sample_rate )
- sample_rate = jack_sample_rate;
-
- // now open the alsa fd...
- alsa_handle = open_audiofd( alsa_device, 1, sample_rate, num_channels, period_size, num_periods);
- if( alsa_handle == 0 )
- exit(20);
-
- printf( "selected sample format: %s\n", formats[format].name );
-
- static_resample_factor = (double) jack_sample_rate / (double) sample_rate;
- resample_lower_limit = static_resample_factor * 0.25;
- resample_upper_limit = static_resample_factor * 4.0;
- resample_mean = static_resample_factor;
-
- offset_array = malloc( sizeof(double) * smooth_size );
- if( offset_array == NULL ) {
- fprintf( stderr, "no memory for offset_array !!!\n" );
- exit(20);
- }
- window_array = malloc( sizeof(double) * smooth_size );
- if( window_array == NULL ) {
- fprintf( stderr, "no memory for window_array !!!\n" );
- exit(20);
- }
- int i;
- for( i=0; i<smooth_size; i++ ) {
- offset_array[i] = 0.0;
- window_array[i] = hann( (double) i / ((double) smooth_size - 1.0) );
- }
-
- jack_buffer_size = jack_get_buffer_size( client );
- // Setup target delay and max_diff for the normal user, who does not play with them...
- if( !target_delay )
- target_delay = (num_periods*period_size / 2) + jack_buffer_size/2;
-
- if( !max_diff )
- max_diff = num_periods*period_size - target_delay ;
-
- if( max_diff > target_delay ) {
- fprintf( stderr, "target_delay (%d) can not be smaller than max_diff(%d)\n", target_delay, max_diff );
- exit(20);
- }
- if( (target_delay+max_diff) > (num_periods*period_size) ) {
- fprintf( stderr, "target_delay+max_diff (%d) can not be bigger than buffersize(%d)\n", target_delay+max_diff, num_periods*period_size );
- exit(20);
- }
- // alloc input ports, which are blasted out to alsa...
- alloc_ports( num_channels, 0 );
-
- outbuf = malloc( num_periods * period_size * formats[format].sample_size * num_channels );
- resampbuf = malloc( num_periods * period_size * sizeof( float ) );
- tmpbuf = malloc( 512 * formats[format].sample_size * num_channels );
-
- if ((outbuf == NULL) || (resampbuf == NULL) || (tmpbuf == NULL))
- {
- fprintf( stderr, "no memory for buffers.\n" );
- exit(20);
- }
-
- memset( tmpbuf, 0, 512 * formats[format].sample_size * num_channels);
-
- /* tell the JACK server that we are ready to roll */
-
- if (jack_activate (client)) {
- fprintf (stderr, "cannot activate client");
- return 1;
- }
-
- signal( SIGTERM, sigterm_handler );
- signal( SIGINT, sigterm_handler );
-
- if( verbose ) {
- while(!quit) {
- usleep(500000);
- if( output_new_delay ) {
- printf( "delay = %d\n", output_new_delay );
- output_new_delay = 0;
- }
- printf( "res: %f, \tdiff = %f, \toffset = %f \n", output_resampling_factor, output_diff, output_offset );
- }
- } else if( instrument ) {
- printf( "# n\tresamp\tdiff\toffseti\tintegral\n");
- int n=0;
- while(!quit) {
- usleep(1000);
- printf( "%d\t%f\t%f\t%f\t%f\n", n++, output_resampling_factor, output_diff, output_offset, output_integral );
- }
- } else {
- while(!quit)
- {
- usleep(500000);
- if( output_new_delay ) {
- printf( "delay = %d\n", output_new_delay );
- output_new_delay = 0;
- }
- }
- }
-
- jack_deactivate( client );
- jack_client_close (client);
- exit (0);
-}
diff --git a/example-clients/alsa_out.c b/example-clients/alsa_out.c
deleted file mode 100644
index 0c9a8b26..00000000
--- a/example-clients/alsa_out.c
+++ /dev/null
@@ -1,848 +0,0 @@
-/** @file simple_client.c
- *
- * @brief This simple client demonstrates the basic features of JACK
- * as they would be used by many applications.
- */
-
-#include <alloca.h>
-#include <stdio.h>
-#include <errno.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <string.h>
-#include <signal.h>
-
-#include <math.h>
-
-#include <jack/jack.h>
-#include <jack/jslist.h>
-#include "memops.h"
-
-#include "alsa/asoundlib.h"
-
-#include <samplerate.h>
-
-// Here are the lists of the jack ports...
-
-JSList *capture_ports = NULL;
-JSList *capture_srcs = NULL;
-JSList *playback_ports = NULL;
-JSList *playback_srcs = NULL;
-jack_client_t *client;
-
-snd_pcm_t *alsa_handle;
-
-int jack_sample_rate;
-int jack_buffer_size;
-
-int quit = 0;
-double resample_mean = 1.0;
-double static_resample_factor = 1.0;
-double resample_lower_limit = 0.25;
-double resample_upper_limit = 4.0;
-
-double *offset_array;
-double *window_array;
-int offset_differential_index = 0;
-
-double offset_integral = 0;
-
-// ------------------------------------------------------ commandline parameters
-
-int sample_rate = 0; /* stream rate */
-int num_channels = 2; /* count of channels */
-int period_size = 1024;
-int num_periods = 2;
-
-int target_delay = 0; /* the delay which the program should try to approach. */
-int max_diff = 0; /* the diff value, when a hard readpointer skip should occur */
-int catch_factor = 100000;
-int catch_factor2 = 10000;
-double pclamp = 15.0;
-double controlquant = 10000.0;
-int smooth_size = 256;
-int good_window=0;
-int verbose = 0;
-int instrument = 0;
-int samplerate_quality = 2;
-
-// Debug stuff:
-
-volatile float output_resampling_factor = 1.0;
-volatile int output_new_delay = 0;
-volatile float output_offset = 0.0;
-volatile float output_integral = 0.0;
-volatile float output_diff = 0.0;
-volatile int running_freewheel = 0;
-
-snd_pcm_uframes_t real_buffer_size;
-snd_pcm_uframes_t real_period_size;
-
-// buffers
-
-char *tmpbuf;
-char *outbuf;
-float *resampbuf;
-
-// format selection, and corresponding functions from memops in a nice set of structs.
-
-typedef struct alsa_format {
- snd_pcm_format_t format_id;
- size_t sample_size;
- void (*jack_to_soundcard) (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state);
- void (*soundcard_to_jack) (jack_default_audio_sample_t *dst, char *src, unsigned long nsamples, unsigned long src_skip);
- const char *name;
-} alsa_format_t;
-
-alsa_format_t formats[] = {
- { SND_PCM_FORMAT_FLOAT_LE, 4, sample_move_dS_floatLE, sample_move_floatLE_sSs, "float" },
- { SND_PCM_FORMAT_S32, 4, sample_move_d32u24_sS, sample_move_dS_s32u24, "32bit" },
- { SND_PCM_FORMAT_S24_3LE, 3, sample_move_d24_sS, sample_move_dS_s24, "24bit - real" },
- { SND_PCM_FORMAT_S24, 4, sample_move_d24_sS, sample_move_dS_s24, "24bit" },
- { SND_PCM_FORMAT_S16, 2, sample_move_d16_sS, sample_move_dS_s16, "16bit" }
-#ifdef __ANDROID__
- ,{ SND_PCM_FORMAT_S16_LE, 2, sample_move_d16_sS, sample_move_dS_s16, "16bit little-endian" }
-#endif
-};
-#define NUMFORMATS (sizeof(formats)/sizeof(formats[0]))
-int format=0;
-
-// Alsa stuff... i don't want to touch this bullshit in the next years.... please...
-
-static int xrun_recovery(snd_pcm_t *handle, int err) {
-// printf( "xrun !!!.... %d\n", err );
- if (err == -EPIPE) { /* under-run */
- err = snd_pcm_prepare(handle);
- if (err < 0)
- printf("Can't recovery from underrun, prepare failed: %s\n", snd_strerror(err));
- return 0;
- } else if (err == -ESTRPIPE) {
- while ((err = snd_pcm_resume(handle)) == -EAGAIN)
- usleep(100); /* wait until the suspend flag is released */
- if (err < 0) {
- err = snd_pcm_prepare(handle);
- if (err < 0)
- printf("Can't recovery from suspend, prepare failed: %s\n", snd_strerror(err));
- }
- return 0;
- }
- return err;
-}
-
-static int set_hwformat( snd_pcm_t *handle, snd_pcm_hw_params_t *params )
-{
-#ifdef __ANDROID__
- format = 5;
- snd_pcm_hw_params_set_format(handle, params, formats[format].format_id);
- return 0;
-#else
- int i;
- int err;
-
- for( i=0; i<NUMFORMATS; i++ ) {
- /* set the sample format */
- err = snd_pcm_hw_params_set_format(handle, params, formats[i].format_id);
- if (err == 0) {
- format = i;
- return 0;
- }
- }
-
- return err;
-#endif
-}
-
-static int set_hwparams(snd_pcm_t *handle, snd_pcm_hw_params_t *params, snd_pcm_access_t access, int rate, int channels, int period, int nperiods ) {
- int err, dir=0;
- unsigned int buffer_time;
- unsigned int period_time;
- unsigned int rrate;
- unsigned int rchannels;
-
- /* choose all parameters */
- err = snd_pcm_hw_params_any(handle, params);
- if (err < 0) {
- printf("Broken configuration for playback: no configurations available: %s\n", snd_strerror(err));
- return err;
- }
- /* set the interleaved read/write format */
- err = snd_pcm_hw_params_set_access(handle, params, access);
- if (err < 0) {
- printf("Access type not available for playback: %s\n", snd_strerror(err));
- return err;
- }
-
- /* set the sample format */
- err = set_hwformat(handle, params);
- if (err < 0) {
- printf("Sample format not available for playback: %s\n", snd_strerror(err));
- return err;
- }
- /* set the count of channels */
- rchannels = channels;
- err = snd_pcm_hw_params_set_channels_near(handle, params, &rchannels);
- if (err < 0) {
- printf("Channels count (%i) not available for record: %s\n", channels, snd_strerror(err));
- return err;
- }
- if (rchannels != channels) {
- printf("WARNING: channel count does not match (requested %d got %d)\n", channels, rchannels);
- num_channels = rchannels;
- }
- /* set the stream rate */
- rrate = rate;
- err = snd_pcm_hw_params_set_rate_near(handle, params, &rrate, 0);
- if (err < 0) {
- printf("Rate %iHz not available for playback: %s\n", rate, snd_strerror(err));
- return err;
- }
- if (rrate != rate) {
- printf("Rate doesn't match (requested %iHz, get %iHz)\n", rate, rrate);
- return -EINVAL;
- }
- /* set the buffer time */
-
- buffer_time = 1000000*(uint64_t)period*nperiods/rate;
- err = snd_pcm_hw_params_set_buffer_time_near(handle, params, &buffer_time, &dir);
- if (err < 0) {
- printf("Unable to set buffer time %i for playback: %s\n", 1000000*period*nperiods/rate, snd_strerror(err));
- return err;
- }
- err = snd_pcm_hw_params_get_buffer_size( params, &real_buffer_size );
- if (err < 0) {
- printf("Unable to get buffer size back: %s\n", snd_strerror(err));
- return err;
- }
- if( real_buffer_size != nperiods * period ) {
- printf( "WARNING: buffer size does not match: (requested %d, got %d)\n", nperiods * period, (int) real_buffer_size );
- }
- /* set the period time */
- period_time = 1000000*(uint64_t)period/rate;
- err = snd_pcm_hw_params_set_period_time_near(handle, params, &period_time, &dir);
- if (err < 0) {
- printf("Unable to set period time %i for playback: %s\n", 1000000*period/rate, snd_strerror(err));
- return err;
- }
- err = snd_pcm_hw_params_get_period_size(params, &real_period_size, NULL );
- if (err < 0) {
- printf("Unable to get period size back: %s\n", snd_strerror(err));
- return err;
- }
- if( real_period_size != period ) {
- printf( "WARNING: period size does not match: (requested %i, got %i)\n", period, (int)real_period_size );
- }
- /* write the parameters to device */
- err = snd_pcm_hw_params(handle, params);
- if (err < 0) {
- printf("Unable to set hw params for playback: %s\n", snd_strerror(err));
- return err;
- }
- return 0;
-}
-
-static int set_swparams(snd_pcm_t *handle, snd_pcm_sw_params_t *swparams, int period, int nperiods) {
- int err;
-
- /* get the current swparams */
- err = snd_pcm_sw_params_current(handle, swparams);
- if (err < 0) {
- printf("Unable to determine current swparams for capture: %s\n", snd_strerror(err));
- return err;
- }
- /* start the transfer when the buffer is full */
- err = snd_pcm_sw_params_set_start_threshold(handle, swparams, period );
- if (err < 0) {
- printf("Unable to set start threshold mode for capture: %s\n", snd_strerror(err));
- return err;
- }
- err = snd_pcm_sw_params_set_stop_threshold(handle, swparams, -1 );
- if (err < 0) {
- printf("Unable to set start threshold mode for capture: %s\n", snd_strerror(err));
- return err;
- }
- /* allow the transfer when at least period_size samples can be processed */
- err = snd_pcm_sw_params_set_avail_min(handle, swparams, 1 );
- if (err < 0) {
- printf("Unable to set avail min for capture: %s\n", snd_strerror(err));
- return err;
- }
- /* align all transfers to 1 sample */
- err = snd_pcm_sw_params_set_xfer_align(handle, swparams, 1);
- if (err < 0) {
- printf("Unable to set transfer align for capture: %s\n", snd_strerror(err));
- return err;
- }
- /* write the parameters to the playback device */
- err = snd_pcm_sw_params(handle, swparams);
- if (err < 0) {
- printf("Unable to set sw params for capture: %s\n", snd_strerror(err));
- return err;
- }
- return 0;
-}
-
-// ok... i only need this function to communicate with the alsa bloat api...
-
-static snd_pcm_t *open_audiofd( char *device_name, int capture, int rate, int channels, int period, int nperiods ) {
- int err;
- snd_pcm_t *handle;
- snd_pcm_hw_params_t *hwparams;
- snd_pcm_sw_params_t *swparams;
-
- snd_pcm_hw_params_alloca(&hwparams);
- snd_pcm_sw_params_alloca(&swparams);
-
- if ((err = snd_pcm_open(&(handle), device_name, capture ? SND_PCM_STREAM_CAPTURE : SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK )) < 0) {
- printf("Capture open error: %s\n", snd_strerror(err));
- return NULL;
- }
-
- if ((err = set_hwparams(handle, hwparams,SND_PCM_ACCESS_RW_INTERLEAVED, rate, channels, period, nperiods )) < 0) {
- printf("Setting of hwparams failed: %s\n", snd_strerror(err));
- return NULL;
- }
- if ((err = set_swparams(handle, swparams, period, nperiods)) < 0) {
- printf("Setting of swparams failed: %s\n", snd_strerror(err));
- return NULL;
- }
-
- //snd_pcm_start( handle );
- //snd_pcm_wait( handle, 200 );
- int num_null_samples = nperiods * period * channels;
- char *tmp = alloca( num_null_samples * formats[format].sample_size );
- memset( tmp, 0, num_null_samples * formats[format].sample_size );
- snd_pcm_writei( handle, tmp, num_null_samples );
-
-
- return handle;
-}
-
-double hann( double x )
-{
- return 0.5 * (1.0 - cos( 2*M_PI * x ) );
-}
-
-/**
- * The freewheel callback.
- */
-void freewheel (int starting, void* arg) {
- running_freewheel = starting;
-}
-
-/**
- * The process callback for this JACK application.
- * It is called by JACK at the appropriate times.
- */
-int process (jack_nframes_t nframes, void *arg) {
-
- if (running_freewheel) {
- JSList *node = playback_ports;
-
- while ( node != NULL)
- {
- jack_port_t *port = (jack_port_t *) node->data;
- float *buf = jack_port_get_buffer (port, nframes);
-
- memset(buf, 0, sizeof(float)*nframes);
-
- node = jack_slist_next (node);
- }
-
- return 0;
- }
-
- int rlen;
- int err;
- snd_pcm_sframes_t delay = target_delay;
- int i;
-
- delay = (num_periods*period_size)-snd_pcm_avail( alsa_handle ) ;
-
- delay -= round( jack_frames_since_cycle_start( client ) * static_resample_factor );
- // Do it the hard way.
- // this is for compensating xruns etc...
-
- if( delay > (target_delay+max_diff) ) {
- snd_pcm_rewind( alsa_handle, delay - target_delay );
- output_new_delay = (int) delay;
-
- delay = target_delay;
-
- // Set the resample_rate... we need to adjust the offset integral, to do this.
- // first look at the PI controller, this code is just a special case, which should never execute once
- // everything is swung in.
- offset_integral = - (resample_mean - static_resample_factor) * catch_factor * catch_factor2;
- // Also clear the array. we are beginning a new control cycle.
- for( i=0; i<smooth_size; i++ )
- offset_array[i] = 0.0;
- }
- if( delay < (target_delay-max_diff) ) {
-
- output_new_delay = (int) delay;
-
- while ((target_delay-delay) > 0) {
- snd_pcm_uframes_t to_write = ((target_delay-delay) > 512) ? 512 : (target_delay-delay);
- snd_pcm_writei( alsa_handle, tmpbuf, to_write );
- delay += to_write;
- }
-
- delay = target_delay;
-
- // Set the resample_rate... we need to adjust the offset integral, to do this.
- offset_integral = - (resample_mean - static_resample_factor) * catch_factor * catch_factor2;
- // Also clear the array. we are beginning a new control cycle.
- for( i=0; i<smooth_size; i++ )
- offset_array[i] = 0.0;
- }
- /* ok... now we should have target_delay +- max_diff on the alsa side.
- *
- * calculate the number of frames, we want to get.
- */
-
- double offset = delay - target_delay;
-
- // Save offset.
- offset_array[(offset_differential_index++)% smooth_size ] = offset;
-
- // Build the mean of the windowed offset array
- // basically fir lowpassing.
- double smooth_offset = 0.0;
- for( i=0; i<smooth_size; i++ )
- smooth_offset +=
- offset_array[ (i + offset_differential_index-1) % smooth_size] * window_array[i];
- smooth_offset /= (double) smooth_size;
-
- // this is the integral of the smoothed_offset
- offset_integral += smooth_offset;
-
- // Clamp offset.
- // the smooth offset still contains unwanted noise
- // which would go straight onto the resample coeff.
- // it only used in the P component and the I component is used for the fine tuning anyways.
- if( fabs( smooth_offset ) < pclamp )
- smooth_offset = 0.0;
-
- // ok. now this is the PI controller.
- // u(t) = K * ( e(t) + 1/T \int e(t') dt' )
- // K = 1/catch_factor and T = catch_factor2
- double current_resample_factor = static_resample_factor - smooth_offset / (double) catch_factor - offset_integral / (double) catch_factor / (double)catch_factor2;
-
- // now quantize this value around resample_mean, so that the noise which is in the integral component doesn't hurt.
- current_resample_factor = floor( (current_resample_factor - resample_mean) * controlquant + 0.5 ) / controlquant + resample_mean;
-
- // Output "instrumentatio" gonna change that to real instrumentation in a few.
- output_resampling_factor = (float) current_resample_factor;
- output_diff = (float) smooth_offset;
- output_integral = (float) offset_integral;
- output_offset = (float) offset;
-
- // Clamp a bit.
- if( current_resample_factor < resample_lower_limit ) current_resample_factor = resample_lower_limit;
- if( current_resample_factor > resample_upper_limit ) current_resample_factor = resample_upper_limit;
-
- // Now Calculate how many samples we need.
- rlen = ceil( ((double)nframes) * current_resample_factor )+2;
- assert( rlen > 2 );
-
- // Calculate resample_mean so we can init ourselves to saner values.
- resample_mean = 0.9999 * resample_mean + 0.0001 * current_resample_factor;
- /*
- * now this should do it...
- */
-
- outbuf = alloca( rlen * formats[format].sample_size * num_channels );
-
- resampbuf = alloca( rlen * sizeof( float ) );
- /*
- * render jack ports to the outbuf...
- */
-
- int chn = 0;
- JSList *node = playback_ports;
- JSList *src_node = playback_srcs;
- SRC_DATA src;
-
- while ( node != NULL)
- {
- jack_port_t *port = (jack_port_t *) node->data;
- float *buf = jack_port_get_buffer (port, nframes);
-
- SRC_STATE *src_state = src_node->data;
-
- src.data_in = buf;
- src.input_frames = nframes;
-
- src.data_out = resampbuf;
- src.output_frames = rlen;
- src.end_of_input = 0;
-
- src.src_ratio = current_resample_factor;
-
- src_process( src_state, &src );
-
- formats[format].jack_to_soundcard( outbuf + format[formats].sample_size * chn, resampbuf, src.output_frames_gen, num_channels*format[formats].sample_size, NULL);
-
- src_node = jack_slist_next (src_node);
- node = jack_slist_next (node);
- chn++;
- }
-
- // now write the output...
-again:
- err = snd_pcm_writei(alsa_handle, outbuf, src.output_frames_gen);
- //err = snd_pcm_writei(alsa_handle, outbuf, src.output_frames_gen);
- if( err < 0 ) {
- printf( "err = %d\n", err );
- if (xrun_recovery(alsa_handle, err) < 0) {
- printf("Write error: %s\n", snd_strerror(err));
- exit(EXIT_FAILURE);
- }
- goto again;
- }
-
- return 0;
-}
-
-/**
- * the latency callback.
- * sets up the latencies on the ports.
- */
-
-void
-latency_cb (jack_latency_callback_mode_t mode, void *arg)
-{
- jack_latency_range_t range;
- JSList *node;
-
- range.min = range.max = round(target_delay / static_resample_factor);
-
- if (mode == JackCaptureLatency) {
- for (node = capture_ports; node; node = jack_slist_next (node)) {
- jack_port_t *port = node->data;
- jack_port_set_latency_range (port, mode, &range);
- }
- } else {
- for (node = playback_ports; node; node = jack_slist_next (node)) {
- jack_port_t *port = node->data;
- jack_port_set_latency_range (port, mode, &range);
- }
- }
-}
-
-
-/**
- * Allocate the necessary jack ports...
- */
-
-void alloc_ports( int n_capture, int n_playback ) {
-
- int port_flags = JackPortIsOutput | JackPortIsPhysical | JackPortIsTerminal;
- int chn;
- jack_port_t *port;
- char buf[32];
-
- capture_ports = NULL;
- for (chn = 0; chn < n_capture; chn++)
- {
- snprintf (buf, sizeof(buf) - 1, "capture_%u", chn+1);
-
- port = jack_port_register (client, buf,
- JACK_DEFAULT_AUDIO_TYPE,
- port_flags, 0);
-
- if (!port)
- {
- printf( "jacknet_client: cannot register port for %s", buf);
- break;
- }
-
- capture_srcs = jack_slist_append( capture_srcs, src_new( 4-samplerate_quality, 1, NULL ) );
- capture_ports = jack_slist_append (capture_ports, port);
- }
-
- port_flags = JackPortIsInput;
-
- playback_ports = NULL;
- for (chn = 0; chn < n_playback; chn++)
- {
- snprintf (buf, sizeof(buf) - 1, "playback_%u", chn+1);
-
- port = jack_port_register (client, buf,
- JACK_DEFAULT_AUDIO_TYPE,
- port_flags, 0);
-
- if (!port)
- {
- printf( "jacknet_client: cannot register port for %s", buf);
- break;
- }
-
- playback_srcs = jack_slist_append( playback_srcs, src_new( 4-samplerate_quality, 1, NULL ) );
- playback_ports = jack_slist_append (playback_ports, port);
- }
-}
-
-/**
- * This is the shutdown callback for this JACK application.
- * It is called by JACK if the server ever shuts down or
- * decides to disconnect the client.
- */
-
-void jack_shutdown (void *arg) {
-
- exit (1);
-}
-
-/**
- * be user friendly.
- * be user friendly.
- * be user friendly.
- */
-
-void printUsage() {
-fprintf(stderr, "usage: alsa_out [options]\n"
- "\n"
- " -j <jack name> - client name\n"
- " -d <alsa_device> \n"
- " -c <channels> \n"
- " -p <period_size> \n"
- " -n <num_period> \n"
- " -r <sample_rate> \n"
- " -q <sample_rate quality [0..4]\n"
- " -m <max_diff> \n"
- " -t <target_delay> \n"
- " -i turns on instrumentation\n"
- " -v turns on printouts\n"
- "\n");
-}
-
-
-/**
- * the main function....
- */
-
-void
-sigterm_handler( int signal )
-{
- quit = 1;
-}
-
-
-int main (int argc, char *argv[]) {
- char jack_name[30] = "alsa_out";
- char alsa_device[30] = "hw:0";
- int jack_opts = 0;
- char *server_name = NULL;
-
- extern char *optarg;
- extern int optind, optopt;
- int errflg=0;
- int c;
-
- while ((c = getopt(argc, argv, "ivj:r:c:p:n:d:q:m:t:f:F:C:Q:s:S:")) != -1) {
- switch(c) {
- case 'j':
- strcpy(jack_name,optarg);
- break;
- case 'r':
- sample_rate = atoi(optarg);
- break;
- case 'c':
- num_channels = atoi(optarg);
- break;
- case 'p':
- period_size = atoi(optarg);
- break;
- case 'n':
- num_periods = atoi(optarg);
- break;
- case 'd':
- strcpy(alsa_device,optarg);
- break;
- case 't':
- target_delay = atoi(optarg);
- break;
- case 'q':
- samplerate_quality = atoi(optarg);
- break;
- case 'm':
- max_diff = atoi(optarg);
- break;
- case 'f':
- catch_factor = atoi(optarg);
- break;
- case 'F':
- catch_factor2 = atoi(optarg);
- break;
- case 'C':
- pclamp = (double) atoi(optarg);
- break;
- case 'Q':
- controlquant = (double) atoi(optarg);
- break;
- case 'v':
- verbose = 1;
- break;
- case 'i':
- instrument = 1;
- break;
- case 's':
- smooth_size = atoi(optarg);
- break;
- case 'S':
- server_name = optarg;
- jack_opts |= JackServerName;
- break;
- case ':':
- fprintf(stderr,
- "Option -%c requires an operand\n", optopt);
- errflg++;
- break;
- case '?':
- fprintf(stderr,
- "Unrecognized option: -%c\n", optopt);
- errflg++;
- }
- }
- if (errflg) {
- printUsage();
- exit(2);
- }
-
- if( (samplerate_quality < 0) || (samplerate_quality > 4) ) {
- fprintf (stderr, "invalid samplerate quality\n");
- return 1;
- }
- if ((client = jack_client_open (jack_name, jack_opts, NULL, server_name)) == 0) {
- fprintf (stderr, "jack server not running?\n");
- return 1;
- }
-
- /* tell the JACK server to call `process()' whenever
- there is work to be done.
- */
-
- jack_set_process_callback (client, process, 0);
-
- /* tell the JACK server to call `freewheel()' whenever
- freewheel mode changes.
- */
-
- jack_set_freewheel_callback (client, freewheel, 0);
-
- /* tell the JACK server to call `jack_shutdown()' if
- it ever shuts down, either entirely, or if it
- just decides to stop calling us.
- */
-
- jack_on_shutdown (client, jack_shutdown, 0);
-
- if (jack_set_latency_callback)
- jack_set_latency_callback (client, latency_cb, 0);
-
- // get jack sample_rate
-
- jack_sample_rate = jack_get_sample_rate( client );
-
- if( !sample_rate )
- sample_rate = jack_sample_rate;
-
- static_resample_factor = (double) sample_rate / (double) jack_sample_rate;
- resample_lower_limit = static_resample_factor * 0.25;
- resample_upper_limit = static_resample_factor * 4.0;
- resample_mean = static_resample_factor;
-
- offset_array = malloc( sizeof(double) * smooth_size );
- if( offset_array == NULL ) {
- fprintf( stderr, "no memory for offset_array !!!\n" );
- exit(20);
- }
- window_array = malloc( sizeof(double) * smooth_size );
- if( window_array == NULL ) {
- fprintf( stderr, "no memory for window_array !!!\n" );
- exit(20);
- }
- int i;
- for( i=0; i<smooth_size; i++ ) {
- offset_array[i] = 0.0;
- window_array[i] = hann( (double) i / ((double) smooth_size - 1.0) );
- }
-
- jack_buffer_size = jack_get_buffer_size( client );
- // Setup target delay and max_diff for the normal user, who does not play with them...
- if( !target_delay )
- target_delay = (num_periods*period_size / 2) - jack_buffer_size/2;
-
- if( !max_diff )
- max_diff = target_delay;
-
- if( max_diff > target_delay ) {
- fprintf( stderr, "target_delay (%d) can not be smaller than max_diff(%d)\n", target_delay, max_diff );
- exit(20);
- }
- if( (target_delay+max_diff) > (num_periods*period_size) ) {
- fprintf( stderr, "target_delay+max_diff (%d) can not be bigger than buffersize(%d)\n", target_delay+max_diff, num_periods*period_size );
- exit(20);
- }
- // now open the alsa fd...
- alsa_handle = open_audiofd( alsa_device, 0, sample_rate, num_channels, period_size, num_periods);
- if( alsa_handle == 0 )
- exit(20);
-
- printf( "selected sample format: %s\n", formats[format].name );
-
- // alloc input ports, which are blasted out to alsa...
- alloc_ports( 0, num_channels );
-
- outbuf = malloc( num_periods * period_size * formats[format].sample_size * num_channels );
- resampbuf = malloc( num_periods * period_size * sizeof( float ) );
- tmpbuf = malloc( 512 * formats[format].sample_size * num_channels );
-
- if ((outbuf == NULL) || (resampbuf == NULL) || (tmpbuf == NULL))
- {
- fprintf( stderr, "no memory for buffers.\n" );
- exit(20);
- }
-
-
- /* tell the JACK server that we are ready to roll */
-
- if (jack_activate (client)) {
- fprintf (stderr, "cannot activate client");
- return 1;
- }
-
- signal( SIGTERM, sigterm_handler );
- signal( SIGINT, sigterm_handler );
-
- if( verbose ) {
- while(!quit) {
- usleep(500000);
- if( output_new_delay ) {
- printf( "delay = %d\n", output_new_delay );
- output_new_delay = 0;
- }
- printf( "res: %f, \tdiff = %f, \toffset = %f \n", output_resampling_factor, output_diff, output_offset );
- }
- } else if( instrument ) {
- printf( "# n\tresamp\tdiff\toffseti\tintegral\n");
- int n=0;
- while(!quit) {
- usleep(1000);
- printf( "%d\t%f\t%f\t%f\t%f\n", n++, output_resampling_factor, output_diff, output_offset, output_integral );
- }
- } else {
- while(!quit)
- {
- usleep(500000);
- if( output_new_delay ) {
- printf( "delay = %d\n", output_new_delay );
- output_new_delay = 0;
- }
- }
- }
-
- jack_deactivate( client );
- jack_client_close (client);
- exit (0);
-}
diff --git a/example-clients/bufsize.c b/example-clients/bufsize.c
deleted file mode 100644
index 87683595..00000000
--- a/example-clients/bufsize.c
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * bufsize.c -- change JACK buffer size.
- *
- * Copyright (C) 2003 Jack O'Quin.
- *
- * 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 <stdio.h>
-#include <errno.h>
-#include <unistd.h>
-#include <signal.h>
-#include <stdlib.h>
-#include <string.h>
-#include <jack/jack.h>
-#include <jack/transport.h>
-
-char *package; /* program name */
-jack_client_t *client;
-jack_nframes_t nframes;
-int just_print_bufsize=0;
-
-void jack_shutdown(void *arg)
-{
- fprintf(stderr, "JACK shut down, exiting ...\n");
- exit(1);
-}
-
-void signal_handler(int sig)
-{
- jack_client_close(client);
- fprintf(stderr, "signal received, exiting ...\n");
- exit(0);
-}
-
-void parse_arguments(int argc, char *argv[])
-{
- /* basename $0 */
- package = strrchr(argv[0], '/');
- if (package == 0)
- package = argv[0];
- else
- package++;
-
- if (argc==1) {
- just_print_bufsize = 1;
- return;
- }
- if (argc < 2) {
- fprintf(stderr, "usage: %s <bufsize>\n", package);
- exit(9);
- }
-
- if (strspn (argv[1], "0123456789") != strlen (argv[1])) {
- fprintf(stderr, "usage: %s <bufsize>\n", package);
- exit(8);
- }
-
- nframes = strtoul(argv[1], NULL, 0);
- if (errno == ERANGE) {
- fprintf(stderr, "%s: invalid buffer size: %s (range is 1-16384)\n",
- package, argv[1]);
- exit(2);
- }
- if (nframes < 1 || nframes > 16384) {
- fprintf(stderr, "%s: invalid buffer size: %s (range is 1-16384)\n",
- package, argv[1]);
- exit(3);
- }
-}
-
-void silent_function( const char *ignore )
-{
-}
-
-int main(int argc, char *argv[])
-{
- int rc;
- parse_arguments(argc, argv);
-
- if (just_print_bufsize)
- jack_set_info_function( silent_function );
-
- /* become a JACK client */
- if ((client = jack_client_open(package, JackNoStartServer, NULL)) == 0) {
- fprintf(stderr, "JACK server not running?\n");
- exit(1);
- }
-
-#ifndef WIN32
- signal(SIGQUIT, signal_handler);
- signal(SIGHUP, signal_handler);
-#endif
- signal(SIGTERM, signal_handler);
- signal(SIGINT, signal_handler);
-
- jack_on_shutdown(client, jack_shutdown, 0);
-
- if (just_print_bufsize) {
- fprintf(stdout, "%d\n", jack_get_buffer_size( client ) );
- rc = 0;
- }
- else
- {
- rc = jack_set_buffer_size(client, nframes);
- if (rc)
- fprintf(stderr, "jack_set_buffer_size(): %s\n", strerror(rc));
- }
- jack_client_close(client);
-
- return rc;
-}
diff --git a/example-clients/connect.c b/example-clients/connect.c
deleted file mode 100644
index fc43b5e9..00000000
--- a/example-clients/connect.c
+++ /dev/null
@@ -1,248 +0,0 @@
-/*
- Copyright (C) 2002 Jeremy Hall
-
- 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 <stdio.h>
-#include <errno.h>
-#ifndef WIN32
-#include <unistd.h>
-#endif
-#include <string.h>
-#include <stdlib.h>
-#include <getopt.h>
-
-#include <jack/jack.h>
-#include <jack/session.h>
-
-#define TRUE 1
-#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
-show_version (char *my_name)
-{
- //fprintf (stderr, "%s: JACK Audio Connection Kit version " VERSION "\n", my_name);
-}
-
-void
-show_usage (char *my_name)
-{
- show_version (my_name);
- fprintf (stderr, "\nusage: %s [options] port1 port2\n", my_name);
- fprintf (stderr, "Connects two JACK ports together.\n\n");
- fprintf (stderr, " -s, --server <name> Connect to the jack server named <name>\n");
- fprintf (stderr, " -v, --version Output version information and exit\n");
- fprintf (stderr, " -h, --help Display this help message\n\n");
- fprintf (stderr, "For more information see http://jackaudio.org/\n");
-}
-
-int
-main (int argc, char *argv[])
-{
- jack_client_t *client;
- jack_status_t status;
- char *server_name = NULL;
- int c;
- int option_index;
- jack_options_t options = JackNoStartServer;
- char *my_name = strrchr(argv[0], '/');
- jack_port_t *src_port = 0;
- jack_port_t *dst_port = 0;
- jack_port_t *port1 = 0;
- jack_port_t *port2 = 0;
- char portA[300];
- char portB[300];
- int use_uuid=0;
- int connecting, disconnecting;
- int port1_flags, port2_flags;
- int rc = 1;
-
- struct option long_options[] = {
- { "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) {
- switch (c) {
- case 's':
- server_name = (char *) malloc (sizeof (char) * (strlen(optarg) + 1));
- strcpy (server_name, optarg);
- options |= JackServerName;
- break;
- case 'u':
- use_uuid = 1;
- break;
- case 'h':
- show_usage (my_name);
- return 1;
- break;
- case 'v':
- show_version (my_name);
- return 1;
- break;
- default:
- show_usage (my_name);
- return 1;
- break;
- }
- }
-
- connecting = disconnecting = FALSE;
- if (my_name == 0) {
- my_name = argv[0];
- } else {
- my_name ++;
- }
-
- if (strstr(my_name, "disconnect")) {
- disconnecting = 1;
- } else if (strstr(my_name, "connect")) {
- connecting = 1;
- } else {
- fprintf(stderr, "ERROR! client should be called jack_connect or jack_disconnect. client is called %s\n", my_name);
- return 1;
- }
-
- if (argc < 3) {
- show_usage(my_name);
- return 1;
- }
-
- /* try to become a client of the JACK server */
-
- if ((client = jack_client_open (my_name, options, &status, server_name)) == 0) {
- fprintf (stderr, "jack server not running?\n");
- return 1;
- }
-
- jack_set_port_connect_callback(client, port_connect_callback, NULL);
-
- /* find the two ports */
-
- if( use_uuid ) {
- char *tmpname;
- char *clientname;
- char *portname;
- tmpname = strdup( argv[argc-1] );
- portname = strchr( tmpname, ':' );
- portname[0] = '\0';
- portname+=1;
- clientname = jack_get_client_name_by_uuid( client, tmpname );
- if( clientname ) {
-
- snprintf( portA, sizeof(portA), "%s:%s", clientname, portname );
- jack_free( clientname );
- } else {
- snprintf( portA, sizeof(portA), "%s", argv[argc-1] );
- }
- free( tmpname );
-
- tmpname = strdup( argv[argc-2] );
- portname = strchr( tmpname, ':' );
- portname[0] = '\0';
- portname+=1;
- clientname = jack_get_client_name_by_uuid( client, tmpname );
- if( clientname ) {
- snprintf( portB, sizeof(portB), "%s:%s", clientname, portname );
- jack_free( clientname );
- } else {
- snprintf( portB, sizeof(portB), "%s", argv[argc-2] );
- }
-
- free( tmpname );
-
- } else {
- snprintf( portA, sizeof(portA), "%s", argv[argc-1] );
- snprintf( portB, sizeof(portB), "%s", argv[argc-2] );
- }
- if ((port1 = jack_port_by_name(client, portA)) == 0) {
- fprintf (stderr, "ERROR %s not a valid port\n", portA);
- goto exit;
- }
- if ((port2 = jack_port_by_name(client, portB)) == 0) {
- fprintf (stderr, "ERROR %s not a valid port\n", portB);
- goto exit;
- }
-
- port1_flags = jack_port_flags (port1);
- port2_flags = jack_port_flags (port2);
-
- if (port1_flags & JackPortIsInput) {
- if (port2_flags & JackPortIsOutput) {
- src_port = port2;
- dst_port = port1;
- }
- } else {
- if (port2_flags & JackPortIsInput) {
- src_port = port1;
- dst_port = port2;
- }
- }
-
- if (!src_port || !dst_port) {
- fprintf (stderr, "arguments must include 1 input port and 1 output port\n");
- 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
- the client is activated (this may change in the future).
- */
-
- if (connecting) {
- if (jack_connect(client, jack_port_name(src_port), jack_port_name(dst_port))) {
- fprintf (stderr, "cannot connect client, already connected?\n");
- goto exit;
- }
- }
- if (disconnecting) {
- if (jack_disconnect(client, jack_port_name(src_port), jack_port_name(dst_port))) {
- fprintf (stderr, "cannot disconnect client, already disconnected?\n");
- 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 */
- rc = 0;
-
-exit:
- jack_client_close (client);
- exit (rc);
-}
diff --git a/example-clients/evmon.c b/example-clients/evmon.c
deleted file mode 100644
index fdd5b2a0..00000000
--- a/example-clients/evmon.c
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- Copyright (C) 2007 Paul Davis
-
- 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 <stdio.h>
-#include <errno.h>
-#ifndef WIN32
-#include <unistd.h>
-#endif
-#include <string.h>
-#include <signal.h>
-#include <stdlib.h>
-
-#include <jack/jack.h>
-#include <jack/metadata.h>
-#include <jack/uuid.h>
-
-jack_client_t *client;
-
-static void signal_handler(int sig)
-{
- jack_client_close(client);
- fprintf(stderr, "signal received, exiting ...\n");
- exit(0);
-}
-
-static void
-port_rename_callback (jack_port_id_t port, const char* old_name, const char* new_name, void* arg)
-{
- printf ("Port %d renamed from %s to %s\n", port, old_name, new_name);
-}
-
-static void
-port_callback (jack_port_id_t port, int yn, void* arg)
-{
- printf ("Port %d %s\n", port, (yn ? "registered" : "unregistered"));
-}
-
-static void
-connect_callback (jack_port_id_t a, jack_port_id_t b, int yn, void* arg)
-{
- printf ("Ports %d and %d %s\n", a, b, (yn ? "connected" : "disconnected"));
-}
-
-static void
-client_callback (const char* client, int yn, void* arg)
-{
- printf ("Client %s %s\n", client, (yn ? "registered" : "unregistered"));
-}
-
-static int
-graph_callback (void* arg)
-{
- printf ("Graph reordered\n");
- return 0;
-}
-
-static void
-propchange (jack_uuid_t subject, const char* key, jack_property_change_t change, void* arg)
-{
- char buf[JACK_UUID_STRING_SIZE];
- const char* action = "";
-
- switch (change) {
- case PropertyCreated:
- action = "created";
- break;
-
- case PropertyChanged:
- action = "changed";
- break;
-
- case PropertyDeleted:
- action = "deleted";
- break;
- }
-
- if (jack_uuid_empty (subject)) {
- printf ("All properties changed!\n");
- } else {
- jack_uuid_unparse (subject, buf);
-
- if (key) {
- printf ("key [%s] for %s %s\n", key, buf, action);
- } else {
- printf ("all keys for %s %s\n", buf, action);
- }
- }
-}
-
-int
-main (int argc, char *argv[])
-{
- jack_options_t options = JackNullOption;
- jack_status_t status;
-
- if ((client = jack_client_open ("event-monitor", options, &status, NULL)) == 0) {
- fprintf (stderr, "jack_client_open() failed, "
- "status = 0x%2.0x\n", status);
- if (status & JackServerFailed) {
- fprintf (stderr, "Unable to connect to JACK server\n");
- }
- return 1;
- }
-
- if (jack_set_port_registration_callback (client, port_callback, NULL)) {
- fprintf (stderr, "cannot set port registration callback\n");
- return 1;
- }
- if (jack_set_port_rename_callback (client, port_rename_callback, NULL)) {
- fprintf (stderr, "cannot set port registration callback\n");
- return 1;
- }
- if (jack_set_port_connect_callback (client, connect_callback, NULL)) {
- fprintf (stderr, "cannot set port connect callback\n");
- return 1;
- }
- if (jack_set_client_registration_callback (client, client_callback, NULL)) {
- fprintf (stderr, "cannot set client registration callback\n");
- return 1;
- }
- if (jack_set_graph_order_callback (client, graph_callback, NULL)) {
- fprintf (stderr, "cannot set graph order registration callback\n");
- return 1;
- }
- if (jack_set_property_change_callback (client, propchange, NULL)) {
- fprintf (stderr, "cannot set property change callback\n");
- return 1;
- }
- if (jack_activate (client)) {
- fprintf (stderr, "cannot activate client");
- return 1;
- }
-
-#ifndef WIN32
- signal(SIGINT, signal_handler);
- signal(SIGQUIT, signal_handler);
- signal(SIGHUP, signal_handler);
-#endif
- signal(SIGABRT, signal_handler);
- signal(SIGTERM, signal_handler);
-
-#ifdef WIN32
- Sleep(INFINITE);
-#else
- sleep (-1);
-#endif
- exit (0);
-}
-
diff --git a/example-clients/freewheel.c b/example-clients/freewheel.c
deleted file mode 100644
index 005b3bb8..00000000
--- a/example-clients/freewheel.c
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * freewheel - start/stop JACK "freewheeling" mode
- *
- * Copyright (C) 2003 Paul Davis.
- *
- * 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 <stdio.h>
-#include <errno.h>
-#include <unistd.h>
-#include <signal.h>
-#include <stdlib.h>
-#include <string.h>
-#include <jack/jack.h>
-#include <jack/transport.h>
-
-char *package; /* program name */
-jack_client_t *client;
-int onoff;
-
-static void jack_shutdown(void *arg)
-{
- fprintf(stderr, "JACK shut down, exiting ...\n");
- exit(1);
-}
-
-static void signal_handler(int sig)
-{
- jack_client_close(client);
- fprintf(stderr, "signal received, exiting ...\n");
- exit(0);
-}
-
-static void parse_arguments(int argc, char *argv[])
-{
- if (argc < 2) {
- fprintf(stderr, "usage: %s y|n\n", package);
- exit(9);
- }
-
- if (argv[1][0] == 'y' || argv[1][0] == 'Y' || argv[1][0] == '1') {
- onoff = 1;
- } else {
- onoff = 0;
- }
-}
-
-int
-main (int argc, char *argv[])
-{
- parse_arguments (argc, argv);
-
- /* become a JACK client */
- if ((client = jack_client_open ("freewheel", JackNullOption, NULL)) == 0) {
- fprintf (stderr, "JACK server not running?\n");
- exit(1);
- }
-
-#ifndef WIN32
- signal (SIGQUIT, signal_handler);
- signal (SIGHUP, signal_handler);
-#endif
- signal (SIGTERM, signal_handler);
- signal (SIGINT, signal_handler);
-
- jack_on_shutdown (client, jack_shutdown, 0);
-
- if (jack_set_freewheel (client, onoff)) {
- fprintf (stderr, "failed to reset freewheel mode\n");
- }
-
- jack_client_close(client);
- return 0;
-}
diff --git a/example-clients/ipload.c b/example-clients/ipload.c
deleted file mode 100644
index a5a47134..00000000
--- a/example-clients/ipload.c
+++ /dev/null
@@ -1,246 +0,0 @@
-/*
- 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 <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <signal.h>
-#ifndef WIN32
-#include <unistd.h>
-#endif
-#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 = "";
-char *server_name = NULL;
-int autoclose_opt = 0;
-int wait_opt = 0;
-volatile int idling = 1;
-
-static void
-signal_handler (int sig)
-{
- /* do nothing if internal client closed itself */
- if (idling == 0)
- return;
-
- jack_status_t status;
-
- fprintf (stderr, "signal received, unloading...");
- status = jack_internal_client_unload (client, intclient);
- if (status & JackFailure)
- fprintf (stderr, "(failed), status = 0x%2.0x\n", status);
- else
- fprintf (stderr, "(succeeded)\n");
- if (autoclose_opt)
- jack_deactivate(client);
- jack_client_close (client);
- exit (0);
-}
-
-static void
-registration_callback (const char *name, int reg, void *arg)
-{
- if (reg || strcmp(intclient_name, name))
- return;
-
- /* this will stop the wait loop and thus close this application. */
- idling = 0;
- return;
-
- /* unused */
- (void)arg;
-}
-
-static 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-a, --autoclose\t automatically close when intclient is unloaded\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"
- );
-}
-
-static int
-parse_args (int argc, char *argv[])
-{
- int c;
- int option_index = 0;
- char *short_options = "hai:s:w";
- struct option long_options[] = {
- { "help", 0, 0, 'h' },
- { "autoclose", 0, 0, 'a' },
- { "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 'a':
- autoclose_opt = 1;
- break;
- 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;
- }
- }
-
- /* autoclose makes no sense without wait */
- if (autoclose_opt && ! wait_opt)
- autoclose_opt = 0;
-
- 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[])
-{
- jack_status_t status;
- char* name;
-
- /* 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%2.0x\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);
- }
-
- /* 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, intclient = %d status = 0x%2.0x\n",
- load_name, (int)intclient, status);
- return 2;
- }
- 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);
-
- name = jack_get_internal_client_name(client, intclient);
- if (name) {
- printf("client name = %s\n", name);
- free(name);
- }
- fflush(stdout);
-
- if (autoclose_opt) {
- jack_set_client_registration_callback(client, registration_callback, NULL);
- jack_activate(client);
- }
-
- if (wait_opt) {
- /* define a signal handler to unload the client, then
- * wait for it to exit */
- #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
-
- while (idling) {
- #ifdef WIN32
- Sleep(1000);
- #else
- sleep (1);
- #endif
- }
- }
-
- if (autoclose_opt) {
- jack_deactivate(client);
- }
-
- jack_client_close(client);
- return 0;
-}
-
diff --git a/example-clients/ipunload.c b/example-clients/ipunload.c
deleted file mode 100644
index 2ce3d0c8..00000000
--- a/example-clients/ipunload.c
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- 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 <string.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <jack/jack.h>
-#include <jack/intclient.h>
-
-int
-main (int argc, char *argv[])
-{
- char *my_name;
- char *client_name;
- jack_client_t *client;
- jack_status_t status;
- jack_intclient_t intclient;
-
- /* validate args */
- if ((argc < 2) || (argc > 3)) {
- fprintf (stderr, "usage: %s client-name [ server-name ]]\n",
- argv[0]);
- return 1;
- }
-
- /* use `basename $0` for my own client name */
- my_name = strrchr(argv[0], '/');
- if (my_name == 0) {
- my_name = argv[0];
- } else {
- my_name++;
- }
-
- /* first, become a JACK client */
- if (argc > 2) {
- client = jack_client_open (my_name,
- (JackServerName|JackNoStartServer),
- &status, argv[2]);
- } else {
- client = jack_client_open (my_name, JackNoStartServer, &status);
- }
-
- if (client == NULL) {
- if (status & JackServerFailed) {
- fprintf (stderr, "JACK server not running.\n");
- } else {
- fprintf (stderr, "JACK open failed, "
- "status = 0x%2.0x\n", status);
- }
- exit (1);
- }
-
- /* then, get the internal client handle */
- client_name = argv[1];
- intclient = jack_internal_client_handle (client, client_name, &status);
- if (status & JackFailure) {
- fprintf (stderr, "client %s not found.\n", client_name);
- exit (2);
- }
-
- /* now, unload the internal client */
- status = jack_internal_client_unload (client, intclient);
- if (status & JackFailure) {
- if (status & JackNoSuchClient) {
- fprintf (stderr, "client %s is gone.\n",
- client_name);
- } else {
- fprintf (stderr, "could not unload %s, "
- "returns 0x%2.0x\n", client_name, status);
- }
- exit (3);
- } else {
- fprintf (stdout, "%s unloaded.\n", client_name);
- }
-
- jack_client_close(client);
- return 0;
-}
-
-
diff --git a/example-clients/jack_control b/example-clients/jack_control
deleted file mode 100755
index 1172cbcd..00000000
--- a/example-clients/jack_control
+++ /dev/null
@@ -1,403 +0,0 @@
-#!/usr/bin/python3
-
-from __future__ import print_function
-name_base = 'org.jackaudio'
-control_interface_name = name_base + '.JackControl'
-configure_interface_name = name_base + '.Configure'
-service_name = name_base + '.service'
-
-import sys
-import os
-from traceback import print_exc
-
-import dbus
-
-def bool_convert(str_value):
- if str_value.lower() == "false":
- return False
-
- if str_value.lower() == "off":
- return False
-
- if str_value.lower() == "no":
- return False
-
- if str_value == "0":
- return False
-
- if str_value.lower() == "(null)":
- return False
-
- return bool(str_value)
-
-def dbus_type_to_python_type(dbus_value):
- if type(dbus_value) == dbus.Boolean:
- return bool(dbus_value)
- if type(dbus_value) == dbus.Int32 or type(dbus_value) == dbus.UInt32:
- return int(dbus_value)
- return dbus_value
-
-def python_type_to_jackdbus_type(value, type_char):
- type_char = str(type_char)
-
- if type_char == "b":
- return bool_convert(value);
- elif type_char == "y":
- return dbus.Byte(ord(value));
- elif type_char == "i":
- return dbus.Int32(value)
- elif type_char == "u":
- return dbus.UInt32(value)
-
- return value
-
-def dbus_type_to_type_string(dbus_value):
- if type(dbus_value) == dbus.Boolean:
- return "bool"
- if type(dbus_value) == dbus.Int32:
- return "sint"
- if type(dbus_value) == dbus.UInt32:
- return "uint"
- if type(dbus_value) == dbus.Byte:
- return "char"
- if type(dbus_value) == dbus.String:
- return "str"
-
- return None # throw exception here?
-
-def dbus_typesig_to_type_string(type_char):
- type_char = str(type_char)
- if type_char == 'i':
- return "sint"
- if type_char == 'u':
- return "uint"
- if type_char == 'y':
- return "char"
- if type_char == 's':
- return "str"
- if type_char == 'b':
- return "bool"
-
- print('shit')
- return None # throw exception here?
-
-def get_parameters(iface, path):
- params = iface.GetParametersInfo(path)
-
- #print params
- for param in params:
- typestr = dbus_typesig_to_type_string(param[0])
- name = param[1]
- #print name
- descr = param[2]
- #print descr
- isset, default, value = iface.GetParameterValue(path + [name])
- #print typestr
- if bool(isset):
- isset = "set"
- else:
- isset = "notset"
- value = dbus_type_to_python_type(value)
- default = dbus_type_to_python_type(default)
-
- print("%20s: %s (%s:%s:%s:%s)" %(name, descr, typestr, isset, default, value))
-
-def print_help():
- print("Usage: %s [command] [command] ..." % os.path.basename(sys.argv[0]))
- print("Commands:")
- print(" exit - exit jack dbus service (stops jack server if currently running)")
- print(" help - print this help text")
- print(" status - check whether jack server is started, return value is 0 if running and 1 otherwise")
- print(" start - start jack server if not currently started")
- print(" stop - stop jack server if currently started")
- print(" sm - switch master to currently selected driver")
- print(" dl - get list of available drivers")
- print(" dg - get currently selected driver")
- print(" ds <driver> - select driver")
- print(" dp - get parameters of currently selected driver")
- print(" dpd <param> - get long description for driver parameter")
- print(" dps <param> <value> - set driver parameter")
- print(" dpr <param> - reset driver parameter to its default value")
- print(" asd <driver> - add slave driver")
- print(" rsd <driver> - remove slave driver")
- print(" il - get list of available internals")
- print(" ip <name> - get parameters of given internal")
- print(" ipd <name> <param> - get long description for internal parameter")
- print(" ips <name> <param> <value> - set internal parameter")
- print(" ipr <name> <param> - reset internal parameter to its default value")
- print(" iload <name> - load internal")
- print(" iunload <name> - unload internal")
- print(" ep - get engine parameters")
- print(" epd <param> - get long description for engine parameter")
- print(" eps <param> <value> - set engine parameter")
- print(" epr <param> - reset engine parameter to its default value")
-
-def maybe_print_param_constraint(iface, param):
- is_range, is_strict, is_fake, values = iface.GetParameterConstraint(param)
- if is_range:
- print()
- print(("allowed range: %s to %s (inclusive)" % (values[0][0], values[1][0])))
- elif len(values):
- print()
- if is_strict:
- print("allowed values:")
- else:
- print("suggested values:")
-
- max_len = 0
- for value in values:
- if len(str(value[0])) > max_len:
- max_len = len(str(value[0]))
- for value in values:
- print(("%*s'%s' - %s" % (1 + max_len - len(str(value[0])), "", str(value[0]), str(value[1]))))
-
-def main():
- if len(sys.argv) == 1 or sys.argv[1] in ["-h", "--help", "help"]:
- print_help()
- return 0
-
- bus = dbus.SessionBus()
-
- controller = bus.get_object(service_name, "/org/jackaudio/Controller")
- control_iface = dbus.Interface(controller, control_interface_name)
- configure_iface = dbus.Interface(controller, configure_interface_name)
-
- # check arguments
- index = 1
- while index < len(sys.argv):
- arg = sys.argv[index]
- index += 1
- try:
- if arg == "exit":
- print("--- exit")
- control_iface.Exit()
- elif arg == "status":
- print("--- status")
- if control_iface.IsStarted():
- print("started")
- return 0
- else:
- print("stopped")
- return 1
- elif arg == 'start':
- print("--- start")
- control_iface.StartServer()
- elif arg == 'stop':
- print("--- stop")
- control_iface.StopServer()
- elif arg == 'sm':
- print("--- switch master driver")
- control_iface.SwitchMaster()
- elif arg == 'ism':
- if control_iface.IsManuallyActivated():
- print("Manually activated")
- else:
- print("Automatically activated")
- elif arg == 'dl':
- print("--- drivers list")
- is_range, is_strict, is_fake_values, values = configure_iface.GetParameterConstraint(['engine', 'driver'])
- for value in values:
- print(value[1])
- elif arg == 'dg':
- print("--- get selected driver")
- isset, default, value = configure_iface.GetParameterValue(['engine', 'driver'])
- print(value)
- elif arg == 'ds':
- if index >= len(sys.argv):
- print("driver select command requires driver name argument")
- return 1
-
- arg = sys.argv[index]
- index += 1
-
- print("--- driver select \"%s\"" % arg)
- configure_iface.SetParameterValue(['engine', 'driver'], dbus.String(arg))
- elif arg == 'dp':
- print("--- get driver parameters (type:isset:default:value)")
- get_parameters(configure_iface, ['driver'])
- elif arg == 'dpd':
- if index >= len(sys.argv):
- print("get driver parameter long description command requires parameter name argument")
- return 1
-
- param = sys.argv[index]
- index += 1
-
- print("--- get driver parameter description (%s)" % param)
- type_char, name, short_descr, long_descr = configure_iface.GetParameterInfo(['driver', param])
- print(long_descr)
- maybe_print_param_constraint(configure_iface, ['driver', param])
- elif arg == 'dps':
- if index + 1 >= len(sys.argv):
- print("driver parameter set command requires parameter name and value arguments")
- return 1
-
- param = sys.argv[index]
- index += 1
- value = sys.argv[index]
- index += 1
-
- print("--- driver param set \"%s\" -> \"%s\"" % (param, value))
-
- type_char, name, short_descr, long_descr = configure_iface.GetParameterInfo(['driver', param])
- configure_iface.SetParameterValue(['driver', param], python_type_to_jackdbus_type(value, type_char))
- elif arg == 'dpr':
- if index >= len(sys.argv):
- print("driver parameter reset command requires parameter name argument")
- return 1
-
- param = sys.argv[index]
- index += 1
-
- print("--- driver param reset \"%s\"" % param)
- configure_iface.ResetParameterValue(['driver', param])
- elif arg == 'ep':
- print("--- get engine parameters (type:isset:default:value)")
- get_parameters(configure_iface, ['engine'])
- elif arg == 'epd':
- if index >= len(sys.argv):
- print("get engine parameter long description command requires parameter name argument")
- return 1
-
- param_name = sys.argv[index]
- index += 1
-
- print("--- get engine parameter description (%s)" % param_name)
-
- type_char, name, short_descr, long_descr = configure_iface.GetParameterInfo(['engine', param_name])
- print(long_descr)
- maybe_print_param_constraint(configure_iface, ['engine', param_name])
- elif arg == 'eps':
- if index + 1 >= len(sys.argv):
- print("engine parameter set command requires parameter name and value arguments")
- return 1
-
- param = sys.argv[index]
- index += 1
- value = sys.argv[index]
- index += 1
-
- print("--- engine param set \"%s\" -> \"%s\"" % (param, value))
-
- type_char, name, short_descr, long_descr = configure_iface.GetParameterInfo(['engine', param])
- configure_iface.SetParameterValue(['engine', param], python_type_to_jackdbus_type(value, type_char))
- elif arg == 'epr':
- if index >= len(sys.argv):
- print("engine parameter reset command requires parameter name")
- return 1
-
- param = sys.argv[index]
- index += 1
-
- print("--- engine param reset \"%s\"" % param)
-
- type_char, name, short_descr, long_descr = configure_iface.GetParameterInfo(['engine', param])
- configure_iface.ResetParameterValue(['engine', param])
- elif arg == 'il':
- print("--- internals list")
- is_leaf, internals = configure_iface.ReadContainer(['internals'])
- for internal in internals:
- print(internal)
- elif arg == 'ip':
- print("--- get internal parameters (type:isset:default:value)")
-
- if index >= len(sys.argv):
- print("internal parameters command requires internal name argument")
- return 1
-
- internal_name = sys.argv[index]
- index += 1
-
- get_parameters(configure_iface, ['internals', internal_name])
- elif arg == 'ipd':
- if index + 1 >= len(sys.argv):
- print("get internal parameter long description command requires internal and parameter name arguments")
- return 1
-
- name = sys.argv[index]
- index += 1
- param = sys.argv[index]
- index += 1
-
- print("--- get internal parameter description (%s)" % param)
- type_char, name, short_descr, long_descr = configure_iface.GetParameterInfo(['internals', name, param])
- print(long_descr)
- elif arg == 'ips':
- if index + 2 >= len(sys.argv):
- print("internal parameter set command requires internal, parameter name and value arguments")
- return 1
-
- internal_name = sys.argv[index]
- index += 1
- param = sys.argv[index]
- index += 1
- value = sys.argv[index]
- index += 1
-
- print("--- internal param set \"%s\" -> \"%s\"" % (param, value))
-
- type_char, name, short_descr, long_descr = configure_iface.GetParameterInfo(['internals', internal_name, param])
- configure_iface.SetParameterValue(['internals', internal_name, param], python_type_to_jackdbus_type(value, type_char))
- elif arg == 'ipr':
- if index + 1 >= len(sys.argv):
- print("reset internal parameter command requires internal and parameter name arguments")
- return 1
-
- internal_name = sys.argv[index]
- index += 1
- param = sys.argv[index]
- index += 1
-
- print("--- internal param reset \"%s\"" % param)
-
- configure_iface.ResetParameterValue(['internals', internal_name, param])
- elif arg == 'iload':
- print("--- load internal")
-
- if index >= len(sys.argv):
- print("load internal command requires internal name argument")
- return 1
-
- name = sys.argv[index]
- index += 1
- result = control_iface.LoadInternal(name)
- elif arg == 'iunload':
- print("--- unload internal")
-
- if index >= len(sys.argv):
- print("unload internal command requires internal name argument")
- return 1
-
- name = sys.argv[index]
- index += 1
- result = control_iface.UnloadInternal(name)
- elif arg == 'asd':
- print("--- add slave driver")
-
- if index >= len(sys.argv):
- print("add slave driver command requires driver name argument")
- return 1
-
- name = sys.argv[index]
- index += 1
- result = control_iface.AddSlaveDriver(name)
- elif arg == 'rsd':
- print("--- remove slave driver")
-
- if index >= len(sys.argv):
- print("remove slave driver command requires driver name argument")
- return 1
-
- name = sys.argv[index]
- index += 1
- result = control_iface.RemoveSlaveDriver(name)
- else:
- print("Unknown command '%s'" % arg)
- except dbus.DBusException as e:
- print("DBus exception: %s" % str(e))
- return 1
-
- return 0
-
-if __name__ == '__main__':
- sys.exit(main())
diff --git a/example-clients/lsp.c b/example-clients/lsp.c
deleted file mode 100644
index a1e3f1aa..00000000
--- a/example-clients/lsp.c
+++ /dev/null
@@ -1,291 +0,0 @@
-/*
- 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 <stdio.h>
-#include <stdlib.h>
-#ifndef WIN32
-#include <unistd.h>
-#endif
-#include <string.h>
-#include <getopt.h>
-#include <inttypes.h>
-
-#include <jack/jack.h>
-#include <jack/session.h>
-#include <jack/uuid.h>
-
-char * my_name;
-
-static void
-show_version (void)
-{
- //fprintf (stderr, "%s: JACK Audio Connection Kit version " VERSION "\n", my_name);
-}
-
-static void
-printf_name2uuid (jack_client_t* client, const char* pname)
-{
- char *port_component = strchr( pname, ':' );
- size_t csize = port_component - pname + 1;
- char client_component[csize];
- snprintf(client_component, csize, "%s", pname);
-
- char *uuid = jack_get_uuid_for_client_name(client, client_component);
- if (uuid) {
- printf("%s%s\n", uuid, port_component );
- } else {
- printf("%s\n",pname);
- }
- jack_free(uuid);
-}
-
-static void
-show_usage (void)
-{
- show_version ();
- fprintf (stderr, "\nUsage: %s [options] [filter string]\n", my_name);
- fprintf (stderr, "List active Jack ports, and optionally display extra information.\n");
- fprintf (stderr, "Optionally filter ports which match ALL strings provided after any options.\n\n");
- fprintf (stderr, "Display options:\n");
- fprintf (stderr, " -s, --server <name> Connect to the jack server named <name>\n");
- fprintf (stderr, " -A, --aliases List aliases for each port\n");
- fprintf (stderr, " -c, --connections List connections to/from each port\n");
- fprintf (stderr, " -l, --port-latency Display per-port latency in frames at each port\n");
- fprintf (stderr, " -L, --total-latency Display total latency in frames at each port\n");
- fprintf (stderr, " -p, --properties Display port properties. Output may include:\n"
- " input|output, can-monitor, physical, terminal\n\n");
- fprintf (stderr, " -t, --type Display port type\n");
- fprintf (stderr, " -u, --uuid Display uuid instead of client name (if available)\n");
- fprintf (stderr, " -U, --port-uuid Display port uuid\n");
- fprintf (stderr, " -h, --help Display this help message\n");
- fprintf (stderr, " --version Output version information and exit\n\n");
- fprintf (stderr, "For more information see http://jackaudio.org/\n");
-}
-
-int
-main (int argc, char *argv[])
-{
- jack_client_t *client;
- jack_status_t status;
- jack_options_t options = JackNoStartServer;
- const char **ports, **connections;
- unsigned int i, j, k;
- int skip_port;
- int show_aliases = 0;
- int show_con = 0;
- int show_port_latency = 0;
- int show_total_latency = 0;
- int show_properties = 0;
- int show_type = 0;
- int show_uuid = 0;
- int show_port_uuid = 0;
- int c;
- int option_index;
- char* aliases[2];
- char *server_name = NULL;
-
- struct option long_options[] = {
- { "server", 1, 0, 's' },
- { "aliases", 0, 0, 'A' },
- { "connections", 0, 0, 'c' },
- { "port-latency", 0, 0, 'l' },
- { "total-latency", 0, 0, 'L' },
- { "properties", 0, 0, 'p' },
- { "type", 0, 0, 't' },
- { "uuid", 0, 0, 'u' },
- { "port-uuid", 0, 0, 'U' },
- { "help", 0, 0, 'h' },
- { "version", 0, 0, 'v' },
- { 0, 0, 0, 0 }
- };
-
- my_name = strrchr(argv[0], '/');
- if (my_name == 0) {
- my_name = argv[0];
- } else {
- my_name ++;
- }
-
- while ((c = getopt_long (argc, argv, "s:AclLphvtuU", long_options, &option_index)) >= 0) {
- switch (c) {
- case 's':
- server_name = (char *) malloc (sizeof (char) * strlen(optarg));
- strcpy (server_name, optarg);
- options |= JackServerName;
- break;
- case 'A':
- aliases[0] = (char *) malloc (jack_port_name_size());
- aliases[1] = (char *) malloc (jack_port_name_size());
- show_aliases = 1;
- break;
- case 'c':
- show_con = 1;
- break;
- case 'l':
- show_port_latency = 1;
- break;
- case 'L':
- show_total_latency = 1;
- break;
- case 'p':
- show_properties = 1;
- break;
- case 't':
- show_type = 1;
- break;
- case 'u':
- show_uuid = 1;
- break;
- case 'U':
- show_port_uuid = 1;
- break;
- case 'h':
- show_usage ();
- return 1;
- break;
- case 'v':
- show_version ();
- return 1;
- break;
- default:
- show_usage ();
- return 1;
- break;
- }
- }
-
- /* Open a client connection to the JACK server. Starting a
- * new server only to list its ports seems pointless, so we
- * specify JackNoStartServer. */
- if ((client = jack_client_open ("lsp", options, &status, server_name)) == 0) {
- fprintf (stderr, "Error: cannot connect to JACK, ");
- if (status & JackServerFailed) {
- fprintf (stderr, "server is not running.\n");
- } else {
- fprintf (stderr, "jack_client_open() failed, status = 0x%2.0x\n", status);
- }
- return 1;
- }
-
- ports = jack_get_ports (client, NULL, NULL, 0);
-
- for (i = 0; ports && ports[i]; ++i) {
- // skip over any that don't match ALL of the strings presented at command line
- skip_port = 0;
- for (k = optind; k < argc; k++){
- if (strstr(ports[i], argv[k]) == NULL ){
- skip_port = 1;
- }
- }
- if (skip_port) continue;
-
- if (show_uuid) {
- printf_name2uuid(client, ports[i]);
- } else {
- printf ("%s\n", ports[i]);
- }
-
- jack_port_t *port = jack_port_by_name (client, ports[i]);
-
- if (show_port_uuid) {
- char buf[JACK_UUID_STRING_SIZE];
- jack_uuid_t uuid = jack_port_uuid (port);
- jack_uuid_unparse (uuid, buf);
- printf (" uuid: %s\n", buf);
- }
-
- if (show_aliases) {
- int cnt;
- int i;
-
- cnt = jack_port_get_aliases (port, aliases);
- for (i = 0; i < cnt; ++i) {
- printf (" %s\n", aliases[i]);
- }
- }
-
- if (show_con) {
- if ((connections = jack_port_get_all_connections (client, jack_port_by_name(client, ports[i]))) != 0) {
- for (j = 0; connections[j]; j++) {
- printf(" ");
- if (show_uuid) {
- printf_name2uuid(client, connections[j]);
- } else {
- printf("%s\n", connections[j]);
- }
- }
- jack_free (connections);
- }
- }
- if (show_port_latency) {
- if (port) {
- jack_latency_range_t range;
-
- jack_port_get_latency_range (port, JackPlaybackLatency, &range);
- printf (" port playback latency = [ %" PRIu32 " %" PRIu32 " ] frames\n",
- range.min, range.max);
-
- jack_port_get_latency_range (port, JackCaptureLatency, &range);
- printf (" port capture latency = [ %" PRIu32 " %" PRIu32 " ] frames\n",
- range.min, range.max);
- }
- }
- if (show_total_latency) {
- if (port) {
- printf (" total latency = %d frames\n",
- jack_port_get_total_latency (client, port));
- }
- }
- if (show_properties) {
- if (port) {
- int flags = jack_port_flags (port);
- printf (" properties: ");
- if (flags & JackPortIsInput) {
- fputs ("input,", stdout);
- }
- if (flags & JackPortIsOutput) {
- fputs ("output,", stdout);
- }
- if (flags & JackPortCanMonitor) {
- fputs ("can-monitor,", stdout);
- }
- if (flags & JackPortIsPhysical) {
- fputs ("physical,", stdout);
- }
- if (flags & JackPortIsTerminal) {
- fputs ("terminal,", stdout);
- }
- putc ('\n', stdout);
- }
- }
- if (show_type) {
- if (port) {
- putc ('\t', stdout);
- fputs (jack_port_type (port), stdout);
- putc ('\n', stdout);
- }
- }
- }
-
- if (show_aliases) {
- free(aliases[0]);
- free(aliases[1]);
- }
- if (ports)
- jack_free (ports);
- jack_client_close (client);
- exit (0);
-}
diff --git a/example-clients/midi_dump.c b/example-clients/midi_dump.c
deleted file mode 100644
index 7a7ec2b3..00000000
--- a/example-clients/midi_dump.c
+++ /dev/null
@@ -1,233 +0,0 @@
-// gcc -o jack_midi_dump -Wall midi_dump.c -ljack -pthread
-
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-#include <assert.h>
-#include <inttypes.h>
-#include <jack/jack.h>
-#include <jack/midiport.h>
-#include <jack/ringbuffer.h>
-
-#ifdef __MINGW32__
-#include <pthread.h>
-#endif
-
-#ifndef WIN32
-#include <signal.h>
-#include <pthread.h>
-#include <sys/mman.h>
-#endif
-
-static jack_port_t* port;
-static jack_ringbuffer_t *rb = NULL;
-static pthread_mutex_t msg_thread_lock = PTHREAD_MUTEX_INITIALIZER;
-static pthread_cond_t data_ready = PTHREAD_COND_INITIALIZER;
-
-static int keeprunning = 1;
-static uint64_t monotonic_cnt = 0;
-
-#define RBSIZE 100
-#define MSG_BUFFER_SIZE 4096
-
-typedef struct {
- uint8_t buffer[MSG_BUFFER_SIZE];
- uint32_t size;
- uint32_t tme_rel;
- uint64_t tme_mon;
-} midimsg;
-
-static void
-describe (midimsg* event)
-{
- if (event->size == 0) {
- return;
- }
-
- uint8_t type = event->buffer[0] & 0xf0;
- uint8_t channel = event->buffer[0] & 0xf;
-
- switch (type) {
- case 0x90:
- assert (event->size == 3);
- printf (" note on (channel %2d): pitch %3d, velocity %3d", channel, event->buffer[1], event->buffer[2]);
- break;
- case 0x80:
- assert (event->size == 3);
- printf (" note off (channel %2d): pitch %3d, velocity %3d", channel, event->buffer[1], event->buffer[2]);
- break;
- case 0xb0:
- assert (event->size == 3);
- printf (" control change (channel %2d): controller %3d, value %3d", channel, event->buffer[1], event->buffer[2]);
- break;
- default:
- break;
- }
-}
-
-int
-process (jack_nframes_t frames, void* arg)
-{
- void* buffer;
- jack_nframes_t N;
- jack_nframes_t i;
-
- buffer = jack_port_get_buffer (port, frames);
- assert (buffer);
-
- N = jack_midi_get_event_count (buffer);
- for (i = 0; i < N; ++i) {
- jack_midi_event_t event;
- int r;
- r = jack_midi_event_get (&event, buffer, i);
-
- if (r != 0) {continue;}
-
- if (event.size > MSG_BUFFER_SIZE) {
- fprintf(stderr, "Error: MIDI message was too large, skipping event. Max. allowed size: %d bytes\n", MSG_BUFFER_SIZE);
- }
- else if (jack_ringbuffer_write_space (rb) >= sizeof(midimsg)) {
- midimsg m;
- m.tme_mon = monotonic_cnt;
- m.tme_rel = event.time;
- m.size = event.size;
- memcpy (m.buffer, event.buffer, event.size);
- jack_ringbuffer_write (rb, (void *) &m, sizeof(midimsg));
- }
- else {
- fprintf (stderr, "Error: ringbuffer was full, skipping event.\n");
- }
- }
-
- monotonic_cnt += frames;
-
- if (pthread_mutex_trylock (&msg_thread_lock) == 0) {
- pthread_cond_signal (&data_ready);
- pthread_mutex_unlock (&msg_thread_lock);
- }
-
- return 0;
-}
-
-static void wearedone(int sig) {
- fprintf(stderr, "Shutting down\n");
- keeprunning = 0;
-}
-
-static void usage (int status) {
- printf ("jack_midi_dump - JACK MIDI Monitor.\n\n");
- printf ("Usage: jack_midi_dump [ OPTIONS ] [CLIENT-NAME]\n\n");
- printf ("Options:\n\
- -a use absolute timestamps relative to application start\n\
- -h display this help and exit\n\
- -r use relative timestamps to previous MIDI event\n\
-\n");
- printf ("\n\
-This tool listens for MIDI events on a JACK MIDI port and prints\n\
-the message to stdout.\n\
-\n\
-If no client name is given it defaults to 'midi-monitor'.\n\
-\n\
-See also: jackd(1)\n\
-\n");
- exit (status);
-}
-
-int
-main (int argc, char* argv[])
-{
- jack_client_t* client;
- char const default_name[] = "midi-monitor";
- char const * client_name;
- int time_format = 0;
- int r;
-
- int cn = 1;
-
- if (argc > 1) {
- if (!strcmp (argv[1], "-a")) { time_format = 1; cn = 2; }
- else if (!strcmp (argv[1], "-r")) { time_format = 2; cn = 2; }
- else if (!strcmp (argv[1], "-h")) { usage (EXIT_SUCCESS); }
- else if (argv[1][0] == '-') { usage (EXIT_FAILURE); }
- }
-
- if (argc > cn) {
- client_name = argv[cn];
- } else {
- client_name = default_name;
- }
-
- client = jack_client_open (client_name, JackNullOption, NULL);
- if (client == NULL) {
- fprintf (stderr, "Could not create JACK client.\n");
- exit (EXIT_FAILURE);
- }
-
- rb = jack_ringbuffer_create (RBSIZE * sizeof(midimsg));
-
- jack_set_process_callback (client, process, 0);
-
- port = jack_port_register (client, "input", JACK_DEFAULT_MIDI_TYPE, JackPortIsInput, 0);
- if (port == NULL) {
- fprintf (stderr, "Could not register port.\n");
- exit (EXIT_FAILURE);
- }
-
-#ifndef WIN32
- if (mlockall (MCL_CURRENT | MCL_FUTURE)) {
- fprintf (stderr, "Warning: Can not lock memory.\n");
- }
-#endif
-
- r = jack_activate (client);
- if (r != 0) {
- fprintf (stderr, "Could not activate client.\n");
- exit (EXIT_FAILURE);
- }
-
-#ifndef WIN32
- signal(SIGHUP, wearedone);
- signal(SIGINT, wearedone);
-#endif
-
- pthread_mutex_lock (&msg_thread_lock);
-
- uint64_t prev_event = 0;
- while (keeprunning) {
- const int mqlen = jack_ringbuffer_read_space (rb) / sizeof(midimsg);
- int i;
- for (i=0; i < mqlen; ++i) {
- size_t j;
- midimsg m;
- jack_ringbuffer_read(rb, (char*) &m, sizeof(midimsg));
-
- switch(time_format) {
- case 1:
- printf ("%7"PRId64":", m.tme_rel + m.tme_mon);
- break;
- case 2:
- printf ("%+6"PRId64":", m.tme_rel + m.tme_mon - prev_event);
- break;
- default:
- printf ("%4d:", m.tme_rel);
- break;
- }
- for (j = 0; j < m.size && j < sizeof(m.buffer); ++j) {
- printf (" %02x", m.buffer[j]);
- }
-
- describe (&m);
- printf("\n");
- prev_event = m.tme_rel + m.tme_mon;
- }
- fflush (stdout);
- pthread_cond_wait (&data_ready, &msg_thread_lock);
- }
- pthread_mutex_unlock (&msg_thread_lock);
-
- jack_deactivate (client);
- jack_client_close (client);
- jack_ringbuffer_free (rb);
-
- return 0;
-}
diff --git a/example-clients/monitor_client.c b/example-clients/monitor_client.c
deleted file mode 100644
index b9a2761a..00000000
--- a/example-clients/monitor_client.c
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- 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 <stdio.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <jack/jack.h>
-
-#define TRUE 1
-#define FALSE 0
-
-int
-main (int argc, char *argv[])
-{
- jack_client_t *client;
- char *my_name = strrchr(argv[0], '/');
-
- if (my_name == 0) {
- my_name = argv[0];
- } else {
- my_name ++;
- }
-
- if (argc != 2) {
- fprintf (stderr, "Usage: %s client\n", my_name);
- return 1;
- }
-
- if ((client = jack_client_open ("input monitoring", JackNullOption, NULL)) == 0) {
- fprintf (stderr, "JACK server not running?\n");
- return 1;
- }
-
- if (jack_port_request_monitor_by_name (client, argv[1], TRUE)) {
- fprintf (stderr, "could not enable monitoring for %s\n", argv[1]);
- jack_client_close (client);
- return 1;
- }
-
-#ifdef WIN32
- Sleep (30*1000);
-#else
- sleep (30);
-#endif
- if (jack_port_request_monitor_by_name (client, argv[1], FALSE)) {
- fprintf (stderr, "could not disable monitoring for %s\n", argv[1]);
- }
- jack_client_close (client);
- exit (0);
-}
-
diff --git a/example-clients/netsource.c b/example-clients/netsource.c
deleted file mode 100644
index 665d73fb..00000000
--- a/example-clients/netsource.c
+++ /dev/null
@@ -1,802 +0,0 @@
-/*
-NetJack Client
-
-Copyright (C) 2008 Marc-Olivier Barre <marco@marcochapeau.org>
-Copyright (C) 2008 Pieter Palmers <pieterpalmers@users.sourceforge.net>
-Copyright (C) 2006 Torben Hohn <torbenh@gmx.de>
-
-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.
-
-*/
-
-/** @file netsource.c
- *
- * @brief This client connects a remote slave JACK to a local JACK server assumed to be the master
- */
-
-
-#include <stdio.h>
-#include <errno.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <string.h>
-#include <signal.h>
-
-#if defined(HAVE_CONFIG_H)
-#include "config.h"
-#endif
-
-#ifdef WIN32
-#include <winsock2.h>
-#define socklen_t int
-#include <malloc.h>
-#else
-#include <netinet/in.h>
-#include <netdb.h>
-#include <sys/socket.h>
-#endif
-
-/* These two required by FreeBSD. */
-#include <sys/types.h>
-
-#include <jack/jack.h>
-
-#include <netjack_packet.h>
-#if HAVE_SAMPLERATE
-#include <samplerate.h>
-#endif
-
-#if HAVE_CELT
-#include <celt/celt.h>
-#endif
-
-#ifndef CUSTOM_MODES
-#define CUSTOM_MODES // for opus_custom_decoder_init
-#endif
-
-#if HAVE_OPUS
-#include <opus/opus.h>
-#include <opus/opus_custom.h>
-#endif
-
-#include <math.h>
-
-JSList *capture_ports = NULL;
-JSList *capture_srcs = NULL;
-int capture_channels = 0;
-int capture_channels_audio = 2;
-int capture_channels_midi = 1;
-JSList *playback_ports = NULL;
-JSList *playback_srcs = NULL;
-int playback_channels = 0;
-int playback_channels_audio = 2;
-int playback_channels_midi = 1;
-int dont_htonl_floats = 0;
-
-int latency = 5;
-jack_nframes_t factor = 1;
-int bitdepth = 0;
-int mtu = 1400;
-int reply_port = 0;
-int bind_port = 0;
-int redundancy = 1;
-jack_client_t *client;
-packet_cache * packcache = 0;
-
-int state_connected = 0;
-int state_latency = 0;
-int state_netxruns = 0;
-int state_currentframe = 0;
-int state_recv_packet_queue_time = 0;
-
-int quit = 0;
-
-
-int outsockfd;
-int insockfd;
-#ifdef WIN32
-struct sockaddr_in destaddr;
-struct sockaddr_in bindaddr;
-#else
-struct sockaddr destaddr;
-struct sockaddr bindaddr;
-#endif
-
-int sync_state;
-jack_transport_state_t last_transport_state;
-
-int framecnt = 0;
-
-int cont_miss = 0;
-
-int freewheeling = 0;
-
-/**
- * This Function allocates all the I/O Ports which are added the lists.
- */
-void
-alloc_ports (int n_capture_audio, int n_playback_audio, int n_capture_midi, int n_playback_midi)
-{
-
- int port_flags = JackPortIsOutput;
- int chn;
- jack_port_t *port;
- char buf[32];
-
- capture_ports = NULL;
- /* Allocate audio capture channels */
- for (chn = 0; chn < n_capture_audio; chn++) {
- snprintf (buf, sizeof (buf) - 1, "capture_%u", chn + 1);
- port = jack_port_register (client, buf, JACK_DEFAULT_AUDIO_TYPE, port_flags, 0);
- if (!port) {
- printf( "jack_netsource: cannot register %s port\n", buf);
- break;
- }
- if (bitdepth == 1000) {
-#if HAVE_CELT
-#if HAVE_CELT_API_0_11
- CELTMode *celt_mode = celt_mode_create( jack_get_sample_rate( client ), jack_get_buffer_size(client), NULL );
- capture_srcs = jack_slist_append(capture_srcs, celt_decoder_create_custom( celt_mode, 1, NULL ) );
-#elif HAVE_CELT_API_0_7 || HAVE_CELT_API_0_8
- CELTMode *celt_mode = celt_mode_create( jack_get_sample_rate( client ), jack_get_buffer_size(client), NULL );
- capture_srcs = jack_slist_append(capture_srcs, celt_decoder_create( celt_mode, 1, NULL ) );
-#else
- CELTMode *celt_mode = celt_mode_create( jack_get_sample_rate( client ), 1, jack_get_buffer_size(client), NULL );
- capture_srcs = jack_slist_append(capture_srcs, celt_decoder_create( celt_mode ) );
-#endif
-#endif
- } else if (bitdepth == 999) {
-#if HAVE_OPUS
- int err;
- OpusCustomMode *opus_mode = opus_custom_mode_create(jack_get_sample_rate( client ), jack_get_buffer_size(client), &err);
- if (err != OPUS_OK) { printf("OPUS MODE FAILED\n"); }
- OpusCustomDecoder *decoder = opus_custom_decoder_create(opus_mode, 1, &err);
- if (err != OPUS_OK) { printf("OPUS DECODER FAILED\n"); }
- opus_custom_decoder_init(decoder, opus_mode, 1);
- capture_srcs = jack_slist_append(capture_srcs, decoder);
-#endif
- } else {
-#if HAVE_SAMPLERATE
- capture_srcs = jack_slist_append (capture_srcs, src_new (SRC_LINEAR, 1, NULL));
-#endif
- }
- capture_ports = jack_slist_append (capture_ports, port);
- }
-
- /* Allocate midi capture channels */
- for (chn = n_capture_audio; chn < n_capture_midi + n_capture_audio; chn++) {
- snprintf (buf, sizeof (buf) - 1, "capture_%u", chn + 1);
- port = jack_port_register (client, buf, JACK_DEFAULT_MIDI_TYPE, port_flags, 0);
- if (!port) {
- printf ("jack_netsource: cannot register %s port\n", buf);
- break;
- }
- capture_ports = jack_slist_append(capture_ports, port);
- }
-
- /* Allocate audio playback channels */
- port_flags = JackPortIsInput;
- playback_ports = NULL;
- for (chn = 0; chn < n_playback_audio; chn++) {
- snprintf (buf, sizeof (buf) - 1, "playback_%u", chn + 1);
- port = jack_port_register (client, buf, JACK_DEFAULT_AUDIO_TYPE, port_flags, 0);
- if (!port) {
- printf ("jack_netsource: cannot register %s port\n", buf);
- break;
- }
- if( bitdepth == 1000 ) {
-#if HAVE_CELT
-#if HAVE_CELT_API_0_11
- CELTMode *celt_mode = celt_mode_create( jack_get_sample_rate (client), jack_get_buffer_size(client), NULL );
- playback_srcs = jack_slist_append(playback_srcs, celt_encoder_create_custom( celt_mode, 1, NULL ) );
-#elif HAVE_CELT_API_0_7 || HAVE_CELT_API_0_8
- CELTMode *celt_mode = celt_mode_create( jack_get_sample_rate (client), jack_get_buffer_size(client), NULL );
- playback_srcs = jack_slist_append(playback_srcs, celt_encoder_create( celt_mode, 1, NULL ) );
-#else
- CELTMode *celt_mode = celt_mode_create( jack_get_sample_rate (client), 1, jack_get_buffer_size(client), NULL );
- playback_srcs = jack_slist_append(playback_srcs, celt_encoder_create( celt_mode ) );
-#endif
-#endif
- } else if( bitdepth == 999 ) {
-#if HAVE_OPUS
- const int kbps = factor;
- printf("new opus encoder %d kbps\n", kbps);
- int err;
- OpusCustomMode *opus_mode = opus_custom_mode_create(jack_get_sample_rate (client), jack_get_buffer_size(client), &err ); // XXX free me
- if (err != OPUS_OK) { printf("OPUS MODE FAILED\n"); }
- OpusCustomEncoder *oe = opus_custom_encoder_create( opus_mode, 1, &err );
- if (err != OPUS_OK) { printf("OPUS ENCODER FAILED\n"); }
- opus_custom_encoder_ctl(oe, OPUS_SET_BITRATE(kbps*1024)); // bits per second
- opus_custom_encoder_ctl(oe, OPUS_SET_COMPLEXITY(10));
- opus_custom_encoder_ctl(oe, OPUS_SET_SIGNAL(OPUS_SIGNAL_MUSIC));
- opus_custom_encoder_ctl(oe, OPUS_SET_SIGNAL(OPUS_APPLICATION_RESTRICTED_LOWDELAY));
- opus_custom_encoder_init(oe, opus_mode, 1);
- playback_srcs = jack_slist_append(playback_srcs, oe);
-#endif
- } else {
-#if HAVE_SAMPLERATE
- playback_srcs = jack_slist_append (playback_srcs, src_new (SRC_LINEAR, 1, NULL));
-#endif
- }
- playback_ports = jack_slist_append (playback_ports, port);
- }
-
- /* Allocate midi playback channels */
- for (chn = n_playback_audio; chn < n_playback_midi + n_playback_audio; chn++) {
- snprintf (buf, sizeof (buf) - 1, "playback_%u", chn + 1);
- port = jack_port_register (client, buf, JACK_DEFAULT_MIDI_TYPE, port_flags, 0);
- if (!port) {
- printf ("jack_netsource: cannot register %s port\n", buf);
- break;
- }
- playback_ports = jack_slist_append (playback_ports, port);
- }
-}
-
-/**
- * The Sync callback... sync state is set elsewhere...
- * we will see if this is working correctly.
- * i don't really believe in it yet.
- */
-int
-sync_cb (jack_transport_state_t state, jack_position_t *pos, void *arg)
-{
- static int latency_count = 0;
- int retval = sync_state;
-
- if (! state_connected) {
- return 1;
- }
- if (latency_count) {
- latency_count--;
- retval = 0;
- }
-
- else if (state == JackTransportStarting && last_transport_state != JackTransportStarting) {
- retval = 0;
- latency_count = latency - 1;
- }
-
- last_transport_state = state;
- return retval;
-}
-
-void
-freewheel_cb (int starting, void *arg)
-{
- freewheeling = starting;
-}
-
-int deadline_goodness = 0;
-/**
- * The process callback for this JACK application.
- * It is called by JACK at the appropriate times.
- */
-int
-process (jack_nframes_t nframes, void *arg)
-{
- jack_nframes_t net_period;
- int rx_bufsize, tx_bufsize;
-
- jack_default_audio_sample_t *buf;
- jack_port_t *port;
- JSList *node;
- int chn;
- int size, i;
- const char *porttype;
- int input_fd;
-
- jack_position_t local_trans_pos;
-
- uint32_t *packet_buf_tx, *packet_bufX;
- uint32_t *rx_packet_ptr;
- jack_time_t packet_recv_timestamp;
-
- if( bitdepth == 1000 || bitdepth == 999)
- net_period = (factor * jack_get_buffer_size(client) * 1024 / jack_get_sample_rate(client) / 8) & (~1) ;
- else
- net_period = (float) nframes / (float) factor;
-
- rx_bufsize = get_sample_size (bitdepth) * capture_channels * net_period + sizeof (jacknet_packet_header);
- tx_bufsize = get_sample_size (bitdepth) * playback_channels * net_period + sizeof (jacknet_packet_header);
-
- /* Allocate a buffer where both In and Out Buffer will fit */
- packet_buf_tx = alloca (tx_bufsize);
-
- jacknet_packet_header *pkthdr_tx = (jacknet_packet_header *) packet_buf_tx;
-
- /*
- * for latency==0 we need to send out the packet before we wait on the reply.
- * but this introduces a cycle of latency, when netsource is connected to itself.
- * so we send out before read only in zero latency mode.
- *
- */
-
- if( latency == 0 ) {
- /* reset packet_bufX... */
- packet_bufX = packet_buf_tx + sizeof (jacknet_packet_header) / sizeof (jack_default_audio_sample_t);
-
- /* ---------- Send ---------- */
- render_jack_ports_to_payload (bitdepth, playback_ports, playback_srcs, nframes,
- packet_bufX, net_period, dont_htonl_floats);
-
- /* fill in packet hdr */
- pkthdr_tx->transport_state = jack_transport_query (client, &local_trans_pos);
- pkthdr_tx->transport_frame = local_trans_pos.frame;
- pkthdr_tx->framecnt = framecnt;
- pkthdr_tx->latency = latency;
- pkthdr_tx->reply_port = reply_port;
- pkthdr_tx->sample_rate = jack_get_sample_rate (client);
- pkthdr_tx->period_size = nframes;
-
- /* playback for us is capture on the other side */
- pkthdr_tx->capture_channels_audio = playback_channels_audio;
- pkthdr_tx->playback_channels_audio = capture_channels_audio;
- pkthdr_tx->capture_channels_midi = playback_channels_midi;
- pkthdr_tx->playback_channels_midi = capture_channels_midi;
- pkthdr_tx->mtu = mtu;
- if( freewheeling != 0 )
- pkthdr_tx->sync_state = (jack_nframes_t)MASTER_FREEWHEELS;
- else
- pkthdr_tx->sync_state = (jack_nframes_t)deadline_goodness;
- //printf("goodness=%d\n", deadline_goodness );
-
- packet_header_hton (pkthdr_tx);
- if (cont_miss < 3 * latency + 5) {
- int r;
- for( r = 0; r < redundancy; r++ )
- netjack_sendto (outsockfd, (char *) packet_buf_tx, tx_bufsize, 0, &destaddr, sizeof (destaddr), mtu);
- } else if (cont_miss > 50 + 5 * latency) {
- state_connected = 0;
- packet_cache_reset_master_address( packcache );
- //printf ("Frame %d \tRealy too many packets missed (%d). Let's reset the counter\n", framecnt, cont_miss);
- cont_miss = 0;
- }
- }
-
- /*
- * ok... now the RECEIVE code.
- *
- */
-
-
- if( reply_port )
- input_fd = insockfd;
- else
- input_fd = outsockfd;
-
- // for latency == 0 we can poll.
- if( (latency == 0) || (freewheeling != 0) ) {
- jack_time_t deadline = jack_get_time() + 1000000 * jack_get_buffer_size(client) / jack_get_sample_rate(client);
- // Now loop until we get the right packet.
- while(1) {
- jack_nframes_t got_frame;
- if ( ! netjack_poll_deadline( input_fd, deadline ) )
- break;
-
- packet_cache_drain_socket(packcache, input_fd);
-
- if (packet_cache_get_next_available_framecnt( packcache, framecnt - latency, &got_frame ))
- if( got_frame == (framecnt - latency) )
- break;
- }
- } else {
- // normally:
- // only drain socket.
- packet_cache_drain_socket(packcache, input_fd);
- }
-
- size = packet_cache_retreive_packet_pointer( packcache, framecnt - latency, (char**)&rx_packet_ptr, rx_bufsize, &packet_recv_timestamp );
- /* First alternative : we received what we expected. Render the data
- * to the JACK ports so it can be played. */
- if (size == rx_bufsize) {
- uint32_t *packet_buf_rx = rx_packet_ptr;
- jacknet_packet_header *pkthdr_rx = (jacknet_packet_header *) packet_buf_rx;
- packet_bufX = packet_buf_rx + sizeof (jacknet_packet_header) / sizeof (jack_default_audio_sample_t);
- // calculate how much time there would have been, if this packet was sent at the deadline.
-
- int recv_time_offset = (int) (jack_get_time() - packet_recv_timestamp);
- packet_header_ntoh (pkthdr_rx);
- deadline_goodness = recv_time_offset - (int)pkthdr_rx->latency;
- //printf( "deadline goodness = %d ---> off: %d\n", deadline_goodness, recv_time_offset );
-
- if (cont_miss) {
- //printf("Frame %d \tRecovered from dropouts\n", framecnt);
- cont_miss = 0;
- }
- render_payload_to_jack_ports (bitdepth, packet_bufX, net_period,
- capture_ports, capture_srcs, nframes, dont_htonl_floats);
-
- state_currentframe = framecnt;
- state_recv_packet_queue_time = recv_time_offset;
- state_connected = 1;
- sync_state = pkthdr_rx->sync_state;
- packet_cache_release_packet( packcache, framecnt - latency );
- }
- /* Second alternative : we've received something that's not
- * as big as expected or we missed a packet. We render silence
- * to the output ports */
- else {
- jack_nframes_t latency_estimate;
- if( packet_cache_find_latency( packcache, framecnt, &latency_estimate ) )
- //if( (state_latency == 0) || (latency_estimate < state_latency) )
- state_latency = latency_estimate;
-
- // Set the counters up.
- state_currentframe = framecnt;
- //state_latency = framecnt - pkthdr->framecnt;
- state_netxruns += 1;
-
- //printf ("Frame %d \tPacket missed or incomplete (expected: %d bytes, got: %d bytes)\n", framecnt, rx_bufsize, size);
- //printf ("Frame %d \tPacket missed or incomplete\n", framecnt);
- cont_miss += 1;
- chn = 0;
- node = capture_ports;
- while (node != NULL) {
- port = (jack_port_t *) node->data;
- buf = jack_port_get_buffer (port, nframes);
- porttype = jack_port_type (port);
- if (strncmp (porttype, JACK_DEFAULT_AUDIO_TYPE, jack_port_type_size ()) == 0)
- for (i = 0; i < nframes; i++)
- buf[i] = 0.0;
- else if (strncmp (porttype, JACK_DEFAULT_MIDI_TYPE, jack_port_type_size ()) == 0)
- jack_midi_clear_buffer (buf);
- node = jack_slist_next (node);
- chn++;
- }
- }
- if (latency != 0) {
- /* reset packet_bufX... */
- packet_bufX = packet_buf_tx + sizeof (jacknet_packet_header) / sizeof (jack_default_audio_sample_t);
-
- /* ---------- Send ---------- */
- render_jack_ports_to_payload (bitdepth, playback_ports, playback_srcs, nframes,
- packet_bufX, net_period, dont_htonl_floats);
-
- /* fill in packet hdr */
- pkthdr_tx->transport_state = jack_transport_query (client, &local_trans_pos);
- pkthdr_tx->transport_frame = local_trans_pos.frame;
- pkthdr_tx->framecnt = framecnt;
- pkthdr_tx->latency = latency;
- pkthdr_tx->reply_port = reply_port;
- pkthdr_tx->sample_rate = jack_get_sample_rate (client);
- pkthdr_tx->period_size = nframes;
-
- /* playback for us is capture on the other side */
- pkthdr_tx->capture_channels_audio = playback_channels_audio;
- pkthdr_tx->playback_channels_audio = capture_channels_audio;
- pkthdr_tx->capture_channels_midi = playback_channels_midi;
- pkthdr_tx->playback_channels_midi = capture_channels_midi;
- pkthdr_tx->mtu = mtu;
- if( freewheeling != 0 )
- pkthdr_tx->sync_state = (jack_nframes_t)MASTER_FREEWHEELS;
- else
- pkthdr_tx->sync_state = (jack_nframes_t)deadline_goodness;
- //printf("goodness=%d\n", deadline_goodness );
-
- packet_header_hton (pkthdr_tx);
- if (cont_miss < 3 * latency + 5) {
- int r;
- for( r = 0; r < redundancy; r++ )
- netjack_sendto (outsockfd, (char *) packet_buf_tx, tx_bufsize, 0, &destaddr, sizeof (destaddr), mtu);
- } else if (cont_miss > 50 + 5 * latency) {
- state_connected = 0;
- packet_cache_reset_master_address( packcache );
- //printf ("Frame %d \tRealy too many packets missed (%d). Let's reset the counter\n", framecnt, cont_miss);
- cont_miss = 0;
- }
- }
-
- framecnt++;
- return 0;
-}
-
-/**
- * This is the shutdown callback for this JACK application.
- * It is called by JACK if the server ever shuts down or
- * decides to disconnect the client.
- */
-
-void
-jack_shutdown (void *arg)
-{
- fprintf(stderr, "JACK shut down, exiting ...\n");
- exit (1);
-}
-
-void
-init_sockaddr_in (struct sockaddr_in *name , const char *hostname , uint16_t port)
-{
- name->sin_family = AF_INET ;
- name->sin_port = htons (port);
- if (hostname) {
- struct hostent *hostinfo = gethostbyname (hostname);
- if (hostinfo == NULL) {
- fprintf (stderr, "init_sockaddr_in: unknown host: %s.\n", hostname);
- fflush( stderr );
- }
-#ifdef WIN32
- name->sin_addr.s_addr = inet_addr( hostname );
-#else
- name->sin_addr = *(struct in_addr *) hostinfo->h_addr ;
-#endif
- } else
- name->sin_addr.s_addr = htonl (INADDR_ANY) ;
-
-}
-
-void
-printUsage ()
-{
- fprintf (stderr, "usage: jack_netsource [options]\n"
- "\n"
- " -h this help text\n"
- " -H <slave host> - Host name of the slave JACK\n"
- " -o <num channels> - Number of audio playback channels\n"
- " -i <num channels> - Number of audio capture channels\n"
- " -O <num channels> - Number of midi playback channels\n"
- " -I <num channels> - Number of midi capture channels\n"
- " -n <periods> - Network latency in JACK periods\n"
- " -p <port> - UDP port that the slave is listening on\n"
- " -r <reply port> - UDP port that we are listening on\n"
- " -B <bind port> - reply port, for use in NAT environments\n"
- " -b <bitdepth> - Set transport to use 16bit or 8bit\n"
- " -c <kbits> - Use CELT encoding with <kbits> kbits per channel\n"
- " -P <kbits> - Use Opus encoding with <kbits> kbits per channel\n"
- " -m <mtu> - Assume this mtu for the link\n"
- " -R <N> - Redundancy: send out packets N times.\n"
- " -e - skip host-to-network endianness conversion\n"
- " -N <jack name> - Reports a different name to jack\n"
- " -s <server name> - The name of the local jack server\n"
- "\n");
-}
-
-void
-sigterm_handler( int signal )
-{
- quit = 1;
-}
-
-int
-main (int argc, char *argv[])
-{
- /* Some startup related basics */
- char *client_name, *server_name = NULL, *peer_ip;
- int peer_port = 3000;
- jack_options_t options = JackNullOption;
- jack_status_t status;
-#ifdef WIN32
- WSADATA wsa;
- int rc = WSAStartup(MAKEWORD(2, 0), &wsa);
-#endif
- /* Torben's famous state variables, aka "the reporting API" ! */
- /* heh ? these are only the copies of them ;) */
- int statecopy_connected, statecopy_latency, statecopy_netxruns;
- jack_nframes_t net_period;
- /* Argument parsing stuff */
- extern char *optarg;
- extern int optind, optopt;
- int errflg = 0, c;
-
- if (argc < 3) {
- printUsage ();
- return 1;
- }
-
- client_name = (char *) malloc (sizeof (char) * 10);
- peer_ip = (char *) malloc (sizeof (char) * 10);
- sprintf(client_name, "netjack");
- sprintf(peer_ip, "localhost");
-
- while ((c = getopt (argc, argv, ":h:H:o:i:O:I:n:p:r:B:b:c:m:R:e:N:s:P:")) != -1) {
- switch (c) {
- case 'h':
- printUsage();
- exit (0);
- break;
- case 'H':
- free(peer_ip);
- peer_ip = (char *) malloc (sizeof (char) * strlen (optarg) + 1);
- strcpy (peer_ip, optarg);
- break;
- case 'o':
- playback_channels_audio = atoi (optarg);
- break;
- case 'i':
- capture_channels_audio = atoi (optarg);
- break;
- case 'O':
- playback_channels_midi = atoi (optarg);
- break;
- case 'I':
- capture_channels_midi = atoi (optarg);
- break;
- case 'n':
- latency = atoi (optarg);
- break;
- case 'p':
- peer_port = atoi (optarg);
- break;
- case 'r':
- reply_port = atoi (optarg);
- break;
- case 'B':
- bind_port = atoi (optarg);
- break;
- case 'f':
- factor = atoi (optarg);
- printf("This feature is deprecated and will be removed in future netjack versions. CELT offers a superiour way to conserve bandwidth");
- break;
- case 'b':
- bitdepth = atoi (optarg);
- break;
- case 'c':
-#if HAVE_CELT
- bitdepth = 1000;
- factor = atoi (optarg);
-#else
- printf( "not built with celt support\n" );
- exit(10);
-#endif
- break;
- case 'P':
-#if HAVE_OPUS
- bitdepth = 999;
- factor = atoi (optarg);
-#else
- printf( "not built with opus support\n" );
- exit(10);
-#endif
- break;
- case 'm':
- mtu = atoi (optarg);
- break;
- case 'R':
- redundancy = atoi (optarg);
- break;
- case 'e':
- dont_htonl_floats = 1;
- break;
- case 'N':
- free(client_name);
- client_name = (char *) malloc (sizeof (char) * strlen (optarg) + 1);
- strcpy (client_name, optarg);
- break;
- case 's':
- server_name = (char *) malloc (sizeof (char) * strlen (optarg) + 1);
- strcpy (server_name, optarg);
- options |= JackServerName;
- break;
- case ':':
- fprintf (stderr, "Option -%c requires an operand\n", optopt);
- errflg++;
- break;
- case '?':
- fprintf (stderr, "Unrecognized option: -%c\n", optopt);
- errflg++;
- }
- }
- if (errflg) {
- printUsage ();
- exit (2);
- }
-
- capture_channels = capture_channels_audio + capture_channels_midi;
- playback_channels = playback_channels_audio + playback_channels_midi;
-
- outsockfd = socket (AF_INET, SOCK_DGRAM, 0);
- insockfd = socket (AF_INET, SOCK_DGRAM, 0);
-
- if ((outsockfd == -1) || (insockfd == -1)) {
- fprintf (stderr, "can not open sockets\n" );
- return 1;
- }
-
- init_sockaddr_in ((struct sockaddr_in *) &destaddr, peer_ip, peer_port);
- if (bind_port) {
- init_sockaddr_in ((struct sockaddr_in *) &bindaddr, NULL, bind_port);
- if( bind (outsockfd, &bindaddr, sizeof (bindaddr)) ) {
- fprintf (stderr, "bind failure\n" );
- }
- }
- if (reply_port) {
- init_sockaddr_in ((struct sockaddr_in *) &bindaddr, NULL, reply_port);
- if( bind (insockfd, &bindaddr, sizeof (bindaddr)) ) {
- fprintf (stderr, "bind failure\n" );
- }
- }
-
- /* try to become a client of the JACK server */
- client = jack_client_open (client_name, options, &status, server_name);
- if (client == NULL) {
- fprintf (stderr, "jack_client_open() failed, status = 0x%2.0x\n"
- "Is the JACK server running ?\n", status);
- return 1;
- }
-
- /* Set up jack callbacks */
- jack_set_process_callback (client, process, 0);
- jack_set_sync_callback (client, sync_cb, 0);
- jack_set_freewheel_callback (client, freewheel_cb, 0);
- jack_on_shutdown (client, jack_shutdown, 0);
-
- alloc_ports (capture_channels_audio, playback_channels_audio, capture_channels_midi, playback_channels_midi);
-
- if( bitdepth == 1000 || bitdepth == 999)
- net_period = (factor * jack_get_buffer_size(client) * 1024 / jack_get_sample_rate(client) / 8) & (~1) ;
- else
- net_period = ceilf((float) jack_get_buffer_size (client) / (float) factor);
-
- int rx_bufsize = get_sample_size (bitdepth) * capture_channels * net_period + sizeof (jacknet_packet_header);
- packcache = packet_cache_new (latency + 50, rx_bufsize, mtu);
-
- /* tell the JACK server that we are ready to roll */
- if (jack_activate (client)) {
- fprintf (stderr, "Cannot activate client");
- return 1;
- }
-
- /* Now sleep forever... and evaluate the state_ vars */
-
- signal( SIGTERM, sigterm_handler );
- signal( SIGINT, sigterm_handler );
-
- statecopy_connected = 2; // make it report unconnected on start.
- statecopy_latency = state_latency;
- statecopy_netxruns = state_netxruns;
-
- while ( !quit ) {
-#ifdef WIN32
- Sleep (1000);
-#else
- sleep(1);
-#endif
- if (statecopy_connected != state_connected) {
- statecopy_connected = state_connected;
- if (statecopy_connected) {
- state_netxruns = 1; // We want to reset the netxrun count on each new connection
- printf ("Connected :-)\n");
- } else
- printf ("Not Connected\n");
-
- fflush(stdout);
- }
-
- if (statecopy_connected) {
- if (statecopy_netxruns != state_netxruns) {
- statecopy_netxruns = state_netxruns;
- printf ("%s: at frame %06d -> total netxruns %d (%d%%) queue time= %d\n",
- client_name,
- state_currentframe,
- statecopy_netxruns,
- 100 * statecopy_netxruns / state_currentframe,
- state_recv_packet_queue_time);
-
- fflush(stdout);
- }
- } else {
- if (statecopy_latency != state_latency) {
- statecopy_latency = state_latency;
- if (statecopy_latency > 1)
- printf ("current latency %d\n", statecopy_latency);
- fflush(stdout);
- }
- }
- }
-
- jack_client_close (client);
- packet_cache_free (packcache);
- exit (0);
-}
diff --git a/example-clients/property.c b/example-clients/property.c
deleted file mode 100644
index 4d5e2a22..00000000
--- a/example-clients/property.c
+++ /dev/null
@@ -1,326 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <string.h>
-#include <getopt.h>
-
-#include <jack/jack.h>
-#include <jack/metadata.h>
-#include <jack/uuid.h>
-#include <jack/session.h>
-
-static int subject_is_client = 0;
-static int subject_is_port = 0;
-static jack_uuid_t uuid = JACK_UUID_EMPTY_INITIALIZER;
-static char* subject = NULL;
-
-static void
-show_usage (void)
-{
- fprintf (stderr, "\nUsage: jack_property [options] UUID [ key [ value [ type ] ] ]\n");
- fprintf (stderr, "Set/Display JACK properties (metadata).\n\n");
- fprintf (stderr, "Set options:\n");
- fprintf (stderr, " -s, --set Set property \"key\" to \"value\" for \"UUID\" with optional MIME type \"type\"\n");
- fprintf (stderr, " -d, --delete Remove/delete property \"key\" for \"UUID\"\n");
- fprintf (stderr, " -d, --delete UUID Remove/delete all properties for \"UUID\"\n");
- fprintf (stderr, " -D, --delete-all Remove/delete all properties\n");
- fprintf (stderr, " --client Interpret UUID as a client name, not a UUID\n");
- fprintf (stderr, " --port \tInterpret UUID as a port name, not a UUID\n");
- fprintf (stderr, "\nDisplay options:\n");
- fprintf (stderr, " -l Show all properties\n");
- fprintf (stderr, " -l, --list UUID \tShow value for all properties of UUID\n");
- fprintf (stderr, " -l, --list UUID key Show value for key of UUID\n");
- fprintf (stderr, "\nFor more information see https://jackaudio.org/\n");
-}
-
-static int
-get_subject (jack_client_t* client, char* argv[], int* optind)
-{
- if (subject_is_client) {
- char* cstr = argv[(*optind)++];
- char* ustr;
-
- if ((ustr = jack_get_uuid_for_client_name (client, cstr)) == NULL) {
- fprintf (stderr, "cannot get UUID for client named %s\n", cstr);
- return -1;
- }
-
- if (jack_uuid_parse (ustr, &uuid)) {
- fprintf (stderr, "cannot parse client UUID as UUID '%s' '%s'\n", cstr, ustr);
- return -1;
- }
-
- subject = cstr;
-
- } else if (subject_is_port) {
-
- char* pstr = argv[(*optind)++];
- jack_port_t* port;
-
- if ((port = jack_port_by_name (client, pstr)) == NULL) {
- fprintf (stderr, "cannot find port name %s\n", pstr);
- return -1;
- }
-
- uuid = jack_port_uuid (port);
- subject = pstr;
-
- } else {
- char* str = argv[(*optind)++];
-
- if (jack_uuid_parse (str, &uuid)) {
- fprintf (stderr, "cannot parse subject as UUID\n");
- return -1;
- }
-
- subject = str;
- }
-
- return 0;
-}
-
-int main (int argc, char* argv[])
-{
- jack_client_t* client = NULL;
- jack_options_t options = JackNoStartServer;
- char* key = NULL;
- char* value = NULL;
- char* type = NULL;
- int set = 1;
- int delete = 0;
- int delete_all = 0;
- int c;
- int option_index;
- extern int optind;
- struct option long_options[] = {
- { "set", 0, 0, 's' },
- { "delete", 0, 0, 'd' },
- { "delete-all", 0, 0, 'D' },
- { "list", 0, 0, 'l' },
- { "client", 0, 0, 'c' },
- { "port", 0, 0, 'p' },
- { 0, 0, 0, 0 }
- };
-
- if (argc < 2) {
- show_usage ();
- exit (1);
- }
-
- while ((c = getopt_long (argc, argv, "sdDlaApc", long_options, &option_index)) >= 0) {
- switch (c) {
- case 's':
- if (argc < 5) {
- show_usage ();
- exit (1);
- }
- set = 1;
- break;
- case 'd':
- if (argc < 3) {
- show_usage ();
- return 1;
- }
- set = 0;
- delete = 1;
- break;
-
- case 'D':
- delete = 0;
- set = 0;
- delete_all = 1;
- break;
-
- case 'l':
- set = 0;
- delete = 0;
- delete_all = 0;
- break;
-
- case 'p':
- subject_is_port = 1;
- break;
-
- case 'c':
- subject_is_client = 1;
- break;
-
- case '?':
- default:
- show_usage ();
- exit (1);
- }
- }
-
- if ((client = jack_client_open ("jack-property", options, NULL)) == 0) {
- fprintf (stderr, "Cannot connect to JACK server\n");
- exit (1);
- }
-
- if (delete_all) {
-
- if (jack_remove_all_properties (client) == 0) {
- printf ("JACK metadata successfully delete\n");
- exit (0);
- }
- exit (1);
- }
-
- if (delete) {
-
- int args_left = argc - optind;
-
- if (args_left < 1) {
- show_usage ();
- exit (1);
- }
-
- /* argc == 3: delete all properties for a subject
- argc == 4: delete value of key for subject
- */
-
- if (args_left >= 2) {
-
- if (get_subject (client, argv, &optind)) {
- return 1;
- }
-
- key = argv[optind++];
-
- if (jack_remove_property (client, uuid, key)) {
- fprintf (stderr, "\"%s\" property not removed for %s\n", key, subject);
- exit (1);
- }
-
- } else {
-
- if (get_subject (client, argv, &optind)) {
- return 1;
- }
-
- if (jack_remove_properties (client, uuid) < 0) {
- fprintf (stderr, "cannot remove properties for UUID %s\n", subject);
- exit (1);
- }
- }
-
- } else if (set) {
-
- int args_left = argc - optind;
-
- if (get_subject (client, argv, &optind)) {
- return -1;
- }
-
- key = argv[optind++];
- value = argv[optind++];
-
- if (args_left >= 3) {
- type = argv[optind++];
- } else {
- type = "";
- }
-
- if (jack_set_property (client, uuid, key, value, type)) {
- fprintf (stderr, "cannot set value for key %s of %s\n", key, subject);
- exit (1);
- }
-
- } else {
-
- /* list properties */
-
- int args_left = argc - optind;
-
- if (args_left >= 2) {
-
- /* list properties for a UUID/key pair */
-
- if (get_subject (client, argv, &optind)) {
- return -1;
- }
-
- key = argv[optind++];
-
- if (jack_get_property (uuid, key, &value, &type) == 0) {
- printf ("%s\n", value);
- free (value);
- if (type) {
- free (type);
- }
- } else {
- fprintf (stderr, "Value not found for %s of %s\n", key, subject);
- exit (1);
- }
-
- } else if (args_left == 1) {
-
- /* list all properties for a given UUID */
-
- jack_description_t description;
- int cnt, n;
-
- if (get_subject (client, argv, &optind)) {
- return -1;
- }
-
- if ((cnt = jack_get_properties (uuid, &description)) < 0) {
- fprintf (stderr, "could not retrieve properties for %s\n", subject);
- exit (1);
- }
-
- for (n = 0; n < cnt; ++n) {
- if (description.properties[n].type) {
- printf ("key: %s value: %s type: %s\n",
- description.properties[n].key,
- description.properties[n].data,
- description.properties[n].type);
- } else {
- printf ("key: %s value: %s\n",
- description.properties[n].key,
- description.properties[n].data);
- }
- }
-
- jack_free_description (&description, 0);
-
- } else {
-
- /* list all properties */
-
- jack_description_t* description;
- int cnt, n;
- size_t p;
- char buf[JACK_UUID_STRING_SIZE];
-
- if ((cnt = jack_get_all_properties (&description)) < 0) {
- fprintf (stderr, "could not retrieve all properties\n");
- exit (1);
- }
-
- for (n = 0; n < cnt; ++n) {
- jack_uuid_unparse (description[n].subject, buf);
- printf ("%s\n", buf);
- for (p = 0; p < description[n].property_cnt; ++p) {
- if (description[n].properties[p].type) {
- printf ("key: %s value: %s type: %s\n",
- description[n].properties[p].key,
- description[n].properties[p].data,
- description[n].properties[p].type);
- } else {
- printf ("key: %s value: %s\n",
- description[n].properties[p].key,
- description[n].properties[p].data);
- }
- }
- jack_free_description (&description[n], 0);
- }
-
- free (description);
- }
- }
-
-
- (void) jack_client_close (client);
- return 0;
-}
diff --git a/example-clients/samplerate.c b/example-clients/samplerate.c
deleted file mode 100644
index 88b5c31a..00000000
--- a/example-clients/samplerate.c
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * smaplerate.c -- get current samplerate
- *
- * Copyright (C) 2003 Jack O'Quin.
- *
- * 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 <stdio.h>
-#include <errno.h>
-#include <unistd.h>
-#include <signal.h>
-#include <stdlib.h>
-#include <string.h>
-#include <jack/jack.h>
-#include <jack/transport.h>
-
-char *package; /* program name */
-jack_client_t *client;
-
-void jack_shutdown(void *arg)
-{
- fprintf(stderr, "JACK shut down, exiting ...\n");
- exit(1);
-}
-
-void signal_handler(int sig)
-{
- jack_client_close(client);
- fprintf(stderr, "signal received, exiting ...\n");
- exit(0);
-}
-
-void parse_arguments(int argc, char *argv[])
-{
-
- /* basename $0 */
- package = strrchr(argv[0], '/');
- if (package == 0)
- package = argv[0];
- else
- package++;
-
- if (argc==1) {
- return;
- }
- fprintf(stderr, "usage: %s\n", package);
- exit(9);
-}
-
-int main(int argc, char *argv[])
-{
- parse_arguments(argc, argv);
-
- /* become a JACK client */
- if ((client = jack_client_open(package, JackNullOption, NULL)) == 0) {
- fprintf(stderr, "JACK server not running?\n");
- exit(1);
- }
-
-#ifndef WIN32
- signal(SIGQUIT, signal_handler);
- signal(SIGHUP, signal_handler);
-#endif
- signal(SIGTERM, signal_handler);
- signal(SIGINT, signal_handler);
-
- jack_on_shutdown(client, jack_shutdown, 0);
-
- fprintf(stdout, "%d\n", jack_get_sample_rate( client ) );
-
- jack_client_close(client);
-
- return 0;
-}
diff --git a/example-clients/session_notify.c b/example-clients/session_notify.c
deleted file mode 100644
index 9f96c261..00000000
--- a/example-clients/session_notify.c
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
- * session_notify.c -- ultra minimal session manager
- *
- * Copyright (C) 2018 Karl Linden <karl.j.linden@gmail.com>
- * Copyright (C) 2010 Torben Hohn.
- *
- * 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 <alloca.h>
-#include <stdio.h>
-#include <errno.h>
-#include <unistd.h>
-#include <signal.h>
-#include <stdlib.h>
-#include <string.h>
-#include <jack/jack.h>
-#include <jack/jslist.h>
-#include <jack/transport.h>
-#include <jack/session.h>
-
-char *package; /* program name */
-jack_client_t *client;
-
-jack_session_event_type_t notify_type;
-char *save_path = NULL;
-
-void jack_shutdown(void *arg)
-{
- fprintf(stderr, "JACK shut down, exiting ...\n");
- exit(1);
-}
-
-void signal_handler(int sig)
-{
- jack_client_close(client);
- fprintf(stderr, "signal received, exiting ...\n");
- exit(0);
-}
-
-void parse_arguments(int argc, char *argv[])
-{
-
- /* basename $0 */
- package = strrchr(argv[0], '/');
- if (package == 0)
- package = argv[0];
- else
- package++;
-
- if (argc==2) {
- if( !strcmp( argv[1], "quit" ) ) {
- notify_type = JackSessionSaveAndQuit;
- return;
- }
- }
- if (argc==3) {
- if( !strcmp( argv[1], "save" ) ) {
- notify_type = JackSessionSave;
- save_path = argv[2];
- return;
- }
-
- }
- fprintf(stderr, "usage: %s quit|save [path]\n", package);
- exit(9);
-}
-
-typedef struct {
- char name[32];
- char uuid[16];
-} uuid_map_t;
-
-JSList *uuid_map = NULL;
-
-void add_uuid_mapping( const char *uuid ) {
- char *clientname = jack_get_client_name_by_uuid( client, uuid );
- if( !clientname ) {
- printf( "error... can not find client for uuid" );
- return;
- }
-
- uuid_map_t *mapping = malloc( sizeof(uuid_map_t) );
- snprintf( mapping->uuid, sizeof(mapping->uuid), "%s", uuid );
- snprintf( mapping->name, sizeof(mapping->name), "%s", clientname );
- uuid_map = jack_slist_append( uuid_map, mapping );
-}
-
-char *map_port_name_to_uuid_port( const char *port_name )
-{
- JSList *node;
- char retval[300];
- char *port_component = strchr( port_name,':' );
- char *client_component = strdup( port_name );
- strchr( client_component, ':' )[0] = '\0';
-
- sprintf( retval, "%s", port_name );
-
- for( node=uuid_map; node; node=jack_slist_next(node) ) {
- uuid_map_t *mapping = node->data;
- if( !strcmp( mapping->name, client_component ) ) {
- sprintf( retval, "%s%s", mapping->uuid, port_component );
- break;
- }
- }
-
- return strdup(retval);
-}
-
-int main(int argc, char *argv[])
-{
- parse_arguments(argc, argv);
- jack_session_command_t *retval;
- int k,i,j;
-
-
- /* become a JACK client */
- if ((client = jack_client_open(package, JackNullOption, NULL)) == 0) {
- fprintf(stderr, "JACK server not running?\n");
- exit(1);
- }
-
-#ifndef WIN32
- signal(SIGQUIT, signal_handler);
- signal(SIGHUP, signal_handler);
-#endif
-
- signal(SIGTERM, signal_handler);
- signal(SIGINT, signal_handler);
-
- jack_on_shutdown(client, jack_shutdown, 0);
-
- jack_activate(client);
-
-
- retval = jack_session_notify( client, NULL, notify_type, save_path );
- for (i = 0; retval[i].uuid; i++) {
- printf( "export SESSION_DIR=\"%s%s/\"\n", save_path, retval[i].client_name );
- printf( "%s &\n", retval[i].command );
- add_uuid_mapping(retval[i].uuid);
- }
-
- printf( "sleep 10\n" );
-
- for (k = 0; retval[k].uuid; k++) {
-
- char* port_regexp = alloca( jack_client_name_size()+3 );
- char* client_name = jack_get_client_name_by_uuid( client, retval[k].uuid );
- snprintf( port_regexp, jack_client_name_size()+3, "%s:.*", client_name );
- jack_free(client_name);
- const char **ports = jack_get_ports( client, port_regexp, NULL, 0 );
- if( !ports ) {
- continue;
- }
- for (i = 0; ports[i]; ++i) {
- const char **connections;
- if ((connections = jack_port_get_all_connections (client, jack_port_by_name(client, ports[i]))) != 0) {
- for (j = 0; connections[j]; j++) {
- char *src = map_port_name_to_uuid_port( ports[i] );
- char *dst = map_port_name_to_uuid_port( connections[j] );
- printf( "jack_connect -u \"%s\" \"%s\"\n", src, dst );
- }
- jack_free (connections);
- }
- }
- jack_free(ports);
-
- }
- jack_session_commands_free(retval);
-
- jack_client_close(client);
-
- return 0;
-}
diff --git a/example-clients/transport.c b/example-clients/transport.c
deleted file mode 100644
index ca5692e0..00000000
--- a/example-clients/transport.c
+++ /dev/null
@@ -1,508 +0,0 @@
-/*
- * transport.c -- JACK transport master example client.
- *
- * Copyright (C) 2003 Jack O'Quin.
- *
- * 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 <stdio.h>
-#include <errno.h>
-#include <unistd.h>
-#include <signal.h>
-#include <stdlib.h>
-#include <string.h>
-#if HAVE_READLINE
-#include <readline/readline.h>
-#include <readline/history.h>
-#endif
-#include <jack/jack.h>
-#include <jack/transport.h>
-
-/* Use a copy of the readline macro whitespace if it does not exist.
- * Not all readline compatible libraries supply the whitespace macro
- * (libedit for example), so pull in the copy in those cases too. */
-#if !HAVE_READLINE || !defined(whitespace)
-#define whitespace(c) (((c) == ' ') || ((c) == '\t'))
-#endif
-
-char *package; /* program name */
-int done = 0;
-jack_client_t *client;
-
-/* Time and tempo variables. These are global to the entire,
- * transport timeline. There is no attempt to keep a true tempo map.
- * The default time signature is: "march time", 4/4, 120bpm
- */
-float time_beats_per_bar = 4.0;
-float time_beat_type = 4.0;
-double time_ticks_per_beat = 1920.0;
-double time_beats_per_minute = 120.0;
-volatile int time_reset = 1; /* true when time values change */
-
-/* JACK timebase callback.
- *
- * Runs in the process thread. Realtime, must not wait.
- */
-static void timebase(jack_transport_state_t state, jack_nframes_t nframes,
- jack_position_t *pos, int new_pos, void *arg)
-{
- double min; /* minutes since frame 0 */
- long abs_tick; /* ticks since frame 0 */
- long abs_beat; /* beats since frame 0 */
-
- if (new_pos || time_reset) {
-
- pos->valid = JackPositionBBT;
- pos->beats_per_bar = time_beats_per_bar;
- pos->beat_type = time_beat_type;
- pos->ticks_per_beat = time_ticks_per_beat;
- pos->beats_per_minute = time_beats_per_minute;
-
- time_reset = 0; /* time change complete */
-
- /* Compute BBT info from frame number. This is relatively
- * simple here, but would become complex if we supported tempo
- * or time signature changes at specific locations in the
- * transport timeline. */
-
- min = pos->frame / ((double) pos->frame_rate * 60.0);
- abs_tick = min * pos->beats_per_minute * pos->ticks_per_beat;
- abs_beat = abs_tick / pos->ticks_per_beat;
-
- pos->bar = abs_beat / pos->beats_per_bar;
- pos->beat = abs_beat - (pos->bar * pos->beats_per_bar) + 1;
- pos->tick = abs_tick - (abs_beat * pos->ticks_per_beat);
- pos->bar_start_tick = pos->bar * pos->beats_per_bar *
- pos->ticks_per_beat;
- pos->bar++; /* adjust start to bar 1 */
-
-#if 0
- /* some debug code... */
- fprintf(stderr, "\nnew position: %" PRIu32 "\tBBT: %3"
- PRIi32 "|%" PRIi32 "|%04" PRIi32 "\n",
- pos->frame, pos->bar, pos->beat, pos->tick);
-#endif
-
- } else {
-
- /* Compute BBT info based on previous period. */
- pos->tick +=
- nframes * pos->ticks_per_beat * pos->beats_per_minute
- / (pos->frame_rate * 60);
-
- while (pos->tick >= pos->ticks_per_beat) {
- pos->tick -= pos->ticks_per_beat;
- if (++pos->beat > pos->beats_per_bar) {
- pos->beat = 1;
- ++pos->bar;
- pos->bar_start_tick +=
- pos->beats_per_bar
- * pos->ticks_per_beat;
- }
- }
- }
-}
-
-static void jack_shutdown(void *arg)
-{
-#if defined(RL_READLINE_VERSION) && RL_READLINE_VERSION >= 0x0400
- rl_cleanup_after_signal();
-#endif
- fprintf(stderr, "JACK shut down, exiting ...\n");
- exit(1);
-}
-
-static void signal_handler(int sig)
-{
- jack_client_close(client);
- fprintf(stderr, "signal received, exiting ...\n");
- exit(0);
-}
-
-/* Command functions: see commands[] table following. */
-
-static void com_activate(char *arg)
-{
- if (jack_activate(client)) {
- fprintf(stderr, "cannot activate client");
- }
-}
-
-static void com_deactivate(char *arg)
-{
- if (jack_deactivate(client)) {
- fprintf(stderr, "cannot deactivate client");
- }
-}
-
-static void com_exit(char *arg)
-{
- done = 1;
-}
-
-static void com_help(char *); /* forward declaration */
-
-static void com_locate(char *arg)
-{
- jack_nframes_t frame = 0;
-
- if (*arg != '\0')
- frame = atoi(arg);
-
- jack_transport_locate(client, frame);
-}
-
-static void com_master(char *arg)
-{
- int cond = (*arg != '\0');
- if (jack_set_timebase_callback(client, cond, timebase, NULL) != 0)
- fprintf(stderr, "Unable to take over timebase.\n");
-}
-
-static void com_play(char *arg)
-{
- jack_transport_start(client);
-}
-
-static void com_release(char *arg)
-{
- jack_release_timebase(client);
-}
-
-static void com_stop(char *arg)
-{
- jack_transport_stop(client);
-}
-
-/* Change the tempo for the entire timeline, not just from the current
- * location. */
-static void com_tempo(char *arg)
-{
- float tempo = 120.0;
-
- if (*arg != '\0')
- tempo = atof(arg);
-
- time_beats_per_minute = tempo;
- time_reset = 1;
-}
-
-/* Set sync timeout in seconds. */
-static void com_timeout(char *arg)
-{
- double timeout = 2.0;
-
- if (*arg != '\0')
- timeout = atof(arg);
-
- jack_set_sync_timeout(client, (jack_time_t) (timeout*1000000));
-}
-
-/* Toggle between play and stop state */
-static void com_toggle(char *arg)
-{
- jack_position_t current;
- jack_transport_state_t transport_state;
-
- transport_state = jack_transport_query (client, &current);
-
- switch (transport_state) {
- case JackTransportStopped:
- com_play( arg );
- break;
- case JackTransportRolling:
- com_stop( arg );
- break;
- case JackTransportStarting:
- fprintf(stderr, "state: Starting - no transport toggling");
- break;
- default:
- fprintf(stderr, "unexpected state: no transport toggling");
- }
-}
-
-
-/* Command parsing based on GNU readline info examples. */
-
-typedef void cmd_function_t(char *); /* command function type */
-
-/* Transport command table. */
-typedef struct {
- char *name; /* user printable name */
- cmd_function_t *func; /* function to call */
- char *doc; /* documentation */
-} command_t;
-
-/* command table must be in alphabetical order */
-command_t commands[] = {
- {"activate", com_activate, "Call jack_activate()"},
- {"exit", com_exit, "Exit transport program"},
- {"deactivate", com_deactivate, "Call jack_deactivate()"},
- {"help", com_help, "Display help text [<command>]"},
- {"locate", com_locate, "Locate to frame <position>"},
- {"master", com_master, "Become timebase master "
- "[<conditionally>]"},
- {"play", com_play, "Start transport rolling"},
- {"quit", com_exit, "Synonym for `exit'"},
- {"release", com_release, "Release timebase"},
- {"stop", com_stop, "Stop transport"},
- {"tempo", com_tempo, "Set beat tempo <beats_per_min>"},
- {"timeout", com_timeout, "Set sync timeout in <seconds>"},
- {"toggle", com_toggle, "Toggle transport rolling"},
- {"?", com_help, "Synonym for `help'" },
- {(char *)NULL, (cmd_function_t *)NULL, (char *)NULL }
-};
-
-static command_t *find_command(char *name)
-{
- register int i;
- size_t namelen;
-
- if ((name == NULL) || (*name == '\0'))
- return ((command_t *)NULL);
-
- namelen = strlen(name);
- for (i = 0; commands[i].name; i++)
- if (strncmp(name, commands[i].name, namelen) == 0) {
-
- /* make sure the match is unique */
- if ((commands[i+1].name) &&
- (strncmp(name, commands[i+1].name, namelen) == 0))
- return ((command_t *)NULL);
- else
- return (&commands[i]);
- }
-
- return ((command_t *)NULL);
-}
-
-static void com_help(char *arg)
-{
- register int i;
- command_t *cmd;
-
- if (!*arg) {
- /* print help for all commands */
- for (i = 0; commands[i].name; i++) {
- printf("%s\t\t%s.\n", commands[i].name,
- commands[i].doc);
- }
-
- } else if ((cmd = find_command(arg))) {
- printf("%s\t\t%s.\n", cmd->name, cmd->doc);
-
- } else {
- int printed = 0;
-
- printf("No `%s' command. Valid command names are:\n", arg);
-
- for (i = 0; commands[i].name; i++) {
- /* Print in six columns. */
- if (printed == 6) {
- printed = 0;
- printf ("\n");
- }
-
- printf ("%s\t", commands[i].name);
- printed++;
- }
-
- printf("\n\nTry `help [command]\' for more information.\n");
- }
-}
-
-static void execute_command(char *line)
-{
- register int i;
- command_t *command;
- char *word;
-
- /* Isolate the command word. */
- i = 0;
- while (line[i] && whitespace(line[i]))
- i++;
- word = line + i;
-
- while (line[i] && !whitespace(line[i]))
- i++;
-
- if (line[i])
- line[i++] = '\0';
-
- command = find_command(word);
-
- if (!command) {
- fprintf(stderr, "%s: No such command. There is `help\'.\n",
- word);
- return;
- }
-
- /* Get argument to command, if any. */
- while (whitespace(line[i]))
- i++;
-
- word = line + i;
-
- /* invoke the command function. */
- (*command->func)(word);
-}
-
-
-/* Strip whitespace from the start and end of string. */
-static char *stripwhite(char *string)
-{
- register char *s, *t;
-
- s = string;
- while (whitespace(*s))
- s++;
-
- if (*s == '\0')
- return s;
-
- t = s + strlen (s) - 1;
- while (t > s && whitespace(*t))
- t--;
- *++t = '\0';
-
- return s;
-}
-
-static char *dupstr(char *s)
-{
- char *r = malloc(strlen(s) + 1);
- strcpy(r, s);
- return r;
-}
-
-/* Readline generator function for command completion. */
-static char *command_generator (const char *text, int state)
-{
- static int list_index, len;
- char *name;
-
- /* If this is a new word to complete, initialize now. This
- includes saving the length of TEXT for efficiency, and
- initializing the index variable to 0. */
- if (!state) {
- list_index = 0;
- len = strlen (text);
- }
-
- /* Return the next name which partially matches from the
- command list. */
- while ((name = commands[list_index].name)) {
- list_index++;
-
- if (strncmp(name, text, len) == 0)
- return dupstr(name);
- }
-
- return (char *) NULL; /* No names matched. */
-}
-
-static void command_loop()
-{
-#if HAVE_READLINE
- char *line, *cmd;
- char prompt[32];
-
- snprintf(prompt, sizeof(prompt), "%s> ", package);
-
- /* Allow conditional parsing of the ~/.inputrc file. */
- rl_readline_name = package;
-
- /* Define a custom completion function. */
- rl_completion_entry_function = command_generator;
-#else
- char line[64] = {0,};
- char *cmd = NULL;
-#endif
-
- /* Read and execute commands until the user quits. */
- while (!done) {
-
-#if HAVE_READLINE
- line = readline(prompt);
-
- if (line == NULL) { /* EOF? */
- printf("\n"); /* close out prompt */
- done = 1;
- break;
- }
-#else
- printf("%s> ", package);
- fgets(line, sizeof(line), stdin);
- line[strlen(line)-1] = '\0';
-#endif
-
- /* Remove leading and trailing whitespace from the line. */
- cmd = stripwhite(line);
-
- /* If anything left, add to history and execute it. */
- if (*cmd)
- {
-#if HAVE_READLINE
- add_history(cmd);
-#endif
- execute_command(cmd);
- }
-
-#if HAVE_READLINE
- free(line); /* realine() called malloc() */
-#endif
- }
-}
-
-int main(int argc, char *argv[])
-{
- jack_status_t status;
-
- /* basename $0 */
- package = strrchr(argv[0], '/');
- if (package == 0)
- package = argv[0];
- else
- package++;
-
- /* open a connection to the JACK server */
- client = jack_client_open (package, JackNullOption, &status);
- if (client == NULL) {
- fprintf (stderr, "jack_client_open() failed, "
- "status = 0x%2.0x\n", status);
- return 1;
- }
-
-#if !WIN32
- signal(SIGQUIT, signal_handler);
- signal(SIGHUP, signal_handler);
-#endif
- signal(SIGTERM, signal_handler);
- signal(SIGINT, signal_handler);
-
- jack_on_shutdown(client, jack_shutdown, 0);
-
- if (jack_activate(client)) {
- fprintf(stderr, "cannot activate client");
- return 1;
- }
-
- /* execute commands until done */
- command_loop();
-
- jack_client_close(client);
- exit(0);
-}
diff --git a/example-clients/tw.c b/example-clients/tw.c
deleted file mode 100644
index edc7ef31..00000000
--- a/example-clients/tw.c
+++ /dev/null
@@ -1,264 +0,0 @@
-/** @file tw.c
- *
- * @brief This simple client demonstrates the basic features of JACK
- * as they would be used by many applications.
- */
-
-#include <stdio.h>
-#include <errno.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <string.h>
-#include <signal.h>
-
-#include <jack/jack.h>
-
-jack_port_t *input_port;
-jack_port_t *output_port;
-jack_client_t *client;
-
-/* a simple state machine for this client */
-volatile enum {
- Init,
- Run,
- Exit
-} client_state = Init;
-
-static void signal_handler(int sig)
-{
- jack_client_close(client);
- fprintf(stderr, "signal received, exiting ...\n");
- exit(0);
-}
-
-/**
- * The process callback for this JACK application is called in a
- * special realtime thread once for each audio cycle.
- *
- * This client follows a simple rule: when the JACK transport is
- * running, copy the input port to the output. When it stops, exit.
- */
-static int
-_process (jack_nframes_t nframes)
-{
- jack_default_audio_sample_t *in, *out;
- jack_transport_state_t ts = jack_transport_query(client, NULL);
-
- if (ts == JackTransportRolling) {
-
- if (client_state == Init)
- client_state = Run;
-
- in = jack_port_get_buffer (input_port, nframes);
- out = jack_port_get_buffer (output_port, nframes);
- memcpy (out, in,
- sizeof (jack_default_audio_sample_t) * nframes);
-
- } else if (ts == JackTransportStopped) {
-
- if (client_state == Run) {
- client_state = Exit;
- return -1; // to stop the thread
- }
- }
-
- return 0;
-}
-
-static void* jack_thread(void *arg)
-{
- jack_client_t* client = (jack_client_t*) arg;
-
- while (1) {
-
- jack_nframes_t frames = jack_cycle_wait (client);
- int status = _process(frames);
- jack_cycle_signal (client, status);
-
- /*
- Possibly do something else after signaling next clients in the graph
- */
-
- /* End condition */
- if (status != 0)
- return 0;
- }
-
- /* not reached*/
- return 0;
-}
-
-/*
-static void* jack_thread(void *arg)
-{
- jack_client_t* client = (jack_client_t*) arg;
-
- while (1) {
- jack_nframes_t frames;
- int status;
- // cycle 1
- frames = jack_cycle_wait (client);
- status = _process(frames);
- jack_cycle_signal (client, status);
- // cycle 2
- frames = jack_cycle_wait (client);
- status = _process(frames);
- jack_cycle_signal (client, status);
- // cycle 3
- frames = jack_cycle_wait (client);
- status = _process(frames);
- jack_cycle_signal (client, status);
- // cycle 4
- frames = jack_cycle_wait (client);
- status = _process(frames);
- jack_cycle_signal (client, status);
- }
-
- return 0;
-}
-*/
-
-/**
- * JACK calls this shutdown_callback if the server ever shuts down or
- * decides to disconnect the client.
- */
-static void
-jack_shutdown (void *arg)
-{
- fprintf(stderr, "JACK shut down, exiting ...\n");
- exit (1);
-}
-
-int
-main (int argc, char *argv[])
-{
- const char **ports;
- const char *client_name;
- const char *server_name = NULL;
- jack_options_t options = JackNullOption;
- jack_status_t status;
-
- if (argc >= 2) { /* client name specified? */
- client_name = argv[1];
- if (argc >= 3) { /* server name specified? */
- server_name = argv[2];
- options |= JackServerName;
- }
- } else { /* use basename of argv[0] */
- client_name = strrchr(argv[0], '/');
- if (client_name == 0) {
- client_name = argv[0];
- } else {
- client_name++;
- }
- }
-
- /* open a client connection to the JACK server */
-
- client = jack_client_open (client_name, options, &status, server_name);
- if (client == NULL) {
- fprintf (stderr, "jack_client_open() failed, "
- "status = 0x%2.0x\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);
- }
-
- /* tell the JACK server to call `process()' whenever
- there is work to be done.
- */
- if (jack_set_process_thread(client, jack_thread, client) < 0)
- exit(1);
-
- /* tell the JACK server to call `jack_shutdown()' if
- it ever shuts down, either entirely, or if it
- just decides to stop calling us.
- */
-
- jack_on_shutdown (client, jack_shutdown, 0);
-
- /* display the current sample rate.
- */
-
- printf ("engine sample rate: %" PRIu32 "\n",
- jack_get_sample_rate (client));
-
- /* create two ports */
-
- input_port = jack_port_register (client, "input",
- JACK_DEFAULT_AUDIO_TYPE,
- JackPortIsInput, 0);
- output_port = jack_port_register (client, "output",
- JACK_DEFAULT_AUDIO_TYPE,
- JackPortIsOutput, 0);
-
- if ((input_port == NULL) || (output_port == NULL)) {
- fprintf(stderr, "no more JACK ports available\n");
- exit (1);
- }
-
- /* Tell the JACK server that we are ready to roll. Our
- * process() callback will start running now. */
-
- if (jack_activate (client)) {
- fprintf (stderr, "cannot activate client");
- exit (1);
- }
-
- /* Connect the ports. You can't do this before the client is
- * activated, because we can't make connections to clients
- * that aren't running. Note the confusing (but necessary)
- * orientation of the driver backend ports: playback ports are
- * "input" to the backend, and capture ports are "output" from
- * it.
- */
-
- ports = jack_get_ports (client, NULL, NULL,
- JackPortIsPhysical|JackPortIsOutput);
- if (ports == NULL) {
- fprintf(stderr, "no physical capture ports\n");
- exit (1);
- }
-
- if (jack_connect (client, ports[0], jack_port_name (input_port))) {
- fprintf (stderr, "cannot connect input ports\n");
- }
-
- jack_free (ports);
-
- ports = jack_get_ports (client, NULL, NULL,
- JackPortIsPhysical|JackPortIsInput);
- if (ports == NULL) {
- fprintf(stderr, "no physical playback ports\n");
- exit (1);
- }
-
- if (jack_connect (client, jack_port_name (output_port), ports[0])) {
- fprintf (stderr, "cannot connect output ports\n");
- }
-
- jack_free (ports);
-
- /* install a signal handler to properly quits jack client */
- signal(SIGQUIT, signal_handler);
- signal(SIGTERM, signal_handler);
- signal(SIGHUP, signal_handler);
- signal(SIGINT, signal_handler);
-
- /* keep running until the transport stops */
-
- while (client_state != Exit) {
- sleep (1);
- }
-
- jack_client_close (client);
- exit (0);
-}
diff --git a/example-clients/wait.c b/example-clients/wait.c
deleted file mode 100644
index 6e56cae9..00000000
--- a/example-clients/wait.c
+++ /dev/null
@@ -1,152 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <string.h>
-#include <getopt.h>
-
-#include <time.h>
-
-#include <jack/jack.h>
-
-char * my_name;
-
-void
-show_usage(void)
-{
- fprintf(stderr, "\nUsage: %s [options]\n", my_name);
- fprintf(stderr, "Check for jack existence, or wait, until it either quits, or gets started\n");
- fprintf(stderr, "options:\n");
- fprintf(stderr, " -s, --server <name> Connect to the jack server named <name>\n");
- fprintf(stderr, " -n, --name <name> Set client name to <name>\n");
- fprintf(stderr, " -w, --wait Wait for server to become available\n");
- fprintf(stderr, " -q, --quit Wait until server is quit\n");
- fprintf(stderr, " -c, --check Check whether server is running\n");
- fprintf(stderr, " -t, --timeout Wait timeout in seconds\n");
- fprintf(stderr, " -h, --help Display this help message\n");
- fprintf(stderr, "For more information see http://jackaudio.org/\n");
-}
-
-int
-main(int argc, char *argv[])
-{
- jack_client_t *client;
- jack_status_t status;
- jack_options_t options = JackNoStartServer;
- int c;
- int option_index;
- char *server_name = NULL;
- char *client_name = NULL;
- int wait_for_start = 0;
- int wait_for_quit = 0;
- int just_check = 0;
- int wait_timeout = 0;
- time_t start_timestamp;
-
-
- struct option long_options[] = {
- { "server", 1, 0, 's' },
- { "wait", 0, 0, 'w' },
- { "name", 1, 0, 'n'},
- { "quit", 0, 0, 'q' },
- { "check", 0, 0, 'c' },
- { "timeout", 1, 0, 't' },
- { "help", 0, 0, 'h' },
- { 0, 0, 0, 0 }
- };
-
- my_name = strrchr(argv[0], '/');
- if (my_name == 0) {
- my_name = argv[0];
- } else {
- my_name ++;
- }
-
- while ((c = getopt_long (argc, argv, "s:n:wqct:hv", long_options, &option_index)) >= 0) {
- switch (c) {
- case 's':
- server_name = (char *) malloc (sizeof (char) * (strlen(optarg) + 1));
- strcpy (server_name, optarg);
- options |= JackServerName;
- break;
- case 'n':
- client_name = (char *) malloc (sizeof (char) * (strlen(optarg) + 1));
- strcpy (client_name, optarg);
- break;
- case 'w':
- wait_for_start = 1;
- break;
- case 'q':
- wait_for_quit = 1;
- break;
- case 'c':
- just_check = 1;
- break;
- case 't':
- wait_timeout = atoi(optarg);
- break;
- case 'h':
- show_usage();
- return 1;
- break;
- default:
- show_usage();
- return 1;
- break;
- }
- }
-
- /* try to open server in a loop. breaking under certein conditions */
-
- start_timestamp = time(NULL);
-
- while (1) {
- if (client_name) {
- client = jack_client_open (client_name, options, &status, server_name);
- }
- else {
- client = jack_client_open ("wait", options, &status, server_name);
- }
- /* check for some real error and bail out */
- if ((client == NULL) && !(status & JackServerFailed)) {
- fprintf (stderr, "jack_client_open() failed, "
- "status = 0x%2.0x\n", status);
- return 1;
- }
-
- if (client == NULL) {
- if (wait_for_quit) {
- fprintf(stdout, "server is gone\n");
- break;
- }
- if (just_check) {
- fprintf(stdout, "not running\n");
- break;
- }
- } else {
- jack_client_close(client);
- if (wait_for_start) {
- fprintf(stdout, "server is available\n");
- break;
- }
- if (just_check) {
- fprintf(stdout, "running\n");
- break;
- }
- }
- if (wait_timeout) {
- if ((time(NULL) - start_timestamp) > wait_timeout) {
- fprintf(stdout, "timeout\n");
- exit(EXIT_FAILURE);
- }
- }
-
- // Wait a second, and repeat
-#ifdef WIN32
- Sleep(1*1000);
-#else
- sleep(1);
-#endif
- }
-
- exit(0);
-}
diff --git a/example-clients/wscript b/example-clients/wscript
index a8857aa7..0afc4ba2 100644
--- a/example-clients/wscript
+++ b/example-clients/wscript
@@ -2,35 +2,21 @@
# encoding: utf-8
example_programs = {
- 'jack_freewheel' : 'freewheel.c',
- 'jack_connect' : 'connect.c',
- 'jack_lsp' : 'lsp.c',
+ 'jack_cpu_load' : 'cpu_load.c',
+ 'jack_latent_client' : 'latent_client.c',
'jack_metro' : 'metro.c',
+ 'jack_midi_latency_test' : 'midi_latency_test.c',
'jack_midiseq' : 'midiseq.c',
'jack_midisine' : 'midisine.c',
+ 'jack_net_master' : 'netmaster.c',
+ 'jack_net_slave' : 'netslave.c',
+ 'jack_server_control' : 'server_control.cpp',
'jack_showtime' : 'showtime.c',
+ 'jack_simdtests' : 'simdtests.cpp',
'jack_simple_client' : 'simple_client.c',
- 'jack_zombie' : 'zombie.c',
- 'jack_load' : 'ipload.c',
- 'jack_unload' : 'ipunload.c',
- 'jack_alias' : 'alias.c',
- 'jack_bufsize' : 'bufsize.c',
- 'jack_wait' : 'wait.c',
- 'jack_samplerate' : 'samplerate.c',
- 'jack_evmon' : 'evmon.c',
- 'jack_monitor_client' : 'monitor_client.c',
- 'jack_thru' : 'thru_client.c',
- 'jack_cpu_load' : 'cpu_load.c',
'jack_simple_session_client' : 'simple_session_client.c',
- 'jack_session_notify' : 'session_notify.c',
- 'jack_server_control' : 'server_control.cpp',
- 'jack_net_slave' : 'netslave.c',
- 'jack_net_master' : 'netmaster.c',
- 'jack_latent_client' : 'latent_client.c',
- 'jack_midi_dump' : 'midi_dump.c',
- 'jack_midi_latency_test' : 'midi_latency_test.c',
- 'jack_simdtests' : 'simdtests.cpp',
- 'jack_property' : 'property.c',
+ 'jack_thru' : 'thru_client.c',
+ 'jack_zombie' : 'zombie.c',
}
example_libs = {
@@ -38,12 +24,8 @@ example_libs = {
}
def configure(conf):
- conf.env['BUILD_EXAMPLE_CLIENT_TRANSPORT'] = conf.env['READLINE']
-
conf.env['BUILD_EXAMPLE_CLIENT_REC'] = conf.env['SNDFILE']
- conf.env['BUILD_EXAMPLE_ALSA_IO'] = conf.env['SAMPLERATE'] and conf.env['BUILD_DRIVER_ALSA']
-
def build(bld):
if bld.env['IS_LINUX']:
os_incdir = ['../linux', '../posix']
@@ -83,19 +65,6 @@ def build(bld):
prog.target = example_program
- if bld.env['BUILD_EXAMPLE_CLIENT_TRANSPORT']:
- prog = bld(features = 'c cprogram')
- prog.includes = os_incdir + ['../common/jack', '../common']
- prog.source = 'transport.c'
- prog.use = ['clientlib']
- if bld.env['IS_LINUX']:
- prog.use += ['RT', 'READLINE']
- if bld.env['IS_MACOSX']:
- prog.use += ['READLINE']
- if bld.env['IS_WINDOWS']:
- prog.use += ['READLINE']
- prog.target = 'jack_transport'
-
if bld.env['BUILD_EXAMPLE_CLIENT_REC']:
prog = bld(features = 'c cprogram')
prog.includes = os_incdir + ['../common/jack', '../common']
@@ -111,30 +80,6 @@ def build(bld):
prog.uselib = ['SNDFILE']
prog.target = 'jack_rec'
- if bld.env['IS_LINUX'] or bld.env['IS_MACOSX']:
- prog = bld(features = 'c cprogram')
- prog.includes = os_incdir + ['.', '..', '../common/jack', '../common']
- prog.source = ['netsource.c', '../common/netjack_packet.c']
- prog.env.append_value('CFLAGS', '-DNO_JACK_ERROR')
- prog.use = ['CELT', 'SAMPLERATE', 'OPUS', 'M', 'clientlib']
- prog.target = 'jack_netsource'
- prog.defines = ['HAVE_CONFIG_H']
-
- if bld.env['IS_LINUX'] and bld.env['BUILD_EXAMPLE_ALSA_IO']:
- prog = bld(features = 'c cprogram')
- prog.includes = os_incdir + ['../common/jack', '../common']
- prog.source = ['alsa_in.c', '../common/memops.c']
- prog.env.append_value('CFLAGS', '-DNO_JACK_ERROR')
- prog.use = ['clientlib', 'ALSA', 'SAMPLERATE', 'M']
- prog.target = 'alsa_in'
-
- prog = bld(features = 'c cprogram')
- prog.includes = os_incdir + ['../common/jack', '../common']
- prog.source = ['alsa_out.c', '../common/memops.c']
- prog.env.append_value('CFLAGS', '-DNO_JACK_ERROR')
- prog.use = ['clientlib', 'ALSA', 'SAMPLERATE', 'M']
- prog.target = 'alsa_out'
-
for example_lib, example_lib_source in list(example_libs.items()):
lib = bld(features = 'c cshlib')
if not bld.env['IS_WINDOWS']:
@@ -146,7 +91,3 @@ def build(bld):
lib.env.append_value('LINKFLAGS', '-lm')
lib.use = 'serverlib'
lib.install_path = '${ADDON_DIR}/'
-
- if not bld.env['IS_WINDOWS']:
- bld.symlink_as('${PREFIX}/bin/jack_disconnect', 'jack_connect')
- bld.install_files('${PREFIX}/bin', 'jack_control', chmod=0o755)