From f84821f82145c78bfa0700feffefffca58565fb0 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Wed, 7 Aug 2019 12:58:09 +0200 Subject: [PATCH] jack: improve buffer usage Buffer on the output port are set on the mix once and used for all output mix ios. Find the mix with the buffers and use that on all output mix. --- src/pipewire-jack.c | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/src/pipewire-jack.c b/src/pipewire-jack.c index 27fcf9cfc..fb02c80df 100644 --- a/src/pipewire-jack.c +++ b/src/pipewire-jack.c @@ -1317,7 +1317,7 @@ static int client_node_port_set_io(void *object, ptr = mm->ptr; } - pw_log_debug("port %p: set io:%s id:%u ptr:%p", p, + pw_log_debug("port %p: mix:%d set io:%s id:%u ptr:%p", p, mix_id, spa_debug_type_find_name(spa_type_io, id), id, ptr); switch (id) { @@ -2350,8 +2350,6 @@ void * jack_port_get_buffer (jack_port_t *port, jack_nframes_t frames) struct object *o = (struct object *) port; struct client *c = o->client; struct port *p; - struct buffer *b; - struct spa_io_buffers *io; struct mix *mix; void *ptr = NULL; @@ -2371,18 +2369,22 @@ void * jack_port_get_buffer (jack_port_t *port, jack_nframes_t frames) break; } } else { - b = NULL; - spa_list_for_each(mix, &p->mix, port_link) { - pw_log_trace("port %p: mix %d.%d get buffer %d", - p, p->id, mix->id, frames); - io = mix->io; + struct spa_io_buffers io; - if (mix->n_buffers == 0 || io == NULL) + io.status = -EPIPE; + io.buffer_id = SPA_ID_INVALID; + + spa_list_for_each(mix, &p->mix, port_link) { + struct buffer *b; + + pw_log_trace("port %p: mix %d.%d get buffer %d io:%p n_buffers:%d", + p, p->id, mix->id, frames, mix->io, mix->n_buffers); + + if (mix->n_buffers == 0) continue; if ((b = dequeue_buffer(mix)) == NULL) { pw_log_warn("port %p: out of buffers", p); - io->buffer_id = SPA_ID_INVALID; goto done; } reuse_buffer(c, mix, b->id); @@ -2392,15 +2394,15 @@ void * jack_port_get_buffer (jack_port_t *port, jack_nframes_t frames) b->datas[0].chunk->size = frames * sizeof(float); b->datas[0].chunk->stride = sizeof(float); - io->status = SPA_STATUS_HAVE_BUFFER; - io->buffer_id = b->id; + io.status = SPA_STATUS_HAVE_BUFFER; + io.buffer_id = b->id; break; } spa_list_for_each(mix, &p->mix, port_link) { struct spa_io_buffers *mio = mix->io; if (mio == NULL) continue; - *mio = *io; + *mio = io; } }