introspect: use the user flag to count changes

Whenever a param change was found, increment the user counter
of the spa_param_info. We can use this to detect changes in
individial param_info items without having to track them
ourselves.
This commit is contained in:
Wim Taymans 2020-03-06 15:15:49 +01:00
parent 8b53ff55d0
commit 43601ad722

View file

@ -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); info->props = pw_spa_dict_copy(update->props);
} }
if (update->change_mask & PW_NODE_CHANGE_MASK_PARAMS) { if (update->change_mask & PW_NODE_CHANGE_MASK_PARAMS) {
info->n_params = update->n_params; uint32_t i, user, n_params = update->n_params;;
free((void *) info->params);
if (update->params) { info->params = realloc(info->params, n_params * sizeof(struct spa_param_info));
size_t size = info->n_params * sizeof(struct spa_param_info); if (info->params == NULL)
info->params = malloc(size); n_params = 0;
memcpy(info->params, update->params, size);
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; 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); info->props = pw_spa_dict_copy(update->props);
} }
if (update->change_mask & PW_PORT_CHANGE_MASK_PARAMS) { if (update->change_mask & PW_PORT_CHANGE_MASK_PARAMS) {
info->n_params = update->n_params; uint32_t i, user, n_params = update->n_params;;
free((void *) info->params);
if (update->params) { info->params = realloc(info->params, n_params * sizeof(struct spa_param_info));
size_t size = info->n_params * sizeof(struct spa_param_info); if (info->params == NULL)
info->params = malloc(size); n_params = 0;
memcpy(info->params, update->params, size);
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; 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); info->props = pw_spa_dict_copy(update->props);
} }
if (update->change_mask & PW_DEVICE_CHANGE_MASK_PARAMS) { if (update->change_mask & PW_DEVICE_CHANGE_MASK_PARAMS) {
info->n_params = update->n_params; uint32_t i, user, n_params = update->n_params;;
free((void *) info->params);
if (update->params) { info->params = realloc(info->params, n_params * sizeof(struct spa_param_info));
size_t size = info->n_params * sizeof(struct spa_param_info); if (info->params == NULL)
info->params = malloc(size); n_params = 0;
memcpy(info->params, update->params, size);
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; return info;
} }