From 4a8afe389cfad7e367d71a4f762815ab9bbb2ae6 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Mon, 27 Jul 2020 10:15:10 +0200 Subject: [PATCH] policy-node: boost priority on default device When we find a default device, boost the priority so that it remains the target device even when a device with higher priority is scanned later. Fixes issue where default device was not selected because a higher priority device was encountered after it. --- src/examples/media-session/policy-node.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/examples/media-session/policy-node.c b/src/examples/media-session/policy-node.c index c069acbff..11cb541c4 100644 --- a/src/examples/media-session/policy-node.c +++ b/src/examples/media-session/policy-node.c @@ -359,7 +359,6 @@ static int find_node(void *data, struct node *node) int priority = 0; uint64_t plugged = 0; struct sm_device *device = node->obj->device; - bool is_default = false; pw_log_debug(NAME " %p: looking at node '%d' enabled:%d state:%d peer:%p exclusive:%d", impl, node->id, node->enabled, node->obj->info->state, node->peer, node->exclusive); @@ -380,16 +379,19 @@ static int find_node(void *data, struct node *node) pw_log_debug(".. incompatible media %s <-> %s", node->media, find->target->media); return 0; } + plugged = node->plugged; + priority = node->priority; + if (node->media && strcmp(node->media, "Audio") == 0) { + bool is_default = false; if (node->direction == PW_DIRECTION_INPUT) is_default = impl->default_audio_sink == node->id; else if (node->direction == PW_DIRECTION_OUTPUT) is_default = impl->default_audio_source == node->id; + if (is_default) + priority += 1000; } - plugged = node->plugged; - priority = node->priority; - if ((find->exclusive && node->obj->info->state == PW_NODE_STATE_RUNNING) || (node->peer && node->peer->exclusive)) { pw_log_debug(NAME " %p: node '%d' in use", impl, node->id); @@ -399,7 +401,7 @@ static int find_node(void *data, struct node *node) pw_log_debug(NAME " %p: found node '%d' %"PRIu64" prio:%d", impl, node->id, plugged, priority); - if (find->node == NULL || is_default || + if (find->node == NULL || priority > find->priority || (priority == find->priority && plugged > find->plugged)) { pw_log_debug(NAME " %p: new best %d %" PRIu64, impl, priority, plugged);