From bbe1587f717d833c5c7e87ea07849d0d8548095b Mon Sep 17 00:00:00 2001 From: Pauli Virtanen Date: Tue, 8 Apr 2025 01:04:42 +0300 Subject: [PATCH] bluez5: fix volume ids Node ids don't map directly to volume ids. Fix the indexing. --- spa/plugins/bluez5/bluez5-dbus.c | 6 +++++- spa/plugins/bluez5/bluez5-device.c | 20 ++++++++++++++------ 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/spa/plugins/bluez5/bluez5-dbus.c b/spa/plugins/bluez5/bluez5-dbus.c index e4495f0e8..98feef69f 100644 --- a/spa/plugins/bluez5/bluez5-dbus.c +++ b/spa/plugins/bluez5/bluez5-dbus.c @@ -3608,9 +3608,13 @@ fail: static int transport_set_volume(void *data, int id, float volume) { struct spa_bt_transport *transport = data; - struct spa_bt_transport_volume *t_volume = &transport->volumes[id]; + struct spa_bt_transport_volume *t_volume; uint16_t value; + spa_assert(id >= 0 && id < (int)SPA_N_ELEMENTS(transport->volumes)); + + t_volume = &transport->volumes[id]; + if (!t_volume->active || !spa_bt_transport_volume_enabled(transport)) return -ENOTSUP; diff --git a/spa/plugins/bluez5/bluez5-device.c b/spa/plugins/bluez5/bluez5-device.c index 2095ba82c..b6357e9cd 100644 --- a/spa/plugins/bluez5/bluez5-device.c +++ b/spa/plugins/bluez5/bluez5-device.c @@ -402,9 +402,15 @@ static void node_update_soft_volumes(struct node *node, float hw_volume) } } +static int get_volume_id(int node_id) +{ + return (node_id & SINK_ID_FLAG) ? SPA_BT_VOLUME_ID_TX : SPA_BT_VOLUME_ID_RX; +} + static bool node_update_volume_from_transport(struct node *node, bool reset) { struct impl *impl = node->impl; + int volume_id = get_volume_id(node->id); struct spa_bt_transport_volume *t_volume; float prev_hw_volume; @@ -417,7 +423,7 @@ static bool node_update_volume_from_transport(struct node *node, bool reset) && impl->profile != DEVICE_PROFILE_HSP_HFP) return false; - t_volume = &node->transport->volumes[node->id]; + t_volume = &node->transport->volumes[volume_id]; if (!t_volume->active) return false; @@ -2562,6 +2568,7 @@ static void device_set_update_volumes(struct node *node) struct device_set *dset = &impl->device_set; float hw_volume = node_get_hw_volume(node); bool sink = (node->id == DEVICE_ID_SINK_SET); + int volume_id = get_volume_id(node->id); struct device_set_member *members = sink ? dset->sink : dset->source; uint32_t n_members = sink ? dset->sinks : dset->sources; uint32_t i; @@ -2572,7 +2579,7 @@ static void device_set_update_volumes(struct node *node) for (i = 0; i < n_members; ++i) { struct spa_bt_transport *t = members[i].transport; - struct spa_bt_transport_volume *t_volume = t ? &t->volumes[members[i].id] : NULL; + struct spa_bt_transport_volume *t_volume = t ? &t->volumes[volume_id] : NULL; if (!t_volume || !t_volume->active) goto soft_volume; @@ -2580,13 +2587,13 @@ static void device_set_update_volumes(struct node *node) node_update_soft_volumes(node, hw_volume); for (i = 0; i < n_members; ++i) - spa_bt_transport_set_volume(members[i].transport, members[i].id, hw_volume); + spa_bt_transport_set_volume(members[i].transport, volume_id, hw_volume); return; soft_volume: /* Soft volume fallback */ for (i = 0; i < n_members; ++i) - spa_bt_transport_set_volume(members[i].transport, members[i].id, 1.0f); + spa_bt_transport_set_volume(members[i].transport, volume_id, 1.0f); node_update_soft_volumes(node, 1.0f); return; } @@ -2596,6 +2603,7 @@ static int node_set_volume(struct impl *this, struct node *node, float volumes[] uint32_t i; int changed = 0; struct spa_bt_transport_volume *t_volume; + int volume_id = get_volume_id(node->id); if (n_volumes == 0) return -EINVAL; @@ -2609,7 +2617,7 @@ static int node_set_volume(struct impl *this, struct node *node, float volumes[] node->volumes[i] = volumes[i % n_volumes]; } - t_volume = node->transport ? &node->transport->volumes[node->id]: NULL; + t_volume = node->transport ? &node->transport->volumes[volume_id]: NULL; if (t_volume && t_volume->active && spa_bt_transport_volume_enabled(node->transport)) { @@ -2617,7 +2625,7 @@ static int node_set_volume(struct impl *this, struct node *node, float volumes[] spa_log_debug(this->log, "node %d hardware volume %f", node->id, hw_volume); node_update_soft_volumes(node, hw_volume); - spa_bt_transport_set_volume(node->transport, node->id, hw_volume); + spa_bt_transport_set_volume(node->transport, volume_id, hw_volume); } else if (node->id == DEVICE_ID_SOURCE_SET || node->id == DEVICE_ID_SINK_SET) { device_set_update_volumes(node); } else {