mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	client-node: implement node property update
Make it possible to update the node properties Make it possible to update the remote properties
This commit is contained in:
		
							parent
							
								
									b029000610
								
							
						
					
					
						commit
						3d25e254ef
					
				
					 5 changed files with 75 additions and 9 deletions
				
			
		| 
						 | 
				
			
			@ -84,11 +84,13 @@ struct pw_client_node_proxy_methods {
 | 
			
		|||
#define PW_CLIENT_NODE_UPDATE_MAX_INPUTS   (1 << 0)
 | 
			
		||||
#define PW_CLIENT_NODE_UPDATE_MAX_OUTPUTS  (1 << 1)
 | 
			
		||||
#define PW_CLIENT_NODE_UPDATE_PARAMS       (1 << 2)
 | 
			
		||||
#define PW_CLIENT_NODE_UPDATE_PROPS        (1 << 3)
 | 
			
		||||
			uint32_t change_mask,
 | 
			
		||||
			uint32_t max_input_ports,
 | 
			
		||||
			uint32_t max_output_ports,
 | 
			
		||||
			uint32_t n_params,
 | 
			
		||||
			const struct spa_pod **params);
 | 
			
		||||
			const struct spa_pod **params,
 | 
			
		||||
			const struct spa_dict *props);
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Update a node port
 | 
			
		||||
| 
						 | 
				
			
			@ -137,13 +139,13 @@ pw_client_node_proxy_update(struct pw_client_node_proxy *p,
 | 
			
		|||
			    uint32_t max_input_ports,
 | 
			
		||||
			    uint32_t max_output_ports,
 | 
			
		||||
			    uint32_t n_params,
 | 
			
		||||
			    const struct spa_pod **params)
 | 
			
		||||
			    const struct spa_pod **params,
 | 
			
		||||
			    const struct spa_dict *props)
 | 
			
		||||
{
 | 
			
		||||
        pw_proxy_do((struct pw_proxy*)p, struct pw_client_node_proxy_methods, update, change_mask,
 | 
			
		||||
							      max_input_ports,
 | 
			
		||||
							      max_output_ports,
 | 
			
		||||
							      n_params,
 | 
			
		||||
							      params);
 | 
			
		||||
							      n_params, params, props);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline void
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -935,7 +935,8 @@ client_node_update(void *data,
 | 
			
		|||
		   uint32_t max_input_ports,
 | 
			
		||||
		   uint32_t max_output_ports,
 | 
			
		||||
		   uint32_t n_params,
 | 
			
		||||
		   const struct spa_pod **params)
 | 
			
		||||
		   const struct spa_pod **params,
 | 
			
		||||
		   const struct spa_dict *props)
 | 
			
		||||
{
 | 
			
		||||
	struct impl *impl = data;
 | 
			
		||||
	struct node *this = &impl->node;
 | 
			
		||||
| 
						 | 
				
			
			@ -956,6 +957,9 @@ client_node_update(void *data,
 | 
			
		|||
		for (i = 0; i < this->n_params; i++)
 | 
			
		||||
			this->params[i] = pw_spa_pod_copy(params[i]);
 | 
			
		||||
	}
 | 
			
		||||
	if (change_mask & PW_CLIENT_NODE_UPDATE_PROPS) {
 | 
			
		||||
		pw_node_update_properties(impl->this.node, props);
 | 
			
		||||
	}
 | 
			
		||||
	spa_log_debug(this->log, "node %p: got node update max_in %u, max_out %u", this,
 | 
			
		||||
		     this->max_inputs, this->max_outputs);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -51,11 +51,12 @@ client_node_marshal_update(void *object,
 | 
			
		|||
			   uint32_t max_input_ports,
 | 
			
		||||
			   uint32_t max_output_ports,
 | 
			
		||||
			   uint32_t n_params,
 | 
			
		||||
			   const struct spa_pod **params)
 | 
			
		||||
			   const struct spa_pod **params,
 | 
			
		||||
			   const struct spa_dict *props)
 | 
			
		||||
{
 | 
			
		||||
	struct pw_proxy *proxy = object;
 | 
			
		||||
	struct spa_pod_builder *b;
 | 
			
		||||
	int i;
 | 
			
		||||
	int i, n_items;
 | 
			
		||||
 | 
			
		||||
	b = pw_protocol_native_begin_proxy(proxy, PW_CLIENT_NODE_PROXY_METHOD_UPDATE);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -69,6 +70,13 @@ client_node_marshal_update(void *object,
 | 
			
		|||
	for (i = 0; i < n_params; i++)
 | 
			
		||||
		spa_pod_builder_add(b, "P", params[i], NULL);
 | 
			
		||||
 | 
			
		||||
	n_items = props ? props->n_items : 0;
 | 
			
		||||
	spa_pod_builder_add(b, "i", n_items, NULL);
 | 
			
		||||
	for (i = 0; i < n_items; i++) {
 | 
			
		||||
		spa_pod_builder_add(b,
 | 
			
		||||
			    "s", props->items[i].key,
 | 
			
		||||
			    "s", props->items[i].value, NULL);
 | 
			
		||||
	}
 | 
			
		||||
	spa_pod_builder_add(b, "]", NULL);
 | 
			
		||||
 | 
			
		||||
	pw_protocol_native_end_proxy(proxy, b);
 | 
			
		||||
| 
						 | 
				
			
			@ -730,6 +738,7 @@ static int client_node_demarshal_update(void *object, void *data, size_t size)
 | 
			
		|||
	struct spa_pod_parser prs;
 | 
			
		||||
	uint32_t change_mask, max_input_ports, max_output_ports, n_params;
 | 
			
		||||
	const struct spa_pod **params;
 | 
			
		||||
	struct spa_dict props;
 | 
			
		||||
	int i;
 | 
			
		||||
 | 
			
		||||
	spa_pod_parser_init(&prs, data, size, 0);
 | 
			
		||||
| 
						 | 
				
			
			@ -746,11 +755,26 @@ static int client_node_demarshal_update(void *object, void *data, size_t size)
 | 
			
		|||
		if (spa_pod_parser_get(&prs, "O", ¶ms[i], NULL) < 0)
 | 
			
		||||
			return -EINVAL;
 | 
			
		||||
 | 
			
		||||
	if (spa_pod_parser_get(&prs,
 | 
			
		||||
			"i", &props.n_items, NULL) < 0)
 | 
			
		||||
		return -EINVAL;
 | 
			
		||||
 | 
			
		||||
	props.items = alloca(props.n_items * sizeof(struct spa_dict_item));
 | 
			
		||||
	for (i = 0; i < props.n_items; i++) {
 | 
			
		||||
		if (spa_pod_parser_get(&prs,
 | 
			
		||||
				"s", &props.items[i].key,
 | 
			
		||||
				"s", &props.items[i].value,
 | 
			
		||||
				NULL) < 0)
 | 
			
		||||
			return -EINVAL;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	pw_resource_do(resource, struct pw_client_node_proxy_methods, update, change_mask,
 | 
			
		||||
									max_input_ports,
 | 
			
		||||
									max_output_ports,
 | 
			
		||||
									n_params,
 | 
			
		||||
									params);
 | 
			
		||||
									params,
 | 
			
		||||
									props.n_items > 0 ?
 | 
			
		||||
										&props : NULL);
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -331,6 +331,18 @@ const struct pw_properties *pw_remote_get_properties(struct pw_remote *remote)
 | 
			
		|||
	return remote->properties;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int pw_remote_update_properties(struct pw_remote *remote, const struct spa_dict *dict)
 | 
			
		||||
{
 | 
			
		||||
	uint32_t i;
 | 
			
		||||
 | 
			
		||||
	for (i = 0; i < dict->n_items; i++)
 | 
			
		||||
		pw_properties_set(remote->properties, dict->items[i].key, dict->items[i].value);
 | 
			
		||||
 | 
			
		||||
	if (remote->core_proxy)
 | 
			
		||||
		pw_core_proxy_client_update(remote->core_proxy, &remote->properties->dict);
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
void *pw_remote_get_user_data(struct pw_remote *remote)
 | 
			
		||||
{
 | 
			
		||||
	return remote->user_data;
 | 
			
		||||
| 
						 | 
				
			
			@ -1256,7 +1268,7 @@ static void do_node_init(struct pw_proxy *proxy)
 | 
			
		|||
				    PW_CLIENT_NODE_UPDATE_PARAMS,
 | 
			
		||||
				    data->node->info.max_input_ports,
 | 
			
		||||
				    data->node->info.max_output_ports,
 | 
			
		||||
				    0, NULL);
 | 
			
		||||
				    0, NULL, NULL);
 | 
			
		||||
 | 
			
		||||
	spa_list_for_each(port, &data->node->input_ports, link) {
 | 
			
		||||
		add_port_update(proxy, port,
 | 
			
		||||
| 
						 | 
				
			
			@ -1279,6 +1291,26 @@ static void node_destroy(void *data)
 | 
			
		|||
	pw_proxy_destroy((struct pw_proxy *)d->node_proxy);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void node_info_changed(void *data, struct pw_node_info *info)
 | 
			
		||||
{
 | 
			
		||||
	struct node_data *d = data;
 | 
			
		||||
	uint32_t change_mask = 0;
 | 
			
		||||
 | 
			
		||||
	pw_log_debug("info changed %p", d);
 | 
			
		||||
 | 
			
		||||
	if (info->change_mask & PW_NODE_CHANGE_MASK_ENUM_PARAMS) {
 | 
			
		||||
		change_mask |= PW_CLIENT_NODE_UPDATE_PARAMS;
 | 
			
		||||
	}
 | 
			
		||||
	if (info->change_mask & PW_NODE_CHANGE_MASK_PROPS) {
 | 
			
		||||
		change_mask |= PW_CLIENT_NODE_UPDATE_PROPS;
 | 
			
		||||
	}
 | 
			
		||||
        pw_client_node_proxy_update(d->node_proxy,
 | 
			
		||||
				    change_mask,
 | 
			
		||||
				    0, 0,
 | 
			
		||||
				    0, NULL,
 | 
			
		||||
				    info->props);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void node_active_changed(void *data, bool active)
 | 
			
		||||
{
 | 
			
		||||
	struct node_data *d = data;
 | 
			
		||||
| 
						 | 
				
			
			@ -1290,6 +1322,7 @@ static void node_active_changed(void *data, bool active)
 | 
			
		|||
static const struct pw_node_events node_events = {
 | 
			
		||||
	PW_VERSION_NODE_EVENTS,
 | 
			
		||||
	.destroy = node_destroy,
 | 
			
		||||
	.info_changed = node_info_changed,
 | 
			
		||||
	.active_changed = node_active_changed,
 | 
			
		||||
	.process = node_process,
 | 
			
		||||
	.finish = node_finish,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -160,6 +160,9 @@ struct pw_core *pw_remote_get_core(struct pw_remote *remote);
 | 
			
		|||
/** Get the remote properties */
 | 
			
		||||
const struct pw_properties *pw_remote_get_properties(struct pw_remote *remote);
 | 
			
		||||
 | 
			
		||||
/** Update properties */
 | 
			
		||||
int pw_remote_update_properties(struct pw_remote *remote, const struct spa_dict *dict);
 | 
			
		||||
 | 
			
		||||
/** Get the user_data. The size was given in \ref pw_remote_new */
 | 
			
		||||
void *pw_remote_get_user_data(struct pw_remote *remote);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue