diff --git a/example-clients/alsa_in.c b/example-clients/alsa_in.c index c6af131c..9c31a05e 100644 --- a/example-clients/alsa_in.c +++ b/example-clients/alsa_in.c @@ -72,6 +72,7 @@ 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; @@ -306,12 +307,35 @@ 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; @@ -681,6 +705,12 @@ int main (int argc, char *argv[]) { 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. diff --git a/example-clients/alsa_out.c b/example-clients/alsa_out.c index 47779d10..ac7a149c 100644 --- a/example-clients/alsa_out.c +++ b/example-clients/alsa_out.c @@ -72,6 +72,7 @@ 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; @@ -311,12 +312,35 @@ 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; @@ -684,6 +708,12 @@ int main (int argc, char *argv[]) { 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.