stream: make empty objects remove the PARAM

Make sure that NULL params don't cause -EINVAL but ignore them.

Don't add empty param objects. this makes it possible to clear all previous
params by setting an empty object.
This commit is contained in:
Wim Taymans 2023-12-11 13:01:10 +01:00
parent 971bc8a249
commit 283c215641
3 changed files with 27 additions and 22 deletions

View file

@ -437,6 +437,14 @@ static inline int spa_pod_object_is_fixated(const struct spa_pod_object *pod)
return 1; return 1;
} }
static inline int spa_pod_object_has_props(const struct spa_pod_object *pod)
{
struct spa_pod_prop *res;
SPA_POD_OBJECT_FOREACH(pod, res)
return 1;
return 0;
}
static inline int spa_pod_is_fixated(const struct spa_pod *pod) static inline int spa_pod_is_fixated(const struct spa_pod *pod)
{ {
if (!spa_pod_is_object(pod)) if (!spa_pod_is_object(pod))

View file

@ -224,22 +224,23 @@ static void fix_datatype(struct spa_pod *param)
} }
} }
static struct param *add_param(struct filter *impl, struct port *port, static int add_param(struct filter *impl, struct port *port,
uint32_t id, uint32_t flags, const struct spa_pod *param) uint32_t id, uint32_t flags, const struct spa_pod *param)
{ {
struct param *p; struct param *p;
int idx; int idx;
if (param == NULL || !spa_pod_is_object(param)) { if (param != NULL && !spa_pod_is_object(param))
errno = EINVAL; return -EINVAL;
return NULL; if (param == NULL || !spa_pod_object_has_props((struct spa_pod_object*)param))
} return 0;
if (id == SPA_ID_INVALID) if (id == SPA_ID_INVALID)
id = SPA_POD_OBJECT_ID(param); id = SPA_POD_OBJECT_ID(param);
p = malloc(sizeof(struct param) + SPA_POD_SIZE(param)); p = malloc(sizeof(struct param) + SPA_POD_SIZE(param));
if (p == NULL) if (p == NULL)
return NULL; return -errno;
if (id == SPA_PARAM_ProcessLatency && port == NULL) if (id == SPA_PARAM_ProcessLatency && port == NULL)
spa_process_latency_parse(param, &impl->process_latency); spa_process_latency_parse(param, &impl->process_latency);
@ -275,7 +276,7 @@ static struct param *add_param(struct filter *impl, struct port *port,
impl->params[idx].user++; impl->params[idx].user++;
} }
} }
return p; return 0;
} }
static void clear_params(struct filter *impl, struct port *port, uint32_t id) static void clear_params(struct filter *impl, struct port *port, uint32_t id)
@ -702,10 +703,8 @@ static int update_params(struct filter *impl, struct port *port, uint32_t id,
} }
continue; continue;
} }
if (add_param(impl, port, id, 0, params[i]) == NULL) { if ((res = add_param(impl, port, id, 0, params[i])) < 0)
res = -errno;
break; break;
}
} }
if (port != NULL && update_latency) { if (port != NULL && update_latency) {
uint8_t buffer[4096]; uint8_t buffer[4096];
@ -1636,9 +1635,8 @@ pw_filter_connect(struct pw_filter *filter,
impl->info.change_mask = impl->change_mask_all; impl->info.change_mask = impl->change_mask_all;
clear_params(impl, NULL, SPA_ID_INVALID); clear_params(impl, NULL, SPA_ID_INVALID);
for (i = 0; i < n_params; i++) { for (i = 0; i < n_params; i++)
add_param(impl, NULL, SPA_ID_INVALID, 0, params[i]); add_param(impl, NULL, SPA_ID_INVALID, 0, params[i]);
}
impl->disconnecting = false; impl->disconnecting = false;
impl->draining = false; impl->draining = false;

View file

@ -226,22 +226,23 @@ static void fix_datatype(struct spa_pod *param)
} }
} }
static struct param *add_param(struct stream *impl, static int add_param(struct stream *impl,
uint32_t id, uint32_t flags, const struct spa_pod *param) uint32_t id, uint32_t flags, const struct spa_pod *param)
{ {
struct param *p; struct param *p;
int idx; int idx;
if (param == NULL || !spa_pod_is_object(param)) { if (param != NULL && !spa_pod_is_object(param))
errno = EINVAL; return -EINVAL;
return NULL; if (param == NULL || !spa_pod_object_has_props((struct spa_pod_object*)param))
} return 0;
if (id == SPA_ID_INVALID) if (id == SPA_ID_INVALID)
id = SPA_POD_OBJECT_ID(param); id = SPA_POD_OBJECT_ID(param);
p = malloc(sizeof(struct param) + SPA_POD_SIZE(param)); p = malloc(sizeof(struct param) + SPA_POD_SIZE(param));
if (p == NULL) if (p == NULL)
return NULL; return -errno;
p->id = id; p->id = id;
p->flags = flags; p->flags = flags;
@ -266,7 +267,7 @@ static struct param *add_param(struct stream *impl,
impl->port_params[idx].flags |= SPA_PARAM_INFO_READ; impl->port_params[idx].flags |= SPA_PARAM_INFO_READ;
impl->port_params[idx].user++; impl->port_params[idx].user++;
} }
return p; return 0;
} }
static void clear_params(struct stream *impl, uint32_t id) static void clear_params(struct stream *impl, uint32_t id)
@ -326,10 +327,8 @@ static int update_params(struct stream *impl, uint32_t id,
} }
} }
for (i = 0; i < n_params; i++) { for (i = 0; i < n_params; i++) {
if (add_param(impl, id, 0, params[i]) == NULL) { if ((res = add_param(impl, id, 0, params[i])) < 0)
res = -errno;
break; break;
}
} }
return res; return res;
} }