From 463b9e4e29e0449b21016265696dda711e3ad31e Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Tue, 18 Feb 2020 17:34:41 +0100 Subject: [PATCH] buffers: handle -ENOENT enum_param should return -ENOENT when the param is not known. When negotiating buffers handle -ENOENT. This means the port does not know about the property and we should assume anything is fine so just use the filter from the first port. --- src/modules/module-client-node/client-node.c | 8 ++++++-- src/pipewire/buffers.c | 10 +++++++--- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/modules/module-client-node/client-node.c b/src/modules/module-client-node/client-node.c index 6551efd9d..dc8ff94d7 100644 --- a/src/modules/module-client-node/client-node.c +++ b/src/modules/module-client-node/client-node.c @@ -280,6 +280,7 @@ static int impl_node_enum_params(void *object, int seq, struct spa_pod_builder b = { 0 }; struct spa_result_node_params result; uint32_t count = 0; + bool found = false; spa_return_val_if_fail(this != NULL, -EINVAL); spa_return_val_if_fail(num != 0, -EINVAL); @@ -299,6 +300,7 @@ static int impl_node_enum_params(void *object, int seq, if (param == NULL || !spa_pod_is_object_id(param, id)) continue; + found = true; spa_pod_builder_init(&b, buffer, sizeof(buffer)); if (spa_pod_filter(&b, &result.param, param, filter) != 0) continue; @@ -309,7 +311,7 @@ static int impl_node_enum_params(void *object, int seq, if (++count == num) break; } - return 0; + return found ? 0 : -ENOENT; } static int impl_node_set_param(void *object, uint32_t id, uint32_t flags, @@ -558,6 +560,7 @@ impl_node_port_enum_params(void *object, int seq, struct spa_pod_builder b = { 0 }; struct spa_result_node_params result; uint32_t count = 0; + bool found = false; spa_return_val_if_fail(this != NULL, -EINVAL); spa_return_val_if_fail(num != 0, -EINVAL); @@ -583,6 +586,7 @@ impl_node_port_enum_params(void *object, int seq, if (param == NULL || !spa_pod_is_object_id(param, id)) continue; + found = true; spa_pod_builder_init(&b, buffer, sizeof(buffer)); if (spa_pod_filter(&b, &result.param, param, filter) < 0) continue; @@ -593,7 +597,7 @@ impl_node_port_enum_params(void *object, int seq, if (++count == num) break; } - return 0; + return found ? 0 : -ENOENT; } static int diff --git a/src/pipewire/buffers.c b/src/pipewire/buffers.c index 32b7f0ecc..59cfd2685 100644 --- a/src/pipewire/buffers.c +++ b/src/pipewire/buffers.c @@ -179,12 +179,16 @@ param_filter(struct pw_buffers *this, for (oidx = 0;;) { pw_log_debug(NAME" %p: output param %d id:%d", this, oidx, id); - if (spa_node_port_enum_params_sync(out_port->node, + res = spa_node_port_enum_params_sync(out_port->node, out_port->direction, out_port->port_id, - id, &oidx, iparam, &oparam, result) != 1) { + id, &oidx, iparam, &oparam, result); + if (res != 1) { + if (res == -ENOENT && iparam) { + spa_pod_builder_raw_padded(result, iparam, SPA_POD_SIZE(iparam)); + num++; + } break; } - if (pw_log_level_enabled(SPA_LOG_LEVEL_DEBUG)) spa_debug_pod(2, NULL, oparam);