diff --git a/src/modules/module-client-node/client-node.c b/src/modules/module-client-node/client-node.c index db29eae58..db3abbe1c 100644 --- a/src/modules/module-client-node/client-node.c +++ b/src/modules/module-client-node/client-node.c @@ -33,6 +33,7 @@ #include #include #include +#include #include #include @@ -293,7 +294,7 @@ static int impl_node_enum_params(void *object, int seq, { struct node *this = object; 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; bool found = false; @@ -321,14 +322,15 @@ static int impl_node_enum_params(void *object, int seq, if (result.index < start) continue; - 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) { + pw_log_debug("%p: %d param %u", this, seq, result.index); + spa_node_emit_result(&this->hooks, seq, 0, SPA_RESULT_TYPE_NODE_PARAMS, &result); + count++; + } + spa_pod_dynamic_builder_clean(&b); - pw_log_debug("%p: %d param %u", this, seq, result.index); - spa_node_emit_result(&this->hooks, seq, 0, SPA_RESULT_TYPE_NODE_PARAMS, &result); - - if (++count == num) + if (count == num) break; } return found ? 0 : -ENOENT; @@ -563,7 +565,7 @@ impl_node_port_enum_params(void *object, int seq, struct node *this = object; struct port *port; 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; bool found = false; @@ -597,14 +599,15 @@ impl_node_port_enum_params(void *object, int seq, if (result.index < start) continue; - 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) { + pw_log_debug("%p: %d param %u", this, seq, result.index); + spa_node_emit_result(&this->hooks, seq, 0, SPA_RESULT_TYPE_NODE_PARAMS, &result); + count++; + } + spa_pod_dynamic_builder_clean(&b); - pw_log_debug("%p: %d param %u", this, seq, result.index); - spa_node_emit_result(&this->hooks, seq, 0, SPA_RESULT_TYPE_NODE_PARAMS, &result); - - if (++count == num) + if (count == num) break; } return found ? 0 : -ENOENT; diff --git a/src/modules/module-client-node/remote-node.c b/src/modules/module-client-node/remote-node.c index 6c879ac51..a9ecff147 100644 --- a/src/modules/module-client-node/remote-node.c +++ b/src/modules/module-client-node/remote-node.c @@ -31,6 +31,7 @@ #include #include +#include #include #include #include @@ -301,7 +302,7 @@ static int add_node_update(struct node_data *data, uint32_t change_mask, uint32_ if (change_mask & PW_CLIENT_NODE_UPDATE_PARAMS) { uint32_t i, idx, id; uint8_t buf[4096]; - struct spa_pod_builder b = { 0 }; + struct spa_pod_dynamic_builder b; for (i = 0; i < node->info.n_params; i++) { struct spa_pod *param; @@ -311,14 +312,17 @@ static int add_node_update(struct node_data *data, uint32_t change_mask, uint32_ continue; for (idx = 0;;) { - spa_pod_builder_init(&b, buf, sizeof(buf)); - if (spa_node_enum_params_sync(node->node, - id, &idx, - NULL, ¶m, &b) != 1) - break; + spa_pod_dynamic_builder_init(&b, buf, sizeof(buf), 4096); - params = realloc(params, sizeof(struct spa_pod *) * (n_params + 1)); - params[n_params++] = spa_pod_copy(param); + res = spa_node_enum_params_sync(node->node, + id, &idx, NULL, ¶m, &b.b); + if (res == 1) { + params = realloc(params, sizeof(struct spa_pod *) * (n_params + 1)); + params[n_params++] = spa_pod_copy(param); + } + spa_pod_dynamic_builder_clean(&b); + if (res != 1) + break; } } } @@ -356,7 +360,7 @@ static int add_port_update(struct node_data *data, struct pw_impl_port *port, ui if (change_mask & PW_CLIENT_NODE_PORT_UPDATE_PARAMS) { uint32_t i, idx, id; uint8_t buf[4096]; - struct spa_pod_builder b = { 0 }; + struct spa_pod_dynamic_builder b; for (i = 0; i < port->info.n_params; i++) { struct spa_pod *param; @@ -366,15 +370,20 @@ static int add_port_update(struct node_data *data, struct pw_impl_port *port, ui continue; for (idx = 0;;) { - spa_pod_builder_init(&b, buf, sizeof(buf)); - if (spa_node_port_enum_params_sync(port->node->node, + spa_pod_dynamic_builder_init(&b, buf, sizeof(buf), 4096); + + res = spa_node_port_enum_params_sync(port->node->node, port->direction, port->port_id, - id, &idx, - NULL, ¶m, &b) != 1) + id, &idx, NULL, ¶m, &b.b); + if (res == 1) { + params = realloc(params, sizeof(struct spa_pod *) * (n_params + 1)); + params[n_params++] = spa_pod_copy(param); + } + spa_pod_dynamic_builder_clean(&b); + + if (res != 1) break; - params = realloc(params, sizeof(struct spa_pod *) * (n_params + 1)); - params[n_params++] = spa_pod_copy(param); } } }