diff --git a/src/pipewire/filter.c b/src/pipewire/filter.c index ebcdf54b8..3fa460bf3 100644 --- a/src/pipewire/filter.c +++ b/src/pipewire/filter.c @@ -35,6 +35,7 @@ #include #include #include +#include #include #include #include @@ -398,7 +399,7 @@ static int enum_params(struct filter *d, struct spa_list *param_list, int seq, { struct spa_result_node_params result; uint8_t buffer[1024]; - struct spa_pod_builder b = { 0 }; + struct spa_pod_dynamic_builder b; uint32_t count = 0; struct param *p; bool found = false; @@ -425,13 +426,14 @@ static int enum_params(struct filter *d, struct spa_list *param_list, int seq, found = true; - spa_pod_builder_init(&b, buffer, sizeof(buffer)); - if (spa_pod_filter(&b, &result.param, param, filter) != 0) - continue; + spa_pod_dynamic_builder_init(&b, buffer, sizeof(buffer), 4096); + if (spa_pod_filter(&b.b, &result.param, param, filter) == 0) { + spa_node_emit_result(&d->hooks, seq, 0, SPA_RESULT_TYPE_NODE_PARAMS, &result); + count++; + } + spa_pod_dynamic_builder_clean(&b); - spa_node_emit_result(&d->hooks, seq, 0, SPA_RESULT_TYPE_NODE_PARAMS, &result); - - if (++count == num) + if (count == num) break; } return found ? 0 : -ENOENT; diff --git a/src/pipewire/impl-device.c b/src/pipewire/impl-device.c index 3a5c81cb8..3b63190dd 100644 --- a/src/pipewire/impl-device.c +++ b/src/pipewire/impl-device.c @@ -27,6 +27,7 @@ #include #include #include +#include #include #include "pipewire/impl.h" @@ -324,7 +325,7 @@ int pw_impl_device_for_each_param(struct pw_impl_device *device, if (pi->user == 1) { struct pw_param *p; uint8_t buffer[4096]; - struct spa_pod_builder b = { 0 }; + struct spa_pod_dynamic_builder b; struct spa_result_device_params result; uint32_t count = 0; @@ -339,14 +340,15 @@ int pw_impl_device_for_each_param(struct pw_impl_device *device, if (result.index < index) continue; - spa_pod_builder_init(&b, buffer, sizeof(buffer)); - if (spa_pod_filter(&b, &result.param, p->param, filter) != 0) - continue; + spa_pod_dynamic_builder_init(&b, buffer, sizeof(buffer), 4096); + if (spa_pod_filter(&b.b, &result.param, p->param, filter) == 0) { + pw_log_debug("%p: %d param %u", device, seq, result.index); + result_device_params(&user_data, seq, 0, SPA_RESULT_TYPE_DEVICE_PARAMS, &result); + count++; + } + spa_pod_dynamic_builder_clean(&b); - pw_log_debug("%p: %d param %u", device, seq, result.index); - result_device_params(&user_data, seq, 0, SPA_RESULT_TYPE_DEVICE_PARAMS, &result); - - if (++count == max) + if (count == max) break; } res = 0; diff --git a/src/pipewire/impl-node.c b/src/pipewire/impl-node.c index feeb3db7a..1b5b245cd 100644 --- a/src/pipewire/impl-node.c +++ b/src/pipewire/impl-node.c @@ -32,6 +32,7 @@ #include #include #include +#include #include #include #include @@ -1967,7 +1968,7 @@ int pw_impl_node_for_each_param(struct pw_impl_node *node, if (pi->user == 1) { struct pw_param *p; uint8_t buffer[4096]; - struct spa_pod_builder b = { 0 }; + struct spa_pod_dynamic_builder b; struct spa_result_node_params result; uint32_t count = 0; @@ -1982,14 +1983,16 @@ int pw_impl_node_for_each_param(struct pw_impl_node *node, if (result.index < index) continue; - spa_pod_builder_init(&b, buffer, sizeof(buffer)); - if (spa_pod_filter(&b, &result.param, p->param, filter) != 0) - continue; + spa_pod_dynamic_builder_init(&b, buffer, sizeof(buffer), 4096); - pw_log_debug("%p: %d param %u", node, seq, result.index); - result_node_params(&user_data, seq, 0, SPA_RESULT_TYPE_NODE_PARAMS, &result); + if (spa_pod_filter(&b.b, &result.param, p->param, filter) == 0) { + pw_log_debug("%p: %d param %u", node, seq, result.index); + result_node_params(&user_data, seq, 0, SPA_RESULT_TYPE_NODE_PARAMS, &result); + count++; + } + spa_pod_dynamic_builder_clean(&b); - if (++count == max) + if (count == max) break; } res = 0; diff --git a/src/pipewire/impl-port.c b/src/pipewire/impl-port.c index e33359aac..c6252edb0 100644 --- a/src/pipewire/impl-port.c +++ b/src/pipewire/impl-port.c @@ -34,6 +34,7 @@ #include #include #include +#include #include "pipewire/impl.h" #include "pipewire/private.h" @@ -229,17 +230,19 @@ int pw_impl_port_init_mix(struct pw_impl_port *port, struct pw_impl_port_mix *mi { uint32_t idx = 0; uint8_t buffer[1024]; - struct spa_pod_builder b; + struct spa_pod_dynamic_builder b; struct spa_pod *param; - spa_pod_builder_init(&b, buffer, sizeof(buffer)); + spa_pod_dynamic_builder_init(&b, buffer, sizeof(buffer), 4096); + if (spa_node_port_enum_params_sync(port->mix, pw_direction_reverse(port->direction), 0, - SPA_PARAM_Format, &idx, NULL, ¶m, &b) == 1) { + SPA_PARAM_Format, &idx, NULL, ¶m, &b.b) == 1) { spa_node_port_set_param(port->mix, port->direction, port_id, SPA_PARAM_Format, 0, param); } + spa_pod_dynamic_builder_clean(&b); } spa_list_append(&port->mix_list, &mix->link); @@ -1216,7 +1219,7 @@ int pw_impl_port_for_each_param(struct pw_impl_port *port, if (pi->user == 1) { struct pw_param *p; uint8_t buffer[1024]; - struct spa_pod_builder b = { 0 }; + struct spa_pod_dynamic_builder b; struct spa_result_node_params result; uint32_t count = 0; @@ -1231,14 +1234,16 @@ int pw_impl_port_for_each_param(struct pw_impl_port *port, if (result.index < index) continue; - spa_pod_builder_init(&b, buffer, sizeof(buffer)); - if (spa_pod_filter(&b, &result.param, p->param, filter) != 0) - continue; + spa_pod_dynamic_builder_init(&b, buffer, sizeof(buffer), 4096); - pw_log_debug("%p: %d param %u", port, seq, result.index); - result_port_params(&user_data, seq, 0, SPA_RESULT_TYPE_NODE_PARAMS, &result); + if (spa_pod_filter(&b.b, &result.param, p->param, filter) >= 0) { + pw_log_debug("%p: %d param %u", port, seq, result.index); + result_port_params(&user_data, seq, 0, SPA_RESULT_TYPE_NODE_PARAMS, &result); + count++; + } + spa_pod_dynamic_builder_clean(&b); - if (++count == max) + if (count == max) break; } res = 0; diff --git a/src/pipewire/stream.c b/src/pipewire/stream.c index 873e7339f..aabc70e1c 100644 --- a/src/pipewire/stream.c +++ b/src/pipewire/stream.c @@ -34,6 +34,7 @@ #include #include #include +#include #include #include #include @@ -483,7 +484,7 @@ static int enum_params(void *object, bool is_port, int seq, uint32_t id, uint32_ struct stream *d = object; struct spa_result_node_params result; uint8_t buffer[1024]; - struct spa_pod_builder b = { 0 }; + struct spa_pod_dynamic_builder b; uint32_t count = 0; struct param *p; bool found = false; @@ -510,13 +511,14 @@ static int enum_params(void *object, bool is_port, int seq, uint32_t id, uint32_ found = true; - spa_pod_builder_init(&b, buffer, sizeof(buffer)); - if (spa_pod_filter(&b, &result.param, param, filter) != 0) - continue; + spa_pod_dynamic_builder_init(&b, buffer, sizeof(buffer), 4096); + if (spa_pod_filter(&b.b, &result.param, param, filter) == 0) { + spa_node_emit_result(&d->hooks, seq, 0, SPA_RESULT_TYPE_NODE_PARAMS, &result); + count++; + } + spa_pod_dynamic_builder_clean(&b); - spa_node_emit_result(&d->hooks, seq, 0, SPA_RESULT_TYPE_NODE_PARAMS, &result); - - if (++count == num) + if (count == num) break; } return found ? 0 : -ENOENT;