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.
This commit is contained in:
Wim Taymans 2020-02-18 17:34:41 +01:00
parent b6a6d1f0bb
commit 463b9e4e29
2 changed files with 13 additions and 5 deletions

View file

@ -280,6 +280,7 @@ static int impl_node_enum_params(void *object, int seq,
struct spa_pod_builder b = { 0 }; struct spa_pod_builder b = { 0 };
struct spa_result_node_params result; struct spa_result_node_params result;
uint32_t count = 0; uint32_t count = 0;
bool found = false;
spa_return_val_if_fail(this != NULL, -EINVAL); spa_return_val_if_fail(this != NULL, -EINVAL);
spa_return_val_if_fail(num != 0, -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)) if (param == NULL || !spa_pod_is_object_id(param, id))
continue; continue;
found = true;
spa_pod_builder_init(&b, buffer, sizeof(buffer)); spa_pod_builder_init(&b, buffer, sizeof(buffer));
if (spa_pod_filter(&b, &result.param, param, filter) != 0) if (spa_pod_filter(&b, &result.param, param, filter) != 0)
continue; continue;
@ -309,7 +311,7 @@ static int impl_node_enum_params(void *object, int seq,
if (++count == num) if (++count == num)
break; break;
} }
return 0; return found ? 0 : -ENOENT;
} }
static int impl_node_set_param(void *object, uint32_t id, uint32_t flags, 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_pod_builder b = { 0 };
struct spa_result_node_params result; struct spa_result_node_params result;
uint32_t count = 0; uint32_t count = 0;
bool found = false;
spa_return_val_if_fail(this != NULL, -EINVAL); spa_return_val_if_fail(this != NULL, -EINVAL);
spa_return_val_if_fail(num != 0, -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)) if (param == NULL || !spa_pod_is_object_id(param, id))
continue; continue;
found = true;
spa_pod_builder_init(&b, buffer, sizeof(buffer)); spa_pod_builder_init(&b, buffer, sizeof(buffer));
if (spa_pod_filter(&b, &result.param, param, filter) < 0) if (spa_pod_filter(&b, &result.param, param, filter) < 0)
continue; continue;
@ -593,7 +597,7 @@ impl_node_port_enum_params(void *object, int seq,
if (++count == num) if (++count == num)
break; break;
} }
return 0; return found ? 0 : -ENOENT;
} }
static int static int

View file

@ -179,12 +179,16 @@ param_filter(struct pw_buffers *this,
for (oidx = 0;;) { for (oidx = 0;;) {
pw_log_debug(NAME" %p: output param %d id:%d", this, oidx, id); 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, 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; break;
} }
if (pw_log_level_enabled(SPA_LOG_LEVEL_DEBUG)) if (pw_log_level_enabled(SPA_LOG_LEVEL_DEBUG))
spa_debug_pod(2, NULL, oparam); spa_debug_pod(2, NULL, oparam);