mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	client-node: update port properties
Handle port properties Set the client name
This commit is contained in:
		
							parent
							
								
									342f0d59d0
								
							
						
					
					
						commit
						70687e466d
					
				
					 2 changed files with 49 additions and 8 deletions
				
			
		| 
						 | 
					@ -74,6 +74,7 @@ struct buffer {
 | 
				
			||||||
struct port {
 | 
					struct port {
 | 
				
			||||||
	bool valid;
 | 
						bool valid;
 | 
				
			||||||
	struct spa_port_info info;
 | 
						struct spa_port_info info;
 | 
				
			||||||
 | 
						struct pw_properties *properties;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	bool have_format;
 | 
						bool have_format;
 | 
				
			||||||
	uint32_t n_params;
 | 
						uint32_t n_params;
 | 
				
			||||||
| 
						 | 
					@ -337,8 +338,20 @@ do_update_port(struct proxy *this,
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (change_mask & PW_CLIENT_NODE_PORT_UPDATE_INFO && info)
 | 
						if (change_mask & PW_CLIENT_NODE_PORT_UPDATE_INFO) {
 | 
				
			||||||
		port->info = *info;
 | 
							if (port->properties)
 | 
				
			||||||
 | 
								pw_properties_free(port->properties);
 | 
				
			||||||
 | 
							port->properties = NULL;
 | 
				
			||||||
 | 
							port->info.props = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (info) {
 | 
				
			||||||
 | 
								port->info = *info;
 | 
				
			||||||
 | 
								if (info->props) {
 | 
				
			||||||
 | 
									port->properties = pw_properties_new_dict(info->props);
 | 
				
			||||||
 | 
									port->info.props = &port->properties->dict;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!port->valid) {
 | 
						if (!port->valid) {
 | 
				
			||||||
		spa_log_info(this->log, "proxy %p: adding port %d", this, port_id);
 | 
							spa_log_info(this->log, "proxy %p: adding port %d", this, port_id);
 | 
				
			||||||
| 
						 | 
					@ -1188,7 +1201,7 @@ struct pw_client_node *pw_client_node_new(struct pw_resource *resource,
 | 
				
			||||||
	struct pw_core *core = pw_client_get_core(client);
 | 
						struct pw_core *core = pw_client_get_core(client);
 | 
				
			||||||
	const struct spa_support *support;
 | 
						const struct spa_support *support;
 | 
				
			||||||
	uint32_t n_support;
 | 
						uint32_t n_support;
 | 
				
			||||||
	const char *name = "client-node";
 | 
						const char *name;
 | 
				
			||||||
	const char *str;
 | 
						const char *str;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	impl = calloc(1, sizeof(struct impl));
 | 
						impl = calloc(1, sizeof(struct impl));
 | 
				
			||||||
| 
						 | 
					@ -1207,6 +1220,9 @@ struct pw_client_node *pw_client_node_new(struct pw_resource *resource,
 | 
				
			||||||
	proxy_init(&impl->proxy, NULL, support, n_support);
 | 
						proxy_init(&impl->proxy, NULL, support, n_support);
 | 
				
			||||||
	impl->proxy.impl = impl;
 | 
						impl->proxy.impl = impl;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if ((name = pw_properties_get(properties, "node.name")) == NULL)
 | 
				
			||||||
 | 
							name = "client-node";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	this->resource = resource;
 | 
						this->resource = resource;
 | 
				
			||||||
	this->node = pw_spa_node_new(core,
 | 
						this->node = pw_spa_node_new(core,
 | 
				
			||||||
				     pw_resource_get_client(this->resource),
 | 
									     pw_resource_get_client(this->resource),
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -87,7 +87,7 @@ client_node_marshal_port_update(void *object,
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct pw_proxy *proxy = object;
 | 
						struct pw_proxy *proxy = object;
 | 
				
			||||||
	struct spa_pod_builder *b;
 | 
						struct spa_pod_builder *b;
 | 
				
			||||||
	int i;
 | 
						int i, n_items;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	b = pw_protocol_native_begin_proxy(proxy, PW_CLIENT_NODE_PROXY_METHOD_PORT_UPDATE);
 | 
						b = pw_protocol_native_begin_proxy(proxy, PW_CLIENT_NODE_PROXY_METHOD_PORT_UPDATE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -102,9 +102,19 @@ client_node_marshal_port_update(void *object,
 | 
				
			||||||
		spa_pod_builder_add(b, "P", params[i], NULL);
 | 
							spa_pod_builder_add(b, "P", params[i], NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (info) {
 | 
						if (info) {
 | 
				
			||||||
		spa_pod_builder_struct(b,
 | 
							n_items = info->props ? info->props->n_items : 0;
 | 
				
			||||||
				      "i", info->flags,
 | 
					
 | 
				
			||||||
				      "i", info->rate);
 | 
							spa_pod_builder_add(b,
 | 
				
			||||||
 | 
									    "[",
 | 
				
			||||||
 | 
									    "i", info->flags,
 | 
				
			||||||
 | 
									    "i", info->rate,
 | 
				
			||||||
 | 
									    "i", n_items, NULL);
 | 
				
			||||||
 | 
							for (i = 0; i < n_items; i++) {
 | 
				
			||||||
 | 
								spa_pod_builder_add(b,
 | 
				
			||||||
 | 
										    "s", info->props->items[i].key,
 | 
				
			||||||
 | 
										    "s", info->props->items[i].value, NULL);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							spa_pod_builder_add(b, "]", NULL);
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		spa_pod_builder_add(b, "P", NULL, NULL);
 | 
							spa_pod_builder_add(b, "P", NULL, NULL);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -727,6 +737,7 @@ static int client_node_demarshal_port_update(void *object, void *data, size_t si
 | 
				
			||||||
	const struct spa_pod **params = NULL;
 | 
						const struct spa_pod **params = NULL;
 | 
				
			||||||
	struct spa_port_info info = { 0 }, *infop = NULL;
 | 
						struct spa_port_info info = { 0 }, *infop = NULL;
 | 
				
			||||||
	struct spa_pod *ipod;
 | 
						struct spa_pod *ipod;
 | 
				
			||||||
 | 
						struct spa_dict props;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	spa_pod_parser_init(&prs, data, size, 0);
 | 
						spa_pod_parser_init(&prs, data, size, 0);
 | 
				
			||||||
	if (spa_pod_parser_get(&prs,
 | 
						if (spa_pod_parser_get(&prs,
 | 
				
			||||||
| 
						 | 
					@ -753,8 +764,22 @@ static int client_node_demarshal_port_update(void *object, void *data, size_t si
 | 
				
			||||||
		if (spa_pod_parser_get(&p2,
 | 
							if (spa_pod_parser_get(&p2,
 | 
				
			||||||
				"["
 | 
									"["
 | 
				
			||||||
				"i", &info.flags,
 | 
									"i", &info.flags,
 | 
				
			||||||
				"i", &info.rate, NULL) < 0)
 | 
									"i", &info.rate,
 | 
				
			||||||
 | 
									"i", &props.n_items, NULL) < 0)
 | 
				
			||||||
			return -EINVAL;
 | 
								return -EINVAL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (props.n_items > 0) {
 | 
				
			||||||
 | 
								info.props = &props;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								props.items = alloca(props.n_items * sizeof(struct spa_dict_item));
 | 
				
			||||||
 | 
								for (i = 0; i < props.n_items; i++) {
 | 
				
			||||||
 | 
									if (spa_pod_parser_get(&p2,
 | 
				
			||||||
 | 
											"s", &props.items[i].key,
 | 
				
			||||||
 | 
											"s", &props.items[i].value,
 | 
				
			||||||
 | 
											NULL) < 0)
 | 
				
			||||||
 | 
										return -EINVAL;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	pw_resource_do(resource, struct pw_client_node_proxy_methods, port_update, direction,
 | 
						pw_resource_do(resource, struct pw_client_node_proxy_methods, port_update, direction,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue