node: add node.priority

Add a simple priority to nodes.
This commit is contained in:
Wim Taymans 2019-10-17 12:43:23 +02:00
parent e2f6a7a34e
commit ecd8dbc7f0
4 changed files with 32 additions and 5 deletions

View file

@ -103,7 +103,8 @@ static struct alsa_node *alsa_create_node(struct alsa_object *obj, uint32_t id,
struct monitor *monitor = obj->monitor;
struct impl *impl = monitor->impl;
int res;
const char *dev, *subdev;
const char *card, *dev, *subdev;
int priority;
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);
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)
dev = "0";
if ((subdev = pw_properties_get(node->props, SPA_KEY_API_ALSA_PCM_SUBDEVICE)) == NULL)
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) {
const char *devname, *stream;
if ((devname = pw_properties_get(obj->props, SPA_KEY_DEVICE_NAME)) == NULL)

View file

@ -172,6 +172,7 @@ struct session {
struct impl *impl;
enum pw_direction direction;
int priority;
uint64_t plugged;
struct node *node;
@ -503,6 +504,11 @@ handle_node(struct impl *impl, uint32_t id,
else
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_append(&impl->session_list, &sess->l);
@ -793,6 +799,7 @@ struct find_data {
const char *media_class;
struct session *sess;
bool exclusive;
int priority;
uint64_t plugged;
};
@ -802,6 +809,7 @@ static int find_session(void *data, struct session *sess)
struct impl *impl = find->impl;
const struct spa_dict *props;
const char *str;
int priority = 0;
uint64_t plugged = 0;
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;
plugged = sess->plugged;
priority = sess->priority;
}
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,
sess->id, plugged);
if (find->sess == NULL || plugged > find->plugged) {
pw_log_debug(NAME " %p: new best %" PRIu64, impl, plugged);
if (find->sess == NULL ||
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->priority = priority;
find->plugged = plugged;
}
return 0;
@ -953,6 +965,8 @@ static int rescan_node(struct impl *impl, struct node *node)
return 0;
}
spa_zero(find);
if ((category = spa_dict_lookup(props, PW_KEY_MEDIA_CATEGORY)) == NULL) {
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);
@ -1041,9 +1055,8 @@ static int rescan_node(struct impl *impl, struct node *node)
media, category, role, exclusive, find.path_id);
find.impl = impl;
find.sess = NULL;
find.plugged = 0;
find.exclusive = exclusive;
spa_list_for_each(session, &impl->session_list, l)
find_session(&find, session);

View file

@ -115,6 +115,7 @@ extern "C" {
* description. Ex. "Foobar USB Headset" */
#define PW_KEY_NODE_PLUGGED "node.plugged" /**< when the node was created. As a uint64 in
* 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_EXCLUSIVE "node.exclusive" /**< node wants exclusive access to resources */
#define PW_KEY_NODE_AUTOCONNECT "node.autoconnect" /**< node wants to be automatically connected

View file

@ -554,6 +554,7 @@ int pw_node_register(struct pw_node *this,
PW_KEY_FACTORY_ID,
PW_KEY_CLIENT_ID,
PW_KEY_DEVICE_ID,
PW_KEY_NODE_PRIORITY,
PW_KEY_NODE_DESCRIPTION,
PW_KEY_NODE_NAME,
PW_KEY_NODE_NICK,