From 9706c191b9f0858f54aa999f9c9252cbad54a10f Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Fri, 13 Oct 2017 18:12:06 +0200 Subject: [PATCH] client-node: don't misuse ASYNC flag When the client is explicitly going to send reuse_buffer messages, set the consumed buffer to INVALID so it doesn't automatically get reused. ASYNC is for when the node emits events to signal input and output it has nothing to do with reuse_buffer Remove weird PROCESS_INPUT code. --- src/modules/module-client-node/client-node.c | 16 ++------- src/pipewire/stream.c | 37 +++++++------------- 2 files changed, 15 insertions(+), 38 deletions(-) diff --git a/src/modules/module-client-node/client-node.c b/src/modules/module-client-node/client-node.c index eab38ff40..e481dd7e5 100644 --- a/src/modules/module-client-node/client-node.c +++ b/src/modules/module-client-node/client-node.c @@ -31,13 +31,11 @@ #include "spa/node.h" #include "spa/format-builder.h" #include "spa/lib/format.h" -#include "spa/graph.h" #include "pipewire/pipewire.h" #include "pipewire/interfaces.h" #include "pipewire/core.h" -#include "pipewire/private.h" #include "modules/spa/spa-node.h" #include "client-node.h" #include "transport.h" @@ -767,18 +765,14 @@ static int spa_proxy_node_process_input(struct spa_node *node) impl->transport->inputs[i] = *io; - if (impl->client_reuse) { - io->status = SPA_RESULT_OK; + if (impl->client_reuse) io->buffer_id = SPA_ID_INVALID; - } else { - io->status = SPA_RESULT_NEED_BUFFER; - } } pw_client_node_transport_add_message(impl->transport, &PW_CLIENT_NODE_MESSAGE_INIT(PW_CLIENT_NODE_MESSAGE_PROCESS_INPUT)); do_flush(this); - if (this->callbacks->need_input || impl->client_reuse) + if (this->callbacks->need_input) return SPA_RESULT_OK; else return SPA_RESULT_NEED_BUFFER; @@ -1190,11 +1184,7 @@ struct pw_client_node *pw_client_node_new(struct pw_resource *resource, goto error_no_node; str = pw_properties_get(properties, "pipewire.client.reuse"); - impl->client_reuse = str && strcmp(str, "1") == 0; - if (impl->client_reuse) - this->node->rt.node.flags |= SPA_GRAPH_NODE_FLAG_ASYNC; - else - this->node->rt.node.flags &= ~SPA_GRAPH_NODE_FLAG_ASYNC; + impl->client_reuse = str && pw_properties_parse_bool(str); pw_resource_add_listener(this->resource, &impl->resource_listener, diff --git a/src/pipewire/stream.c b/src/pipewire/stream.c index 15f111bc8..89e439763 100644 --- a/src/pipewire/stream.c +++ b/src/pipewire/stream.c @@ -229,7 +229,7 @@ struct pw_stream *pw_stream_new(struct pw_remote *remote, impl->rtwritefd = -1; str = pw_properties_get(props, "pipewire.client.reuse"); - impl->client_reuse = str && strcmp(str, "1") == 0; + impl->client_reuse = str && pw_properties_parse_bool(str); spa_hook_list_init(&this->listener_list); @@ -528,34 +528,21 @@ static void handle_rtnode_message(struct pw_stream *stream, struct pw_client_nod for (i = 0; i < impl->trans->area->n_input_ports; i++) { struct spa_port_io *input = &impl->trans->inputs[i]; - uint32_t len, first, id; + struct buffer_id *bid; + uint32_t buffer_id; + + buffer_id = input->buffer_id; + input->buffer_id = SPA_ID_INVALID; pw_log_trace("stream %p: process input %d %d", stream, input->status, - input->buffer_id); - if (input->buffer_id == SPA_ID_INVALID) + buffer_id); + + if ((bid = find_buffer(stream, buffer_id)) == NULL) continue; - len = pw_array_get_len(&impl->buffer_ids, struct buffer_id); - if (impl->client_reuse && impl->last_buffer_id[i] != SPA_ID_INVALID) - first = (impl->last_buffer_id[i] + 1) % len; - else - first = input->buffer_id; - - id = first; - while (true) { - struct buffer_id *bid; - - bid = find_buffer(stream, id); - bid->used = true; - - spa_hook_list_call(&stream->listener_list, struct pw_stream_events, - new_buffer, id); - impl->last_buffer_id[i] = id; - - if (id == input->buffer_id) - break; - id = (id + 1) % len; - } + bid->used = true; + spa_hook_list_call(&stream->listener_list, struct pw_stream_events, + new_buffer, buffer_id); } send_need_input(stream); } else if (PW_CLIENT_NODE_MESSAGE_TYPE(message) == PW_CLIENT_NODE_MESSAGE_PROCESS_OUTPUT) {