mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	node: add node.priority
Add a simple priority to nodes.
This commit is contained in:
		
							parent
							
								
									e2f6a7a34e
								
							
						
					
					
						commit
						ecd8dbc7f0
					
				
					 4 changed files with 32 additions and 5 deletions
				
			
		| 
						 | 
					@ -103,7 +103,8 @@ static struct alsa_node *alsa_create_node(struct alsa_object *obj, uint32_t id,
 | 
				
			||||||
	struct monitor *monitor = obj->monitor;
 | 
						struct monitor *monitor = obj->monitor;
 | 
				
			||||||
	struct impl *impl = monitor->impl;
 | 
						struct impl *impl = monitor->impl;
 | 
				
			||||||
	int res;
 | 
						int res;
 | 
				
			||||||
	const char *dev, *subdev;
 | 
						const char *card, *dev, *subdev;
 | 
				
			||||||
 | 
						int priority;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	pw_log_debug("new node %u", id);
 | 
						pw_log_debug("new node %u", id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -124,11 +125,22 @@ static struct alsa_node *alsa_create_node(struct alsa_object *obj, uint32_t id,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	pw_properties_set(node->props, "factory.name", info->factory_name);
 | 
						pw_properties_set(node->props, "factory.name", info->factory_name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if ((card = pw_properties_get(node->props, SPA_KEY_API_ALSA_PCM_CARD)) == NULL)
 | 
				
			||||||
 | 
							card = "0";
 | 
				
			||||||
	if ((dev = pw_properties_get(node->props, SPA_KEY_API_ALSA_PCM_DEVICE)) == NULL)
 | 
						if ((dev = pw_properties_get(node->props, SPA_KEY_API_ALSA_PCM_DEVICE)) == NULL)
 | 
				
			||||||
		dev = "0";
 | 
							dev = "0";
 | 
				
			||||||
	if ((subdev = pw_properties_get(node->props, SPA_KEY_API_ALSA_PCM_SUBDEVICE)) == NULL)
 | 
						if ((subdev = pw_properties_get(node->props, SPA_KEY_API_ALSA_PCM_SUBDEVICE)) == NULL)
 | 
				
			||||||
		subdev = "0";
 | 
							subdev = "0";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						priority = 1000;
 | 
				
			||||||
 | 
						priority -= atol(card) * 64;
 | 
				
			||||||
 | 
						priority -= atol(dev) * 16;
 | 
				
			||||||
 | 
						priority -= atol(subdev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (pw_properties_get(node->props, PW_KEY_NODE_PRIORITY) == NULL) {
 | 
				
			||||||
 | 
							pw_properties_setf(node->props, PW_KEY_NODE_PRIORITY, "%d", priority);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (pw_properties_get(node->props, SPA_KEY_NODE_NAME) == NULL) {
 | 
						if (pw_properties_get(node->props, SPA_KEY_NODE_NAME) == NULL) {
 | 
				
			||||||
		const char *devname, *stream;
 | 
							const char *devname, *stream;
 | 
				
			||||||
		if ((devname = pw_properties_get(obj->props, SPA_KEY_DEVICE_NAME)) == NULL)
 | 
							if ((devname = pw_properties_get(obj->props, SPA_KEY_DEVICE_NAME)) == NULL)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -172,6 +172,7 @@ struct session {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	struct impl *impl;
 | 
						struct impl *impl;
 | 
				
			||||||
	enum pw_direction direction;
 | 
						enum pw_direction direction;
 | 
				
			||||||
 | 
						int priority;
 | 
				
			||||||
	uint64_t plugged;
 | 
						uint64_t plugged;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	struct node *node;
 | 
						struct node *node;
 | 
				
			||||||
| 
						 | 
					@ -503,6 +504,11 @@ handle_node(struct impl *impl, uint32_t id,
 | 
				
			||||||
		else
 | 
							else
 | 
				
			||||||
			sess->plugged = SPA_TIMESPEC_TO_NSEC(&impl->now);
 | 
								sess->plugged = SPA_TIMESPEC_TO_NSEC(&impl->now);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if ((str = spa_dict_lookup(props, PW_KEY_NODE_PRIORITY)) != NULL)
 | 
				
			||||||
 | 
								sess->priority = pw_properties_parse_int(str);
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
								sess->priority = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		spa_list_init(&sess->node_list);
 | 
							spa_list_init(&sess->node_list);
 | 
				
			||||||
		spa_list_append(&impl->session_list, &sess->l);
 | 
							spa_list_append(&impl->session_list, &sess->l);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -793,6 +799,7 @@ struct find_data {
 | 
				
			||||||
	const char *media_class;
 | 
						const char *media_class;
 | 
				
			||||||
	struct session *sess;
 | 
						struct session *sess;
 | 
				
			||||||
	bool exclusive;
 | 
						bool exclusive;
 | 
				
			||||||
 | 
						int priority;
 | 
				
			||||||
	uint64_t plugged;
 | 
						uint64_t plugged;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -802,6 +809,7 @@ static int find_session(void *data, struct session *sess)
 | 
				
			||||||
	struct impl *impl = find->impl;
 | 
						struct impl *impl = find->impl;
 | 
				
			||||||
	const struct spa_dict *props;
 | 
						const struct spa_dict *props;
 | 
				
			||||||
	const char *str;
 | 
						const char *str;
 | 
				
			||||||
 | 
						int priority = 0;
 | 
				
			||||||
	uint64_t plugged = 0;
 | 
						uint64_t plugged = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	pw_log_debug(NAME " %p: looking at session '%d' enabled:%d busy:%d exclusive:%d",
 | 
						pw_log_debug(NAME " %p: looking at session '%d' enabled:%d busy:%d exclusive:%d",
 | 
				
			||||||
| 
						 | 
					@ -824,6 +832,7 @@ static int find_session(void *data, struct session *sess)
 | 
				
			||||||
			return 0;
 | 
								return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		plugged = sess->plugged;
 | 
							plugged = sess->plugged;
 | 
				
			||||||
 | 
							priority = sess->priority;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if ((find->exclusive && sess->busy) || sess->exclusive) {
 | 
						if ((find->exclusive && sess->busy) || sess->exclusive) {
 | 
				
			||||||
| 
						 | 
					@ -834,9 +843,12 @@ static int find_session(void *data, struct session *sess)
 | 
				
			||||||
	pw_log_debug(NAME " %p: found session '%d' %" PRIu64, impl,
 | 
						pw_log_debug(NAME " %p: found session '%d' %" PRIu64, impl,
 | 
				
			||||||
			sess->id, plugged);
 | 
								sess->id, plugged);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (find->sess == NULL || plugged > find->plugged) {
 | 
						if (find->sess == NULL ||
 | 
				
			||||||
		pw_log_debug(NAME " %p: new best %" PRIu64, impl, plugged);
 | 
						    priority > find->priority ||
 | 
				
			||||||
 | 
						    (priority == find->priority && plugged > find->plugged)) {
 | 
				
			||||||
 | 
							pw_log_debug(NAME " %p: new best %d %" PRIu64, impl, priority, plugged);
 | 
				
			||||||
		find->sess = sess;
 | 
							find->sess = sess;
 | 
				
			||||||
 | 
							find->priority = priority;
 | 
				
			||||||
		find->plugged = plugged;
 | 
							find->plugged = plugged;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
| 
						 | 
					@ -953,6 +965,8 @@ static int rescan_node(struct impl *impl, struct node *node)
 | 
				
			||||||
		return 0;
 | 
							return 0;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						spa_zero(find);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if ((category = spa_dict_lookup(props, PW_KEY_MEDIA_CATEGORY)) == NULL) {
 | 
						if ((category = spa_dict_lookup(props, PW_KEY_MEDIA_CATEGORY)) == NULL) {
 | 
				
			||||||
		pw_log_debug(NAME" %p: node %d find category from ports: %d %d",
 | 
							pw_log_debug(NAME" %p: node %d find category from ports: %d %d",
 | 
				
			||||||
			impl, node->obj.id, info->n_input_ports, info->n_output_ports);
 | 
								impl, node->obj.id, info->n_input_ports, info->n_output_ports);
 | 
				
			||||||
| 
						 | 
					@ -1041,9 +1055,8 @@ static int rescan_node(struct impl *impl, struct node *node)
 | 
				
			||||||
			media, category, role, exclusive, find.path_id);
 | 
								media, category, role, exclusive, find.path_id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	find.impl = impl;
 | 
						find.impl = impl;
 | 
				
			||||||
	find.sess = NULL;
 | 
					 | 
				
			||||||
	find.plugged = 0;
 | 
					 | 
				
			||||||
	find.exclusive = exclusive;
 | 
						find.exclusive = exclusive;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	spa_list_for_each(session, &impl->session_list, l)
 | 
						spa_list_for_each(session, &impl->session_list, l)
 | 
				
			||||||
		find_session(&find, session);
 | 
							find_session(&find, session);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -115,6 +115,7 @@ extern "C" {
 | 
				
			||||||
								  *  description. Ex. "Foobar USB Headset" */
 | 
													  *  description. Ex. "Foobar USB Headset" */
 | 
				
			||||||
#define PW_KEY_NODE_PLUGGED		"node.plugged"		/**< when the node was created. As a uint64 in
 | 
					#define PW_KEY_NODE_PLUGGED		"node.plugged"		/**< when the node was created. As a uint64 in
 | 
				
			||||||
								  *  nanoseconds. */
 | 
													  *  nanoseconds. */
 | 
				
			||||||
 | 
					#define PW_KEY_NODE_PRIORITY		"node.priority"		/**< priority of node */
 | 
				
			||||||
#define PW_KEY_NODE_SESSION		"node.session"		/**< the session id this node is part of */
 | 
					#define PW_KEY_NODE_SESSION		"node.session"		/**< the session id this node is part of */
 | 
				
			||||||
#define PW_KEY_NODE_EXCLUSIVE		"node.exclusive"	/**< node wants exclusive access to resources */
 | 
					#define PW_KEY_NODE_EXCLUSIVE		"node.exclusive"	/**< node wants exclusive access to resources */
 | 
				
			||||||
#define PW_KEY_NODE_AUTOCONNECT		"node.autoconnect"	/**< node wants to be automatically connected
 | 
					#define PW_KEY_NODE_AUTOCONNECT		"node.autoconnect"	/**< node wants to be automatically connected
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -554,6 +554,7 @@ int pw_node_register(struct pw_node *this,
 | 
				
			||||||
		PW_KEY_FACTORY_ID,
 | 
							PW_KEY_FACTORY_ID,
 | 
				
			||||||
		PW_KEY_CLIENT_ID,
 | 
							PW_KEY_CLIENT_ID,
 | 
				
			||||||
		PW_KEY_DEVICE_ID,
 | 
							PW_KEY_DEVICE_ID,
 | 
				
			||||||
 | 
							PW_KEY_NODE_PRIORITY,
 | 
				
			||||||
		PW_KEY_NODE_DESCRIPTION,
 | 
							PW_KEY_NODE_DESCRIPTION,
 | 
				
			||||||
		PW_KEY_NODE_NAME,
 | 
							PW_KEY_NODE_NAME,
 | 
				
			||||||
		PW_KEY_NODE_NICK,
 | 
							PW_KEY_NODE_NICK,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue