When BT adapter is not CIS Peripheral capable, use the shared/bap code in its central-only mode, and don't register anything in the local GATT database. When BT adapter is not CIS Central capable, ignore the remote device GATT database, so that we work purely in peripheral mode. If BT adapter supports neither feature, don't do anything with BAP. --- profiles/audio/bap.c | 18 ++++++++++++++++-- profiles/audio/media.c | 11 ++++++----- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/profiles/audio/bap.c b/profiles/audio/bap.c index e5ffb7230..28c0d139a 100644 --- a/profiles/audio/bap.c +++ b/profiles/audio/bap.c @@ -1254,6 +1254,8 @@ static int bap_probe(struct btd_service *service) struct btd_adapter *adapter = device_get_adapter(device); struct btd_gatt_database *database = btd_adapter_get_database(adapter); struct bap_data *data = btd_service_get_user_data(service); + struct bt_bap_db *ldb; + struct gatt_db *device_db; char addr[18]; ba2str(device_get_address(device), addr); @@ -1264,17 +1266,29 @@ static int bap_probe(struct btd_service *service) return -ENOTSUP; } + if (!btd_adapter_cis_central_capable(adapter) && + !btd_adapter_cis_peripheral_capable(adapter)) { + DBG("BAP requires CIS features, unsupported by adapter"); + return -ENOTSUP; + } + /* Ignore, if we were probed for this device already */ if (data) { error("Profile probed twice for the same device!"); return -EINVAL; } + if (btd_adapter_cis_central_capable(adapter)) + device_db = btd_device_get_gatt_db(device); + else + device_db = NULL; + data = bap_data_new(device); data->service = service; - data->bap = bt_bap_new(btd_gatt_database_get_db(database), - btd_device_get_gatt_db(device)); + ldb = bt_bap_get_local_db(btd_gatt_database_get_db(database), + btd_adapter_cis_peripheral_capable(adapter)); + data->bap = bt_bap_new(ldb, device_db); if (!data->bap) { error("Unable to create BAP instance"); free(data); diff --git a/profiles/audio/media.c b/profiles/audio/media.c index d68085514..6f83b03b5 100644 --- a/profiles/audio/media.c +++ b/profiles/audio/media.c @@ -1105,8 +1105,9 @@ static void bap_debug(const char *str, void *user_data) static bool endpoint_init_pac(struct media_endpoint *endpoint, uint8_t type, int *err) { + struct btd_adapter *adapter = endpoint->adapter->btd_adapter; struct btd_gatt_database *database; - struct gatt_db *db; + struct bt_bap_db *ldb; struct iovec data; char *name; @@ -1116,7 +1117,7 @@ static bool endpoint_init_pac(struct media_endpoint *endpoint, uint8_t type, return false; } - database = btd_adapter_get_database(endpoint->adapter->btd_adapter); + database = btd_adapter_get_database(adapter); if (!database) { error("Adapter database not found"); return false; @@ -1128,8 +1129,6 @@ static bool endpoint_init_pac(struct media_endpoint *endpoint, uint8_t type, return false; } - db = btd_gatt_database_get_db(database); - data.iov_base = endpoint->capabilities; data.iov_len = endpoint->size; @@ -1141,7 +1140,9 @@ static bool endpoint_init_pac(struct media_endpoint *endpoint, uint8_t type, return false; } - endpoint->pac = bt_bap_add_pac(db, name, type, endpoint->codec, + ldb = bt_bap_get_local_db(btd_gatt_database_get_db(database), + btd_adapter_cis_peripheral_capable(adapter)); + endpoint->pac = bt_bap_add_pac(ldb, name, type, endpoint->codec, &endpoint->qos, &data, NULL); if (!endpoint->pac) { error("Unable to create PAC"); -- 2.39.1