diff --git a/src/pipewire/introspect.c b/src/pipewire/introspect.c index 4b5065276..c4269836a 100644 --- a/src/pipewire/introspect.c +++ b/src/pipewire/introspect.c @@ -200,15 +200,24 @@ struct pw_node_info *pw_node_info_update(struct pw_node_info *info, info->props = pw_spa_dict_copy(update->props); } if (update->change_mask & PW_NODE_CHANGE_MASK_PARAMS) { - info->n_params = update->n_params; - free((void *) info->params); - if (update->params) { - size_t size = info->n_params * sizeof(struct spa_param_info); - info->params = malloc(size); - memcpy(info->params, update->params, size); + uint32_t i, user, n_params = update->n_params;; + + info->params = realloc(info->params, n_params * sizeof(struct spa_param_info)); + if (info->params == NULL) + n_params = 0; + + for (i = 0; i < SPA_MIN(info->n_params, n_params); i++) { + user = info->params[i].user; + if (info->params[i].flags != update->params[i].flags) + user++; + info->params[i] = update->params[i]; + info->params[i].user = user; + } + info->n_params = n_params; + for (; i < info->n_params; i++) { + info->params[i] = update->params[i]; + info->params[i].user = 1; } - else - info->params = NULL; } return info; } @@ -248,15 +257,24 @@ struct pw_port_info *pw_port_info_update(struct pw_port_info *info, info->props = pw_spa_dict_copy(update->props); } if (update->change_mask & PW_PORT_CHANGE_MASK_PARAMS) { - info->n_params = update->n_params; - free((void *) info->params); - if (update->params) { - size_t size = info->n_params * sizeof(struct spa_param_info); - info->params = malloc(size); - memcpy(info->params, update->params, size); + uint32_t i, user, n_params = update->n_params;; + + info->params = realloc(info->params, n_params * sizeof(struct spa_param_info)); + if (info->params == NULL) + n_params = 0; + + for (i = 0; i < SPA_MIN(info->n_params, n_params); i++) { + user = info->params[i].user; + if (info->params[i].flags != update->params[i].flags) + user++; + info->params[i] = update->params[i]; + info->params[i].user = user; + } + info->n_params = n_params; + for (; i < info->n_params; i++) { + info->params[i] = update->params[i]; + info->params[i].user = 1; } - else - info->params = NULL; } return info; } @@ -368,15 +386,24 @@ struct pw_device_info *pw_device_info_update(struct pw_device_info *info, info->props = pw_spa_dict_copy(update->props); } if (update->change_mask & PW_DEVICE_CHANGE_MASK_PARAMS) { - info->n_params = update->n_params; - free((void *) info->params); - if (update->params) { - size_t size = info->n_params * sizeof(struct spa_param_info); - info->params = malloc(size); - memcpy(info->params, update->params, size); + uint32_t i, user, n_params = update->n_params;; + + info->params = realloc(info->params, n_params * sizeof(struct spa_param_info)); + if (info->params == NULL) + n_params = 0; + + for (i = 0; i < SPA_MIN(info->n_params, n_params); i++) { + user = info->params[i].user; + if (info->params[i].flags != update->params[i].flags) + user++; + info->params[i] = update->params[i]; + info->params[i].user = user; + } + info->n_params = n_params; + for (; i < info->n_params; i++) { + info->params[i] = update->params[i]; + info->params[i].user = 1; } - else - info->params = NULL; } return info; }