From eccc7c21bda4c4d5009a15feb8e686591d99d491 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Thu, 29 Jan 2009 23:14:04 +0100 Subject: jack: use loops for allocating/freeing ports/buffers Preparation for supporting other channel numbers than stereo: use loops instead of duplicating code for the second channel. Most likely, gcc will unroll these loops, so the binary won't be any different. --- src/output/jack_plugin.c | 68 +++++++++++++++++++++++------------------------- 1 file changed, 32 insertions(+), 36 deletions(-) diff --git a/src/output/jack_plugin.c b/src/output/jack_plugin.c index 0159aa633..426b693ac 100644 --- a/src/output/jack_plugin.c +++ b/src/output/jack_plugin.c @@ -36,6 +36,10 @@ static const size_t sample_size = sizeof(jack_default_audio_sample_t); +static const char *const port_names[2] = { + "left", "right", +}; + struct jack_data { struct audio_output *ao; @@ -71,14 +75,11 @@ mpd_jack_client_free(struct jack_data *jd) jd->client = NULL; } - if (jd->ringbuffer[0] != NULL) { - jack_ringbuffer_free(jd->ringbuffer[0]); - jd->ringbuffer[0] = NULL; - } - - if (jd->ringbuffer[1] != NULL) { - jack_ringbuffer_free(jd->ringbuffer[1]); - jd->ringbuffer[1] = NULL; + for (unsigned i = 0; i < G_N_ELEMENTS(jd->ringbuffer); ++i) { + if (jd->ringbuffer[i] != NULL) { + jack_ringbuffer_free(jd->ringbuffer[i]); + jd->ringbuffer[i] = NULL; + } } } @@ -123,7 +124,7 @@ mpd_jack_process(jack_nframes_t nframes, void *arg) if (nframes <= 0) return 0; - for (unsigned i = 0; i < 2; ++i) { + for (unsigned i = 0; i < G_N_ELEMENTS(jd->ringbuffer); ++i) { available = jack_ringbuffer_read_space(jd->ringbuffer[i]); assert(available % sample_size == 0); available /= sample_size; @@ -216,8 +217,9 @@ mpd_jack_connect(struct jack_data *jd, struct audio_format *audio_format) { jd->audio_format = audio_format; - jd->ringbuffer[0] = jack_ringbuffer_create(jd->ringbuffer_size); - jd->ringbuffer[1] = jack_ringbuffer_create(jd->ringbuffer_size); + for (unsigned i = 0; i < G_N_ELEMENTS(jd->ringbuffer); ++i) + jd->ringbuffer[i] = + jack_ringbuffer_create(jd->ringbuffer_size); jd->shutdown = false; @@ -230,20 +232,15 @@ mpd_jack_connect(struct jack_data *jd, struct audio_format *audio_format) jack_set_sample_rate_callback(jd->client, mpd_jack_srate, jd); jack_on_shutdown(jd->client, mpd_jack_shutdown, jd); - jd->ports[0] = jack_port_register(jd->client, "left", - JACK_DEFAULT_AUDIO_TYPE, - JackPortIsOutput, 0); - if ( !jd->ports[0] ) { - g_warning("Cannot register left output port."); - return -1; - } - - jd->ports[1] = jack_port_register(jd->client, "right", - JACK_DEFAULT_AUDIO_TYPE, - JackPortIsOutput, 0); - if ( !jd->ports[1] ) { - g_warning("Cannot register right output port."); - return -1; + for (unsigned i = 0; i < G_N_ELEMENTS(jd->ports); ++i) { + jd->ports[i] = jack_port_register(jd->client, port_names[i], + JACK_DEFAULT_AUDIO_TYPE, + JackPortIsOutput, 0); + if (jd->ports[i] == NULL) { + g_warning("Cannot register %s output port.", + port_names[i]); + return -1; + } } if ( jack_activate(jd->client) ) { @@ -271,17 +268,16 @@ mpd_jack_connect(struct jack_data *jd, struct audio_format *audio_format) free(jports); } - if ( (jack_connect(jd->client, jack_port_name(jd->ports[0]), - jd->output_ports[0])) != 0 ) { - g_warning("%s is not a valid Jack Client / Port", - jd->output_ports[0]); - return -1; - } - if ( (jack_connect(jd->client, jack_port_name(jd->ports[0]), - jd->output_ports[1])) != 0 ) { - g_warning("%s is not a valid Jack Client / Port", - jd->output_ports[1]); - return -1; + for (unsigned i = 0; i < G_N_ELEMENTS(jd->ports); ++i) { + int ret; + + ret = jack_connect(jd->client, jack_port_name(jd->ports[i]), + jd->output_ports[i]); + if (ret != 0) { + g_warning("%s is not a valid Jack Client / Port", + jd->output_ports[i]); + return -1; + } } return 1; -- cgit v1.2.3