| /* @file |
| * @brief Internal APIs for Audio Endpoint handling |
| |
| * Copyright (c) 2020 Intel Corporation |
| * Copyright (c) 2022-2023 Nordic Semiconductor ASA |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| #include <zephyr/bluetooth/audio/bap.h> |
| #include <zephyr/kernel.h> |
| #include <zephyr/types.h> |
| |
| #include "ascs_internal.h" |
| #include "bap_stream.h" |
| |
| #if defined(CONFIG_BT_BAP_UNICAST_CLIENT) |
| #define UNICAST_GROUP_CNT CONFIG_BT_BAP_UNICAST_CLIENT_GROUP_COUNT |
| #define UNICAST_GROUP_STREAM_CNT CONFIG_BT_BAP_UNICAST_CLIENT_GROUP_STREAM_COUNT |
| #else /* !CONFIG_BT_BAP_UNICAST_CLIENT */ |
| #define UNICAST_GROUP_CNT 0 |
| #define UNICAST_GROUP_STREAM_CNT 0 |
| #endif /* CONFIG_BT_BAP_UNICAST_CLIENT */ |
| #if defined(CONFIG_BT_BAP_BROADCAST_SOURCE) |
| #define BROADCAST_STREAM_CNT CONFIG_BT_BAP_BROADCAST_SRC_STREAM_COUNT |
| #else /* !CONFIG_BT_BAP_BROADCAST_SOURCE */ |
| #define BROADCAST_STREAM_CNT 0 |
| #endif /* CONFIG_BT_BAP_BROADCAST_SOURCE */ |
| |
| /* Temp struct declarations to handle circular dependencies */ |
| struct bt_bap_unicast_group; |
| struct bt_bap_broadcast_source; |
| struct bt_bap_broadcast_sink; |
| |
| struct bt_bap_ep { |
| uint8_t dir; |
| uint8_t cig_id; |
| uint8_t cis_id; |
| struct bt_ascs_ase_status status; |
| struct bt_bap_stream *stream; |
| struct bt_audio_codec_cfg codec_cfg; |
| struct bt_audio_codec_qos qos; |
| struct bt_audio_codec_qos_pref qos_pref; |
| struct bt_bap_iso *iso; |
| |
| /* unicast stopped reason */ |
| uint8_t reason; |
| |
| /* Used by the unicast server and client */ |
| bool receiver_ready; |
| |
| /* TODO: Create a union to reduce memory usage */ |
| struct bt_bap_unicast_group *unicast_group; |
| struct bt_bap_broadcast_source *broadcast_source; |
| struct bt_bap_broadcast_sink *broadcast_sink; |
| }; |
| |
| struct bt_bap_unicast_group { |
| uint8_t index; |
| bool allocated; |
| /* QoS used to create the CIG */ |
| const struct bt_audio_codec_qos *qos; |
| struct bt_iso_cig *cig; |
| /* The ISO API for CIG creation requires an array of pointers to ISO channels */ |
| struct bt_iso_chan *cis[UNICAST_GROUP_STREAM_CNT]; |
| sys_slist_t streams; |
| }; |
| |
| #if CONFIG_BT_AUDIO_CODEC_CFG_MAX_DATA_SIZE > 0 |
| struct bt_audio_broadcast_stream_data { |
| /** Codec Specific Data len */ |
| size_t data_len; |
| /** Codec Specific Data */ |
| uint8_t data[CONFIG_BT_AUDIO_CODEC_CFG_MAX_DATA_SIZE]; |
| }; |
| #endif /* CONFIG_BT_AUDIO_CODEC_CFG_MAX_DATA_SIZE > 0 */ |
| |
| struct bt_bap_broadcast_source { |
| uint8_t stream_count; |
| uint8_t packing; |
| bool encryption; |
| uint32_t broadcast_id; /* 24 bit */ |
| |
| struct bt_iso_big *big; |
| struct bt_audio_codec_qos *qos; |
| #if defined(CONFIG_BT_ISO_TEST_PARAMS) |
| /* Stored advanced parameters */ |
| uint8_t irc; |
| uint8_t pto; |
| uint16_t iso_interval; |
| #endif /* CONFIG_BT_ISO_TEST_PARAMS */ |
| |
| #if CONFIG_BT_AUDIO_CODEC_CFG_MAX_DATA_SIZE > 0 |
| /* The codec specific configured data for each stream in the subgroup */ |
| struct bt_audio_broadcast_stream_data stream_data[BROADCAST_STREAM_CNT]; |
| #endif /* CONFIG_BT_AUDIO_CODEC_CFG_MAX_DATA_SIZE > 0 */ |
| |
| uint8_t broadcast_code[BT_AUDIO_BROADCAST_CODE_SIZE]; |
| |
| /* The subgroups containing the streams used to create the broadcast source */ |
| sys_slist_t subgroups; |
| }; |
| |
| enum bt_bap_broadcast_sink_flag { |
| /** Sink has been initialized */ |
| BT_BAP_BROADCAST_SINK_FLAG_INITIALIZED, |
| |
| /** BIGInfo has been received */ |
| BT_BAP_BROADCAST_SINK_FLAG_BIGINFO_RECEIVED, |
| |
| /** Periodic Advertising is syncing */ |
| BT_BAP_BROADCAST_SINK_FLAG_SYNCING, |
| |
| /** Broadcast sink instance is scanning */ |
| BT_BAP_BROADCAST_SINK_FLAG_SCANNING, |
| |
| /** The BIG is encrypted */ |
| BT_BAP_BROADCAST_SINK_FLAG_BIG_ENCRYPTED, |
| |
| /** The Scan Delegator Source ID is valid */ |
| BT_BAP_BROADCAST_SINK_FLAG_SRC_ID_VALID, |
| |
| /** Total number of flags */ |
| BT_BAP_BROADCAST_SINK_FLAG_NUM_FLAGS, |
| }; |
| |
| struct bt_bap_broadcast_sink_subgroup { |
| uint32_t bis_indexes; |
| }; |
| |
| struct bt_bap_broadcast_sink_bis { |
| uint8_t index; |
| struct bt_iso_chan *chan; |
| struct bt_audio_codec_cfg codec_cfg; |
| }; |
| |
| #if defined(CONFIG_BT_BAP_BROADCAST_SINK) |
| struct bt_bap_broadcast_sink { |
| uint8_t index; /* index of broadcast_snks array */ |
| uint8_t stream_count; |
| uint8_t bass_src_id; |
| uint8_t subgroup_count; |
| uint16_t iso_interval; |
| uint16_t biginfo_num_bis; |
| uint32_t broadcast_id; /* 24 bit */ |
| uint32_t indexes_bitfield; |
| uint32_t valid_indexes_bitfield; /* based on codec support */ |
| struct bt_audio_codec_qos codec_qos; |
| struct bt_le_per_adv_sync *pa_sync; |
| struct bt_iso_big *big; |
| struct bt_bap_broadcast_sink_bis bis[CONFIG_BT_BAP_BROADCAST_SNK_STREAM_COUNT]; |
| struct bt_bap_broadcast_sink_subgroup subgroups[CONFIG_BT_BAP_BROADCAST_SNK_SUBGROUP_COUNT]; |
| const struct bt_bap_scan_delegator_recv_state *recv_state; |
| /* The streams used to create the broadcast sink */ |
| sys_slist_t streams; |
| |
| /** Flags */ |
| ATOMIC_DEFINE(flags, BT_BAP_BROADCAST_SINK_FLAG_NUM_FLAGS); |
| }; |
| #endif /* CONFIG_BT_BAP_BROADCAST_SINK */ |
| |
| static inline const char *bt_bap_ep_state_str(uint8_t state) |
| { |
| switch (state) { |
| case BT_BAP_EP_STATE_IDLE: |
| return "idle"; |
| case BT_BAP_EP_STATE_CODEC_CONFIGURED: |
| return "codec-configured"; |
| case BT_BAP_EP_STATE_QOS_CONFIGURED: |
| return "qos-configured"; |
| case BT_BAP_EP_STATE_ENABLING: |
| return "enabling"; |
| case BT_BAP_EP_STATE_STREAMING: |
| return "streaming"; |
| case BT_BAP_EP_STATE_DISABLING: |
| return "disabling"; |
| case BT_BAP_EP_STATE_RELEASING: |
| return "releasing"; |
| default: |
| return "unknown"; |
| } |
| } |
| |
| bool bt_bap_ep_is_broadcast_snk(const struct bt_bap_ep *ep); |
| bool bt_bap_ep_is_broadcast_src(const struct bt_bap_ep *ep); |
| bool bt_bap_ep_is_unicast_client(const struct bt_bap_ep *ep); |