mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-02 09:01:50 -05:00
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:
parent
6503351a0d
commit
e747fb2224
2 changed files with 20 additions and 11 deletions
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue