port: fix mixer status

When the mixer has no input ports, return OK
Don't increment required inputs for optional ports.
This commit is contained in:
Wim Taymans 2017-12-04 15:05:56 +01:00
parent 6503351a0d
commit e747fb2224
2 changed files with 20 additions and 11 deletions

View file

@ -57,7 +57,8 @@ static inline int spa_graph_impl_need_input(void *data, struct spa_graph_node *n
if (pport->io->status == SPA_STATUS_NEED_BUFFER) {
pnode->ready[SPA_DIRECTION_OUTPUT]++;
node->required[SPA_DIRECTION_INPUT]++;
if (!(p->flags & SPA_PORT_INFO_FLAG_OPTIONAL))
node->required[SPA_DIRECTION_INPUT]++;
}
pready = pnode->ready[SPA_DIRECTION_OUTPUT];
@ -70,12 +71,13 @@ static inline int spa_graph_impl_need_input(void *data, struct spa_graph_node *n
pnode->state = spa_node_process_output(pnode->implementation);
spa_debug("peer %p processed out %d", pnode, pnode->state);
if (pnode->state == SPA_STATUS_NEED_BUFFER)
spa_graph_need_input(pnode->graph, pnode);
else if (pnode->state == SPA_STATUS_HAVE_BUFFER)
if (pnode->state == SPA_STATUS_HAVE_BUFFER)
spa_graph_have_output(pnode->graph, pnode);
else if (pnode->state == SPA_STATUS_NEED_BUFFER)
spa_graph_need_input(pnode->graph, pnode);
}
}
spa_debug("node %p end pull", node);
return 0;
}
@ -98,27 +100,29 @@ static inline int spa_graph_impl_have_output(void *data, struct spa_graph_node *
}
pnode = pport->node;
if (p->io->status == SPA_STATUS_HAVE_BUFFER) {
if (pport->io->status == SPA_STATUS_HAVE_BUFFER) {
pnode->ready[SPA_DIRECTION_INPUT]++;
node->required[SPA_DIRECTION_OUTPUT]++;
if (!(p->flags & SPA_PORT_INFO_FLAG_OPTIONAL))
node->required[SPA_DIRECTION_OUTPUT]++;
}
pready = pnode->ready[SPA_DIRECTION_INPUT];
prequired = pnode->required[SPA_DIRECTION_INPUT];
spa_debug("node %p peer %p io %d %d %d", node, pnode, pport->io->status,
pready, prequired);
spa_debug("node %p peer %p io %d %d %d %d", node, pnode, pport->io->status,
pport->io->buffer_id, pready, prequired);
if (prequired > 0 && pready >= prequired) {
pnode->state = spa_node_process_input(pnode->implementation);
spa_debug("node %p chain processed in %d", pnode, pnode->state);
spa_debug("peer %p processed in %d", pnode, pnode->state);
if (pnode->state == SPA_STATUS_HAVE_BUFFER)
spa_graph_have_output(pnode->graph, pnode);
else if (pnode->state == SPA_STATUS_NEED_BUFFER)
spa_graph_need_input(pnode->graph, pnode);
}
}
spa_debug("node %p end push", node);
return 0;
}

View file

@ -123,8 +123,13 @@ static int schedule_mix_output(struct spa_node *data)
struct spa_graph_port *p;
struct spa_io_buffers *io = this->rt.mix_port.io;
spa_list_for_each(p, &node->ports[SPA_DIRECTION_INPUT], link)
*p->io = *io;
if (!spa_list_is_empty(&node->ports[SPA_DIRECTION_INPUT])) {
spa_list_for_each(p, &node->ports[SPA_DIRECTION_INPUT], link)
*p->io = *io;
}
else {
io->status = SPA_STATUS_OK;
}
pw_log_trace("mix output %d %d", io->status, io->buffer_id);
return io->status;
}