From 5f12dd99a3b0da3ee2768ea8b12b7018571b58d0 Mon Sep 17 00:00:00 2001 From: Alexander Sarmanow Date: Tue, 10 Feb 2026 18:34:27 +0100 Subject: [PATCH] bluez5: add adapter reference to remote_endpoint This should make adapter members easier accessible via remote endpoints. --- spa/plugins/bluez5/bluez5-dbus.c | 42 +++++++++++++++++++++++++------- spa/plugins/bluez5/defs.h | 1 + 2 files changed, 34 insertions(+), 9 deletions(-) diff --git a/spa/plugins/bluez5/bluez5-dbus.c b/spa/plugins/bluez5/bluez5-dbus.c index 651d410c9..43a108b2d 100644 --- a/spa/plugins/bluez5/bluez5-dbus.c +++ b/spa/plugins/bluez5/bluez5-dbus.c @@ -148,6 +148,7 @@ struct spa_bt_monitor { struct spa_bt_remote_endpoint { struct spa_list link; struct spa_list device_link; + struct spa_list adapter_link; struct spa_bt_monitor *monitor; char *path; char *transport_path; @@ -155,6 +156,7 @@ struct spa_bt_remote_endpoint { char *uuid; unsigned int codec; struct spa_bt_device *device; + struct spa_bt_adapter *adapter; uint8_t *capabilities; size_t capabilities_len; uint8_t *metadata; @@ -1641,6 +1643,8 @@ static struct spa_bt_adapter *adapter_create(struct spa_bt_monitor *monitor, con d->monitor = monitor; d->path = strdup(path); + spa_list_init(&d->remote_endpoint_list); + spa_list_prepend(&monitor->adapter_list, &d->link); adapter_init_bus_type(monitor, d); @@ -1655,6 +1659,7 @@ static void adapter_free(struct spa_bt_adapter *adapter) { struct spa_bt_monitor *monitor = adapter->monitor; struct spa_bt_device *d, *td; + struct spa_bt_remote_endpoint *ep, *tep; spa_log_debug(monitor->log, "%p", adapter); @@ -1663,6 +1668,13 @@ static void adapter_free(struct spa_bt_adapter *adapter) if (d->adapter == adapter) device_free(d); + spa_list_for_each_safe(ep, tep, &adapter->remote_endpoint_list, adapter_link) { + if (ep->adapter == adapter) { + spa_list_remove(&ep->adapter_link); + ep->adapter = NULL; + } + } + spa_bt_player_destroy(adapter->dummy_player); spa_list_remove(&adapter->link); @@ -3024,19 +3036,31 @@ static int remote_endpoint_update_props(struct spa_bt_remote_endpoint *remote_en } else if (spa_streq(key, "Device")) { struct spa_bt_device *device; + struct spa_bt_adapter *adapter; device = spa_bt_device_find(monitor, value); - if (device == NULL) - goto next; + adapter = adapter_find(monitor, value); + if (device != NULL) { + spa_log_debug(monitor->log, "remote_endpoint %p: device -> %p", remote_endpoint, device); - spa_log_debug(monitor->log, "remote_endpoint %p: device -> %p", remote_endpoint, device); + if (remote_endpoint->device != device) { + if (remote_endpoint->device != NULL) + spa_list_remove(&remote_endpoint->device_link); + remote_endpoint->device = device; + if (device != NULL) + spa_list_append(&device->remote_endpoint_list, &remote_endpoint->device_link); + } + } + if (adapter != NULL) { + spa_log_debug(monitor->log, "remote_endpoint %p: adapter -> %p", remote_endpoint, adapter); - if (remote_endpoint->device != device) { - if (remote_endpoint->device != NULL) - spa_list_remove(&remote_endpoint->device_link); - remote_endpoint->device = device; - if (device != NULL) - spa_list_append(&device->remote_endpoint_list, &remote_endpoint->device_link); + if (remote_endpoint->adapter != adapter) { + if (remote_endpoint->adapter != NULL) + spa_list_remove(&remote_endpoint->adapter_link); + remote_endpoint->adapter = adapter; + if (adapter != NULL) + spa_list_append(&adapter->remote_endpoint_list, &remote_endpoint->adapter_link); + } } } else if (spa_streq(key, "Transport")) { /* For ASHA */ diff --git a/spa/plugins/bluez5/defs.h b/spa/plugins/bluez5/defs.h index afc56c920..24a85a5c9 100644 --- a/spa/plugins/bluez5/defs.h +++ b/spa/plugins/bluez5/defs.h @@ -379,6 +379,7 @@ struct spa_bt_adapter { unsigned int has_media1_interface:1; unsigned int le_audio_bcast_supported:1; unsigned int tx_timestamping_supported:1; + struct spa_list remote_endpoint_list; }; enum spa_bt_form_factor {