mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-12-17 08:56:49 -05:00
bluez5: fix logic error in device set leader selection
Fix device set node sometimes not being emitted. When leader changed it marked no-one as leader, do that in less buggy way.
This commit is contained in:
parent
d121d273f0
commit
b7e863b8cf
1 changed files with 14 additions and 24 deletions
|
|
@ -2018,41 +2018,31 @@ static void device_update_hw_volume_profiles(struct spa_bt_device *device)
|
||||||
|
|
||||||
static bool device_set_update_leader(struct spa_bt_set_membership *set)
|
static bool device_set_update_leader(struct spa_bt_set_membership *set)
|
||||||
{
|
{
|
||||||
struct spa_bt_set_membership *s, *leader;
|
struct spa_bt_set_membership *s, *leader = NULL;
|
||||||
int min_rank = INT_MAX;
|
|
||||||
int leader_rank = INT_MAX;
|
|
||||||
|
|
||||||
leader = NULL;
|
|
||||||
|
|
||||||
|
/* Make minimum rank device the leader, so that device set nodes always
|
||||||
|
* appear under a specific device.
|
||||||
|
*/
|
||||||
spa_bt_for_each_set_member(s, set) {
|
spa_bt_for_each_set_member(s, set) {
|
||||||
if (!(s->device->connected_profiles & SPA_BT_PROFILE_BAP_DUPLEX))
|
if (!(s->device->connected_profiles & SPA_BT_PROFILE_BAP_DUPLEX))
|
||||||
continue;
|
continue;
|
||||||
min_rank = SPA_MIN(min_rank, s->rank);
|
|
||||||
if (s->leader) {
|
if (leader == NULL || s->rank < leader->rank ||
|
||||||
leader_rank = s->rank;
|
(s->rank == leader->rank && s->leader))
|
||||||
leader = s;
|
leader = s;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (min_rank >= leader_rank && leader)
|
if (leader == NULL || (leader && leader->leader))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
spa_bt_for_each_set_member(s, set) {
|
spa_bt_for_each_set_member(s, set)
|
||||||
if (leader == NULL && s->rank == min_rank &&
|
|
||||||
(s->device->connected_profiles & SPA_BT_PROFILE_BAP_DUPLEX)) {
|
|
||||||
s->leader = true;
|
|
||||||
leader = s;
|
|
||||||
} else {
|
|
||||||
s->leader = false;
|
s->leader = false;
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (leader) {
|
leader->leader = true;
|
||||||
struct spa_bt_monitor *monitor = leader->device->monitor;
|
|
||||||
|
|
||||||
spa_log_debug(monitor->log, "device set %s: leader is %s",
|
spa_log_debug(leader->device->monitor->log,
|
||||||
leader->path, leader->device->path);
|
"device set %p %s: leader is %s",
|
||||||
}
|
set, leader->path, leader->device->path);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue