mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	rework param updates
Make it possible to add a NULL param to the pending list. The NULL param removes all previous updates. When applying the updates, the NULL param removes the params from the target list. This has two advantages: it actually removes params that become unreadable or that got removed and it allows us to update the target list more efficiently in one single loop.
This commit is contained in:
		
							parent
							
								
									62cf8c6130
								
							
						
					
					
						commit
						5aa7746c95
					
				
					 6 changed files with 112 additions and 88 deletions
				
			
		| 
						 | 
				
			
			@ -122,29 +122,6 @@ static void core_sync(struct data *d)
 | 
			
		|||
	pw_log_debug("sync start %u", d->sync_seq);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static struct param *add_param(struct spa_list *params, uint32_t id, const struct spa_pod *param)
 | 
			
		||||
{
 | 
			
		||||
	struct param *p;
 | 
			
		||||
 | 
			
		||||
	if (param == NULL || !spa_pod_is_object(param)) {
 | 
			
		||||
		errno = EINVAL;
 | 
			
		||||
		return NULL;
 | 
			
		||||
	}
 | 
			
		||||
	if (id == SPA_ID_INVALID)
 | 
			
		||||
		id = SPA_POD_OBJECT_ID(param);
 | 
			
		||||
 | 
			
		||||
	p = malloc(sizeof(*p) + SPA_POD_SIZE(param));
 | 
			
		||||
	if (p == NULL)
 | 
			
		||||
		return NULL;
 | 
			
		||||
 | 
			
		||||
	p->id = id;
 | 
			
		||||
	p->param = SPA_MEMBER(p, sizeof(*p), struct spa_pod);
 | 
			
		||||
	memcpy(p->param, param, SPA_POD_SIZE(param));
 | 
			
		||||
	spa_list_append(params, &p->link);
 | 
			
		||||
 | 
			
		||||
	return p;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static uint32_t clear_params(struct spa_list *param_list, uint32_t id)
 | 
			
		||||
{
 | 
			
		||||
	struct param *p, *t;
 | 
			
		||||
| 
						 | 
				
			
			@ -160,6 +137,35 @@ static uint32_t clear_params(struct spa_list *param_list, uint32_t id)
 | 
			
		|||
	return count;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static struct param *add_param(struct spa_list *params, uint32_t id, const struct spa_pod *param)
 | 
			
		||||
{
 | 
			
		||||
	struct param *p;
 | 
			
		||||
 | 
			
		||||
	if (id == SPA_ID_INVALID) {
 | 
			
		||||
		if (param == NULL || !spa_pod_is_object(param)) {
 | 
			
		||||
			errno = EINVAL;
 | 
			
		||||
			return NULL;
 | 
			
		||||
		}
 | 
			
		||||
		id = SPA_POD_OBJECT_ID(param);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	p = malloc(sizeof(*p) + (param != NULL ? SPA_POD_SIZE(param) : 0));
 | 
			
		||||
	if (p == NULL)
 | 
			
		||||
		return NULL;
 | 
			
		||||
 | 
			
		||||
	p->id = id;
 | 
			
		||||
	if (param != NULL) {
 | 
			
		||||
		p->param = SPA_MEMBER(p, sizeof(*p), struct spa_pod);
 | 
			
		||||
		memcpy(p->param, param, SPA_POD_SIZE(param));
 | 
			
		||||
	} else {
 | 
			
		||||
		clear_params(params, id);
 | 
			
		||||
		p->param = NULL;
 | 
			
		||||
	}
 | 
			
		||||
	spa_list_append(params, &p->link);
 | 
			
		||||
 | 
			
		||||
	return p;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static struct object *find_object(struct data *d, uint32_t id)
 | 
			
		||||
{
 | 
			
		||||
	struct object *o;
 | 
			
		||||
| 
						 | 
				
			
			@ -174,12 +180,14 @@ static void object_update_params(struct object *o)
 | 
			
		|||
{
 | 
			
		||||
	struct param *p;
 | 
			
		||||
 | 
			
		||||
	spa_list_for_each(p, &o->pending_list, link)
 | 
			
		||||
		clear_params(&o->param_list, p->id);
 | 
			
		||||
 | 
			
		||||
	spa_list_consume(p, &o->pending_list, link) {
 | 
			
		||||
		spa_list_remove(&p->link);
 | 
			
		||||
		spa_list_append(&o->param_list, &p->link);
 | 
			
		||||
		if (p->param == NULL) {
 | 
			
		||||
			clear_params(&o->param_list, p->id);
 | 
			
		||||
			free(p);
 | 
			
		||||
		} else {
 | 
			
		||||
			spa_list_append(&o->param_list, &p->link);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -482,7 +490,7 @@ static void put_params(struct data *d, const char *key,
 | 
			
		|||
		put_begin(d, spa_debug_type_find_short_name(spa_type_param, pi->id),
 | 
			
		||||
				"[", flags);
 | 
			
		||||
		spa_list_for_each(p, list, link) {
 | 
			
		||||
			if (p->id == pi->id && flags == 0)
 | 
			
		||||
			if (p->id == pi->id)
 | 
			
		||||
				put_pod(d, NULL, p->param);
 | 
			
		||||
		}
 | 
			
		||||
		put_end(d, "]", flags);
 | 
			
		||||
| 
						 | 
				
			
			@ -834,7 +842,7 @@ static void node_event_info(void *object, const struct pw_node_info *info)
 | 
			
		|||
			info->params[i].user = 0;
 | 
			
		||||
 | 
			
		||||
			changed++;
 | 
			
		||||
			clear_params(&o->pending_list, id);
 | 
			
		||||
			add_param(&o->pending_list, id, NULL);
 | 
			
		||||
			if (!(info->params[i].flags & SPA_PARAM_INFO_READ))
 | 
			
		||||
				continue;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -917,7 +925,7 @@ static void port_event_info(void *object, const struct pw_port_info *info)
 | 
			
		|||
			info->params[i].user = 0;
 | 
			
		||||
 | 
			
		||||
			changed++;
 | 
			
		||||
			clear_params(&o->pending_list, id);
 | 
			
		||||
			add_param(&o->pending_list, id, NULL);
 | 
			
		||||
			if (!(info->params[i].flags & SPA_PARAM_INFO_READ))
 | 
			
		||||
				continue;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue