From ee307e9c48caa039fdfa4b5e4d5f4fa03f7b03ec Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Mon, 3 Dec 2018 17:59:10 +0100 Subject: [PATCH] port: also set buffers when 0 --- src/pipewire/node.c | 4 ++-- src/pipewire/port.c | 21 +++++++++++---------- src/pipewire/remote.c | 9 ++++++--- 3 files changed, 19 insertions(+), 15 deletions(-) diff --git a/src/pipewire/node.c b/src/pipewire/node.c index 95a6c0b02..c9704034f 100644 --- a/src/pipewire/node.c +++ b/src/pipewire/node.c @@ -80,15 +80,14 @@ struct resource_data { static void node_deactivate(struct pw_node *this) { struct pw_port *port; + struct pw_link *link; pw_log_debug("node %p: deactivate", this); spa_list_for_each(port, &this->input_ports, link) { - struct pw_link *link; spa_list_for_each(link, &port->links, input_link) pw_link_deactivate(link); } spa_list_for_each(port, &this->output_ports, link) { - struct pw_link *link; spa_list_for_each(link, &port->links, output_link) pw_link_deactivate(link); } @@ -115,6 +114,7 @@ static int pause_node(struct pw_node *this) pw_log_debug("node %p: pause node", this); node_deactivate(this); + pw_loop_invoke(this->data_loop, do_node_remove, 1, NULL, 0, true, this); res = spa_node_send_command(this->node, diff --git a/src/pipewire/port.c b/src/pipewire/port.c index 1fa623cbc..797b3b6dd 100644 --- a/src/pipewire/port.c +++ b/src/pipewire/port.c @@ -848,11 +848,11 @@ int pw_port_set_param(struct pw_port *port, uint32_t mix_id, uint32_t id, uint32 if (param == NULL || res < 0) { free_allocation(&port->allocation); port->allocated = false; - port_update_state (port, mix, PW_PORT_STATE_CONFIGURE); + port_update_state(port, mix, PW_PORT_STATE_CONFIGURE); } else if (!SPA_RESULT_IS_ASYNC(res)) { if (port->state == PW_PORT_STATE_CONFIGURE) - port_update_state (port, mix, PW_PORT_STATE_READY); + port_update_state(port, mix, PW_PORT_STATE_READY); else if (mix) mix->state = PW_PORT_STATE_READY; } @@ -865,7 +865,7 @@ int pw_port_use_buffers(struct pw_port *port, uint32_t mix_id, { int res = 0; struct pw_node *node = port->node; - struct pw_port_mix *mix; + struct pw_port_mix *mix = NULL; const struct pw_port_implementation *pi = port->implementation; pw_log_debug("port %p: %d:%d.%d: %d buffers %d", port, @@ -877,10 +877,11 @@ int pw_port_use_buffers(struct pw_port *port, uint32_t mix_id, if (n_buffers > 0 && port->state < PW_PORT_STATE_READY) return -EIO; - if ((mix = pw_map_lookup(&port->mix_port_map, mix_id)) == NULL) + if (mix_id != SPA_ID_INVALID && + (mix = pw_map_lookup(&port->mix_port_map, mix_id)) == NULL) return -EIO; - if (port->mix->port_use_buffers != NULL) { + if (mix && port->mix->port_use_buffers != NULL) { struct spa_graph_port *p = &mix->port; res = spa_node_port_use_buffers(port->mix, p->direction, p->port_id, buffers, n_buffers); @@ -888,7 +889,7 @@ int pw_port_use_buffers(struct pw_port *port, uint32_t mix_id, port, res, spa_strerror(res)); } - if (port->state == PW_PORT_STATE_READY) { + if (port->state == PW_PORT_STATE_READY || n_buffers == 0) { if (!SPA_FLAG_CHECK(port->mix_flags, PW_PORT_MIX_FLAG_MIX_ONLY)) { res = spa_node_port_use_buffers(node->node, port->direction, port->port_id, buffers, n_buffers); @@ -905,10 +906,10 @@ int pw_port_use_buffers(struct pw_port *port, uint32_t mix_id, n_buffers = 0; if (n_buffers == 0) - port_update_state (port, mix, PW_PORT_STATE_READY); + port_update_state(port, mix, PW_PORT_STATE_READY); else if (!SPA_RESULT_IS_ASYNC(res)) { if (port->state == PW_PORT_STATE_READY) - port_update_state (port, mix, PW_PORT_STATE_PAUSED); + port_update_state(port, mix, PW_PORT_STATE_PAUSED); else if (mix) mix->state = PW_PORT_STATE_PAUSED; } @@ -957,9 +958,9 @@ int pw_port_alloc_buffers(struct pw_port *port, uint32_t mix_id, } if (*n_buffers == 0) - port_update_state (port, mix, PW_PORT_STATE_READY); + port_update_state(port, mix, PW_PORT_STATE_READY); else if (!SPA_RESULT_IS_ASYNC(res)) - port_update_state (port, mix, PW_PORT_STATE_PAUSED); + port_update_state(port, mix, PW_PORT_STATE_PAUSED); return res; } diff --git a/src/pipewire/remote.c b/src/pipewire/remote.c index 304e152d1..2ae844173 100644 --- a/src/pipewire/remote.c +++ b/src/pipewire/remote.c @@ -953,10 +953,13 @@ static void clear_buffers(struct node_data *data, struct mix *mix) { struct pw_port *port = mix->port; struct buffer *b; - int i; + int i, res; - pw_log_debug("port %p: clear buffers", port); - pw_port_use_buffers(port, mix->mix_id, NULL, 0); + pw_log_debug("port %p: clear buffers %d", port, mix->mix_id); + if ((res = pw_port_use_buffers(port, mix->mix_id, NULL, 0)) < 0) { + pw_log_error("port %p: error clear buffers %s", port, spa_strerror(res)); + return; + } pw_array_for_each(b, &mix->buffers) { for (i = 0; i < b->n_mem; i++) {