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)
{
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,

View file

@ -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;
}

View file

@ -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++) {