From e747fb22243ca1be1db0bef94af90f661256f7b0 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Mon, 4 Dec 2017 15:05:56 +0100 Subject: [PATCH] port: fix mixer status When the mixer has no input ports, return OK Don't increment required inputs for optional ports. --- spa/include/spa/graph/graph-scheduler6.h | 22 +++++++++++++--------- src/pipewire/port.c | 9 +++++++-- 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/spa/include/spa/graph/graph-scheduler6.h b/spa/include/spa/graph/graph-scheduler6.h index e40bde173..1dacb5768 100644 --- a/spa/include/spa/graph/graph-scheduler6.h +++ b/spa/include/spa/graph/graph-scheduler6.h @@ -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; } diff --git a/src/pipewire/port.c b/src/pipewire/port.c index 212fe0db8..07f020362 100644 --- a/src/pipewire/port.c +++ b/src/pipewire/port.c @@ -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; }