port: also set buffers when 0

This commit is contained in:
Wim Taymans 2018-12-03 17:59:10 +01:00
parent 4e7af5644b
commit ee307e9c48
3 changed files with 19 additions and 15 deletions

View file

@ -80,15 +80,14 @@ struct resource_data {
static void node_deactivate(struct pw_node *this) static void node_deactivate(struct pw_node *this)
{ {
struct pw_port *port; struct pw_port *port;
struct pw_link *link;
pw_log_debug("node %p: deactivate", this); pw_log_debug("node %p: deactivate", this);
spa_list_for_each(port, &this->input_ports, link) { spa_list_for_each(port, &this->input_ports, link) {
struct pw_link *link;
spa_list_for_each(link, &port->links, input_link) spa_list_for_each(link, &port->links, input_link)
pw_link_deactivate(link); pw_link_deactivate(link);
} }
spa_list_for_each(port, &this->output_ports, link) { spa_list_for_each(port, &this->output_ports, link) {
struct pw_link *link;
spa_list_for_each(link, &port->links, output_link) spa_list_for_each(link, &port->links, output_link)
pw_link_deactivate(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); pw_log_debug("node %p: pause node", this);
node_deactivate(this); node_deactivate(this);
pw_loop_invoke(this->data_loop, do_node_remove, 1, NULL, 0, true, this); pw_loop_invoke(this->data_loop, do_node_remove, 1, NULL, 0, true, this);
res = spa_node_send_command(this->node, res = spa_node_send_command(this->node,

View file

@ -865,7 +865,7 @@ int pw_port_use_buffers(struct pw_port *port, uint32_t mix_id,
{ {
int res = 0; int res = 0;
struct pw_node *node = port->node; 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; const struct pw_port_implementation *pi = port->implementation;
pw_log_debug("port %p: %d:%d.%d: %d buffers %d", port, 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) if (n_buffers > 0 && port->state < PW_PORT_STATE_READY)
return -EIO; 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; return -EIO;
if (port->mix->port_use_buffers != NULL) { if (mix && port->mix->port_use_buffers != NULL) {
struct spa_graph_port *p = &mix->port; struct spa_graph_port *p = &mix->port;
res = spa_node_port_use_buffers(port->mix, res = spa_node_port_use_buffers(port->mix,
p->direction, p->port_id, buffers, n_buffers); 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)); 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)) { if (!SPA_FLAG_CHECK(port->mix_flags, PW_PORT_MIX_FLAG_MIX_ONLY)) {
res = spa_node_port_use_buffers(node->node, res = spa_node_port_use_buffers(node->node,
port->direction, port->port_id, buffers, n_buffers); port->direction, port->port_id, buffers, n_buffers);

View file

@ -953,10 +953,13 @@ static void clear_buffers(struct node_data *data, struct mix *mix)
{ {
struct pw_port *port = mix->port; struct pw_port *port = mix->port;
struct buffer *b; struct buffer *b;
int i; int i, res;
pw_log_debug("port %p: clear buffers", port); pw_log_debug("port %p: clear buffers %d", port, mix->mix_id);
pw_port_use_buffers(port, mix->mix_id, NULL, 0); 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) { pw_array_for_each(b, &mix->buffers) {
for (i = 0; i < b->n_mem; i++) { for (i = 0; i < b->n_mem; i++) {