This adds public BAP helpers to convert iso_qos to bap_qos and reversed. This is needed for the BASS plugin to handle the Scan Delegator (BASS Server) role internally (to create/handle BAP streams when receiving the Add Source command from a Broadcast Assistant). --- profiles/audio/bap.c | 93 +++++++++++++++++++++++++------------------- profiles/audio/bap.h | 5 +++ 2 files changed, 58 insertions(+), 40 deletions(-) diff --git a/profiles/audio/bap.c b/profiles/audio/bap.c index dbea59776..8635c383d 100644 --- a/profiles/audio/bap.c +++ b/profiles/audio/bap.c @@ -1041,6 +1041,57 @@ static void print_ltv(size_t i, uint8_t l, uint8_t t, uint8_t *v, util_hexdump(' ', v, l, user_data, NULL); } +void bap_qos_to_iso_qos(struct bt_bap_qos *bap_qos, + struct bt_iso_qos *iso_qos) +{ + memset(iso_qos, 0, sizeof(*iso_qos)); + + iso_qos->bcast.big = bap_qos->bcast.big; + iso_qos->bcast.bis = bap_qos->bcast.bis; + iso_qos->bcast.sync_factor = bap_qos->bcast.sync_factor; + iso_qos->bcast.packing = bap_qos->bcast.packing; + iso_qos->bcast.framing = bap_qos->bcast.framing; + iso_qos->bcast.encryption = bap_qos->bcast.encryption; + if (bap_qos->bcast.bcode && bap_qos->bcast.bcode->iov_base) + memcpy(iso_qos->bcast.bcode, bap_qos->bcast.bcode->iov_base, + bap_qos->bcast.bcode->iov_len); + iso_qos->bcast.options = bap_qos->bcast.options; + iso_qos->bcast.skip = bap_qos->bcast.skip; + iso_qos->bcast.sync_timeout = bap_qos->bcast.sync_timeout; + iso_qos->bcast.sync_cte_type = bap_qos->bcast.sync_cte_type; + iso_qos->bcast.mse = bap_qos->bcast.mse; + iso_qos->bcast.timeout = bap_qos->bcast.timeout; + memcpy(&iso_qos->bcast.out, &bap_qos->bcast.io_qos, + sizeof(struct bt_iso_io_qos)); +} + +void bap_iso_qos_to_bap_qos(struct bt_iso_qos *iso_qos, + struct bt_bap_qos *bap_qos) +{ + bap_qos->bcast.big = iso_qos->bcast.big; + bap_qos->bcast.bis = iso_qos->bcast.bis; + bap_qos->bcast.sync_factor = iso_qos->bcast.sync_factor; + bap_qos->bcast.packing = iso_qos->bcast.packing; + bap_qos->bcast.framing = iso_qos->bcast.framing; + bap_qos->bcast.encryption = iso_qos->bcast.encryption; + if (bap_qos->bcast.encryption) + bap_qos->bcast.bcode = util_iov_new(iso_qos->bcast.bcode, + sizeof(iso_qos->bcast.bcode)); + bap_qos->bcast.options = iso_qos->bcast.options; + bap_qos->bcast.skip = iso_qos->bcast.skip; + bap_qos->bcast.sync_timeout = iso_qos->bcast.sync_timeout; + bap_qos->bcast.sync_cte_type = + iso_qos->bcast.sync_cte_type; + bap_qos->bcast.mse = iso_qos->bcast.mse; + bap_qos->bcast.timeout = iso_qos->bcast.timeout; + bap_qos->bcast.io_qos.interval = + iso_qos->bcast.in.interval; + bap_qos->bcast.io_qos.latency = iso_qos->bcast.in.latency; + bap_qos->bcast.io_qos.phy = iso_qos->bcast.in.phy; + bap_qos->bcast.io_qos.rtn = iso_qos->bcast.in.rtn; + bap_qos->bcast.io_qos.sdu = iso_qos->bcast.in.sdu; +} + static void create_stream_for_bis(struct bap_data *bap_data, struct bt_bap_pac *lpac, struct bt_iso_qos *qos, struct iovec *caps, struct iovec *meta, char *path) @@ -1050,28 +1101,7 @@ static void create_stream_for_bis(struct bap_data *bap_data, setup = setup_new(NULL); /* Create BAP QoS structure */ - setup->qos.bcast.big = qos->bcast.big; - setup->qos.bcast.bis = qos->bcast.bis; - setup->qos.bcast.sync_factor = qos->bcast.sync_factor; - setup->qos.bcast.packing = qos->bcast.packing; - setup->qos.bcast.framing = qos->bcast.framing; - setup->qos.bcast.encryption = qos->bcast.encryption; - if (setup->qos.bcast.encryption) - setup->qos.bcast.bcode = util_iov_new(qos->bcast.bcode, - sizeof(qos->bcast.bcode)); - setup->qos.bcast.options = qos->bcast.options; - setup->qos.bcast.skip = qos->bcast.skip; - setup->qos.bcast.sync_timeout = qos->bcast.sync_timeout; - setup->qos.bcast.sync_cte_type = - qos->bcast.sync_cte_type; - setup->qos.bcast.mse = qos->bcast.mse; - setup->qos.bcast.timeout = qos->bcast.timeout; - setup->qos.bcast.io_qos.interval = - qos->bcast.in.interval; - setup->qos.bcast.io_qos.latency = qos->bcast.in.latency; - setup->qos.bcast.io_qos.phy = qos->bcast.in.phy; - setup->qos.bcast.io_qos.rtn = qos->bcast.in.rtn; - setup->qos.bcast.io_qos.sdu = qos->bcast.in.sdu; + bap_iso_qos_to_bap_qos(qos, &setup->qos); queue_push_tail(bap_data->bcast_snks, setup); @@ -3160,24 +3190,7 @@ static void iso_do_big_sync(GIOChannel *io, void *user_data) queue_foreach(setups, setup_refresh_qos, NULL); /* Set the user requested QOS */ - memset(&qos, 0, sizeof(qos)); - qos.bcast.big = setup->qos.bcast.big; - qos.bcast.bis = setup->qos.bcast.bis; - qos.bcast.sync_factor = setup->qos.bcast.sync_factor; - qos.bcast.packing = setup->qos.bcast.packing; - qos.bcast.framing = setup->qos.bcast.framing; - qos.bcast.encryption = setup->qos.bcast.encryption; - if (setup->qos.bcast.bcode && setup->qos.bcast.bcode->iov_base) - memcpy(qos.bcast.bcode, setup->qos.bcast.bcode->iov_base, - setup->qos.bcast.bcode->iov_len); - qos.bcast.options = setup->qos.bcast.options; - qos.bcast.skip = setup->qos.bcast.skip; - qos.bcast.sync_timeout = setup->qos.bcast.sync_timeout; - qos.bcast.sync_cte_type = setup->qos.bcast.sync_cte_type; - qos.bcast.mse = setup->qos.bcast.mse; - qos.bcast.timeout = setup->qos.bcast.timeout; - memcpy(&qos.bcast.out, &setup->qos.bcast.io_qos, - sizeof(struct bt_iso_io_qos)); + bap_qos_to_iso_qos(&setup->qos, &qos); if (!bt_io_set(io, &err, BT_IO_OPT_QOS, &qos, diff --git a/profiles/audio/bap.h b/profiles/audio/bap.h index 98bea558c..ab35a3775 100644 --- a/profiles/audio/bap.h +++ b/profiles/audio/bap.h @@ -19,3 +19,8 @@ void bap_scan_delegator_probe(struct btd_device *device); bool parse_base(struct bt_iso_base *base, struct bt_iso_qos *qos, util_debug_func_t func, bap_stream_cb_t handler, void *user_data); + +void bap_iso_qos_to_bap_qos(struct bt_iso_qos *iso_qos, + struct bt_bap_qos *bap_qos); +void bap_qos_to_iso_qos(struct bt_bap_qos *bap_qos, + struct bt_iso_qos *iso_qos); -- 2.43.0