mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-04 13:30:12 -05:00
monitor: improve param handling
When we receive a param change and the param is unreadable, remove the params. When we get a param update, always remove the old params.
This commit is contained in:
parent
3fb9fa06a9
commit
7675141cb9
1 changed files with 23 additions and 23 deletions
|
|
@ -42,6 +42,7 @@ typedef void (*print_func_t) (struct proxy_data *data);
|
||||||
struct param {
|
struct param {
|
||||||
struct spa_list link;
|
struct spa_list link;
|
||||||
uint32_t id;
|
uint32_t id;
|
||||||
|
int seq;
|
||||||
struct spa_pod *param;
|
struct spa_pod *param;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -120,40 +121,39 @@ static void clear_params(struct proxy_data *data)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void remove_params(struct proxy_data *data, uint32_t id)
|
static void remove_params(struct proxy_data *data, uint32_t id, int seq)
|
||||||
{
|
{
|
||||||
struct param *p, *t;
|
struct param *p, *t;
|
||||||
|
|
||||||
spa_list_for_each_safe(p, t, &data->param_list, link) {
|
spa_list_for_each_safe(p, t, &data->param_list, link) {
|
||||||
if (p->id == id) {
|
if (p->id == id && seq != p->seq) {
|
||||||
spa_list_remove(&p->link);
|
spa_list_remove(&p->link);
|
||||||
free(p);
|
free(p);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int add_param(struct proxy_data *data, uint32_t id, const struct spa_pod *param)
|
|
||||||
{
|
|
||||||
struct param *p;
|
|
||||||
|
|
||||||
p = malloc(sizeof(struct param) + SPA_POD_SIZE(param));
|
|
||||||
if (p == NULL)
|
|
||||||
return -ENOMEM;
|
|
||||||
|
|
||||||
p->id = id;
|
|
||||||
p->param = SPA_MEMBER(p, sizeof(struct param), struct spa_pod);
|
|
||||||
memcpy(p->param, param, SPA_POD_SIZE(param));
|
|
||||||
spa_list_append(&data->param_list, &p->link);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void event_param(void *object, int seq, uint32_t id,
|
static void event_param(void *object, int seq, uint32_t id,
|
||||||
uint32_t index, uint32_t next, const struct spa_pod *param)
|
uint32_t index, uint32_t next, const struct spa_pod *param)
|
||||||
{
|
{
|
||||||
struct proxy_data *data = object;
|
struct proxy_data *data = object;
|
||||||
int res;
|
struct param *p;
|
||||||
|
|
||||||
if ((res = add_param(data, id, param)) < 0)
|
/* remove all params with the same id and older seq */
|
||||||
pw_log_error("can't add param %d: %s", res, spa_strerror(res));
|
remove_params(data, id, seq);
|
||||||
|
|
||||||
|
/* add new param */
|
||||||
|
p = malloc(sizeof(struct param) + SPA_POD_SIZE(param));
|
||||||
|
if (p == NULL) {
|
||||||
|
pw_log_error("can't add param: %m");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
p->id = id;
|
||||||
|
p->seq = seq;
|
||||||
|
p->param = SPA_MEMBER(p, sizeof(struct param), struct spa_pod);
|
||||||
|
memcpy(p->param, param, SPA_POD_SIZE(param));
|
||||||
|
spa_list_append(&data->param_list, &p->link);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void print_params(struct proxy_data *data, char mark)
|
static void print_params(struct proxy_data *data, char mark)
|
||||||
|
|
@ -293,7 +293,7 @@ static void node_event_info(void *object, const struct pw_node_info *info)
|
||||||
for (i = 0; i < info->n_params; i++) {
|
for (i = 0; i < info->n_params; i++) {
|
||||||
if (old != NULL && info->params[i].flags == old->params[i].flags)
|
if (old != NULL && info->params[i].flags == old->params[i].flags)
|
||||||
continue;
|
continue;
|
||||||
remove_params(data, info->params[i].id);
|
remove_params(data, info->params[i].id, 0);
|
||||||
if (!SPA_FLAG_CHECK(info->params[i].flags, SPA_PARAM_INFO_READ))
|
if (!SPA_FLAG_CHECK(info->params[i].flags, SPA_PARAM_INFO_READ))
|
||||||
continue;
|
continue;
|
||||||
pw_node_proxy_enum_params((struct pw_node_proxy*)data->proxy,
|
pw_node_proxy_enum_params((struct pw_node_proxy*)data->proxy,
|
||||||
|
|
@ -354,7 +354,7 @@ static void port_event_info(void *object, const struct pw_port_info *info)
|
||||||
for (i = 0; i < info->n_params; i++) {
|
for (i = 0; i < info->n_params; i++) {
|
||||||
if (old != NULL && info->params[i].flags == old->params[i].flags)
|
if (old != NULL && info->params[i].flags == old->params[i].flags)
|
||||||
continue;
|
continue;
|
||||||
remove_params(data, info->params[i].id);
|
remove_params(data, info->params[i].id, 0);
|
||||||
if (!SPA_FLAG_CHECK(info->params[i].flags, SPA_PARAM_INFO_READ))
|
if (!SPA_FLAG_CHECK(info->params[i].flags, SPA_PARAM_INFO_READ))
|
||||||
continue;
|
continue;
|
||||||
pw_port_proxy_enum_params((struct pw_port_proxy*)data->proxy,
|
pw_port_proxy_enum_params((struct pw_port_proxy*)data->proxy,
|
||||||
|
|
@ -532,7 +532,7 @@ static void device_event_info(void *object, const struct pw_device_info *info)
|
||||||
for (i = 0; i < info->n_params; i++) {
|
for (i = 0; i < info->n_params; i++) {
|
||||||
if (old != NULL && info->params[i].flags == old->params[i].flags)
|
if (old != NULL && info->params[i].flags == old->params[i].flags)
|
||||||
continue;
|
continue;
|
||||||
remove_params(data, info->params[i].id);
|
remove_params(data, info->params[i].id, 0);
|
||||||
if (!SPA_FLAG_CHECK(info->params[i].flags, SPA_PARAM_INFO_READ))
|
if (!SPA_FLAG_CHECK(info->params[i].flags, SPA_PARAM_INFO_READ))
|
||||||
continue;
|
continue;
|
||||||
pw_device_proxy_enum_params((struct pw_device_proxy*)data->proxy,
|
pw_device_proxy_enum_params((struct pw_device_proxy*)data->proxy,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue