From 9c4e5f4e27842e74f433aec4642fafa4f48912d6 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Wed, 2 Oct 2019 18:34:03 +0200 Subject: [PATCH] port: improve buffer handling Remove the buffers_move method, it's not needed. --- src/pipewire/buffers.c | 7 ------- src/pipewire/buffers.h | 1 - src/pipewire/link.c | 24 +++++++++++------------- src/pipewire/port.c | 13 +++++++------ src/pipewire/private.h | 3 ++- 5 files changed, 20 insertions(+), 28 deletions(-) diff --git a/src/pipewire/buffers.c b/src/pipewire/buffers.c index bf66b5fd6..5ed7c52e7 100644 --- a/src/pipewire/buffers.c +++ b/src/pipewire/buffers.c @@ -301,10 +301,3 @@ void pw_buffers_clear(struct pw_buffers *buffers) free(buffers->buffers); spa_zero(*buffers); } - -SPA_EXPORT -void pw_buffers_move(struct pw_buffers *dest, struct pw_buffers *src) -{ - *dest = *src; - spa_zero(*src); -} diff --git a/src/pipewire/buffers.h b/src/pipewire/buffers.h index a23f671be..9b6cb304b 100644 --- a/src/pipewire/buffers.h +++ b/src/pipewire/buffers.h @@ -51,7 +51,6 @@ int pw_buffers_negotiate(struct pw_core *core, uint32_t flags, struct spa_node *innode, uint32_t in_port_id, struct pw_buffers *result); -void pw_buffers_move(struct pw_buffers *dest, struct pw_buffers *src); void pw_buffers_clear(struct pw_buffers *buffers); #ifdef __cplusplus diff --git a/src/pipewire/link.c b/src/pipewire/link.c index 994c59c45..d5c75da69 100644 --- a/src/pipewire/link.c +++ b/src/pipewire/link.c @@ -417,7 +417,6 @@ static int do_allocation(struct pw_link *this) uint32_t in_flags, out_flags; char *error = NULL; struct pw_port *input, *output; - struct pw_buffers allocation = { NULL, }; if (this->info.state > PW_LINK_STATE_ALLOCATING) return 0; @@ -441,9 +440,9 @@ static int do_allocation(struct pw_link *this) input->node->live = true; } - if (output->allocation.n_buffers) { + if (output->buffers.n_buffers) { pw_log_debug(NAME" %p: reusing %d output buffers %p", this, - output->allocation.n_buffers, output->allocation.buffers); + output->buffers.n_buffers, output->buffers.buffers); this->rt.out_mix.have_buffers = true; } else { uint32_t flags, alloc_flags; @@ -460,22 +459,21 @@ static int do_allocation(struct pw_link *this) if ((res = pw_buffers_negotiate(this->core, alloc_flags, output->node->node, output->port_id, input->node->node, input->port_id, - &allocation)) < 0) { + &output->buffers)) < 0) { asprintf(&error, "error alloc buffers: %s", spa_strerror(res)); goto error; } pw_log_debug(NAME" %p: allocating %d buffers %p", this, - allocation.n_buffers, allocation.buffers); + output->buffers.n_buffers, output->buffers.buffers); - if ((res = pw_port_use_buffers(output, &this->rt.out_mix, - flags, allocation.buffers, allocation.n_buffers)) < 0) { + if ((res = pw_port_use_buffers(output, &this->rt.out_mix, flags, + output->buffers.buffers, + output->buffers.n_buffers)) < 0) { asprintf(&error, "error use output buffers: %d (%s)", res, spa_strerror(res)); goto error; } - pw_buffers_move(&output->allocation, &allocation); - if (SPA_RESULT_IS_ASYNC(res)) { res = spa_node_sync(output->node->node, res), pw_work_queue_add(impl->work, output, res, @@ -488,11 +486,11 @@ static int do_allocation(struct pw_link *this) } pw_log_debug(NAME" %p: using %d buffers %p on input port", this, - output->allocation.n_buffers, output->allocation.buffers); + output->buffers.n_buffers, output->buffers.buffers); if ((res = pw_port_use_buffers(input, &this->rt.in_mix, 0, - output->allocation.buffers, - output->allocation.n_buffers)) < 0) { + output->buffers.buffers, + output->buffers.n_buffers)) < 0) { asprintf(&error, "error use input buffers: %d (%s)", res, spa_strerror(res)); goto error; @@ -508,7 +506,7 @@ static int do_allocation(struct pw_link *this) return 0; error: - pw_buffers_clear(&output->allocation); + pw_buffers_clear(&output->buffers); pw_link_update_state(this, PW_LINK_STATE_ERROR, error); return res; } diff --git a/src/pipewire/port.c b/src/pipewire/port.c index e249b9920..d878c6e8f 100644 --- a/src/pipewire/port.c +++ b/src/pipewire/port.c @@ -984,7 +984,8 @@ void pw_port_destroy(struct pw_port *port) pw_log_debug(NAME" %p: free", port); pw_port_emit_free(port); - pw_buffers_clear(&port->allocation); + pw_buffers_clear(&port->buffers); + pw_buffers_clear(&port->mix_buffers); free((void*)port->error); pw_map_clear(&port->mix_port_map); @@ -1165,7 +1166,8 @@ int pw_port_set_param(struct pw_port *port, uint32_t id, uint32_t flags, pw_log_debug(NAME" %p: %d %p %d", port, port->state, param, res); /* setting the format always destroys the negotiated buffers */ - pw_buffers_clear(&port->allocation); + pw_buffers_clear(&port->buffers); + pw_buffers_clear(&port->mix_buffers); if (param == NULL || res < 0) { pw_port_update_state(port, PW_PORT_STATE_CONFIGURE, NULL); @@ -1187,7 +1189,6 @@ static int negotiate_mixer_buffers(struct pw_port *port, uint32_t flags, return 0; if (SPA_FLAG_IS_SET(port->mix_flags, PW_PORT_MIX_FLAG_NEGOTIATE)) { - struct pw_buffers allocation = { NULL, }; int alloc_flags; /* try dynamic data */ @@ -1196,16 +1197,16 @@ static int negotiate_mixer_buffers(struct pw_port *port, uint32_t flags, pw_log_debug(NAME" %p: %d.%d negotiate buffers on node: %p", port, port->direction, port->port_id, node->node); + pw_buffers_clear(&port->mix_buffers); + if ((res = pw_buffers_negotiate(node->core, alloc_flags, port->mix, 0, node->node, port->port_id, - &allocation)) < 0) { + &port->mix_buffers)) < 0) { pw_log_warn(NAME" %p: can't negotiate buffers: %s", port, spa_strerror(res)); return res; } - pw_buffers_clear(&port->mix_buffers); - pw_buffers_move(&port->mix_buffers, &allocation); buffers = port->mix_buffers.buffers; n_buffers = port->mix_buffers.n_buffers; flags = 0; diff --git a/src/pipewire/private.h b/src/pipewire/private.h index 284f0ab7e..381c796c0 100644 --- a/src/pipewire/private.h +++ b/src/pipewire/private.h @@ -565,7 +565,8 @@ struct pw_port { struct pw_port_info info; struct spa_param_info params[MAX_PARAMS]; - struct pw_buffers allocation; + struct pw_buffers buffers; /**< buffers managed by this port, only on + * output ports, shared with all links */ struct spa_list links; /**< list of \ref pw_link */