| /** @file |
| * @brief Bluetooth Audio handling |
| */ |
| |
| /* |
| * Copyright (c) 2020 Intel Corporation |
| * Copyright (c) 2020-2022 Nordic Semiconductor ASA |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| #ifndef ZEPHYR_INCLUDE_BLUETOOTH_AUDIO_AUDIO_H_ |
| #define ZEPHYR_INCLUDE_BLUETOOTH_AUDIO_AUDIO_H_ |
| |
| #include <sys/atomic.h> |
| #include <bluetooth/buf.h> |
| #include <bluetooth/conn.h> |
| #include <bluetooth/hci.h> |
| #include <bluetooth/iso.h> |
| #include <bluetooth/gatt.h> |
| #include <bluetooth/audio/lc3.h> |
| |
| /** |
| * @brief Bluetooth Audio |
| * @defgroup bt_audio Bluetooth Audio |
| * @ingroup bluetooth |
| * @{ |
| */ |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| #define BT_AUDIO_BROADCAST_ID_SIZE 3 /* octets */ |
| |
| /** @brief Audio Context Type, Generic Audio |
| * |
| * These values are defined by the Generic Audio Assigned Numbers |
| */ |
| /** @def BT_AUDIO_CONTEXT_TYPE_PROHIBITED |
| * @brief Prohibited. Excluded from usage. |
| */ |
| #define BT_AUDIO_CONTEXT_TYPE_PROHIBITED 0 |
| /** @def BT_AUDIO_CONTEXT_TYPE_UNSPECIFIED |
| * @brief Unspecified type |
| * |
| * Unspecified, matches any audio content. |
| */ |
| #define BT_AUDIO_CONTEXT_TYPE_UNSPECIFIED BIT(0) |
| /** @def BT_AUDIO_CONTEXT_TYPE_CONVERSATIONAL |
| * @brief Conversational audio |
| * |
| * Conversation between humans. as, for example, in telephony or video calls. |
| */ |
| #define BT_AUDIO_CONTEXT_TYPE_CONVERSATIONAL BIT(1) |
| /** @def BT_AUDIO_CONTEXT_TYPE_MEDIA |
| * @brief Media |
| * |
| * Media as, for example, in music, public radio, podcast or video soundtrack. |
| * Conversation between humans as, for example, in telephony or video calls. |
| */ |
| #define BT_AUDIO_CONTEXT_TYPE_MEDIA BIT(2) |
| /** @def BT_AUDIO_CONTEXT_TYPE_GAME |
| * @brief Game audio |
| * |
| * Audio assiociated with video gaming as, for example, gaming media, gaming effects; |
| * music and in-game voice chat between participants; or a mix of all the above. |
| */ |
| #define BT_AUDIO_CONTEXT_TYPE_GAME BIT(3) |
| /** @def BT_AUDIO_CONTEXT_TYPE_INSTRUCTIONAL |
| * @brief Instructional audio |
| * |
| * Instructional audio as, for example, in navigation, traffic announcements or user guidance. |
| */ |
| #define BT_AUDIO_CONTEXT_TYPE_INSTRUCTIONAL BIT(4) |
| /** @def BT_AUDIO_CONTEXT_TYPE_VOICE_ASSISTANTS |
| * @brief Voice assistant audio |
| * |
| * Man-machine communication, for example, with voice recognition or virtual assistants. |
| */ |
| #define BT_AUDIO_CONTEXT_TYPE_VOICE_ASSISTANTS BIT(5) |
| /** @def BT_AUDIO_CONTEXT_TYPE_LIVE |
| * @brief Live audio |
| * |
| * Live audio, for example, from a microphone where audio is perceived both through |
| * a direct acoustic path and through an LE Audio Stream. |
| */ |
| #define BT_AUDIO_CONTEXT_TYPE_LIVE BIT(6) |
| /** @def BT_AUDIO_CONTEXT_TYPE_SOUND_EFFECTS |
| * @brief Sound effects |
| * |
| * Sound effects including keyboard and touch feedback; menu and user interface sounds; |
| * and other system sounds. |
| */ |
| #define BT_AUDIO_CONTEXT_TYPE_SOUND_EFFECTS BIT(7) |
| /** @def BT_AUDIO_CONTEXT_TYPE_NOTIFICATIONS |
| * @brief Notification and reminder sounds |
| * |
| * Notification and reminder sounds; attention-seeking audio, for example, in beeps signaling |
| * the arrival of a message. |
| */ |
| #define BT_AUDIO_CONTEXT_TYPE_NOTIFICATIONS BIT(8) |
| /** @def BT_AUDIO_CONTEXT_TYPE_RINGTONE |
| * @brief Ringtone as in a call alert |
| * |
| * Alerts the user to an incoming call, for example, an incoming telephony or video call, |
| * including traditional cellular as well as VoIP and Push-to-Talk. |
| */ |
| #define BT_AUDIO_CONTEXT_TYPE_RINGTONE BIT(9) |
| /** @def BT_AUDIO_CONTEXT_TYPE_ALERTS |
| * @brief Alarms and timers |
| * |
| * Alarms and timers; immediate alerts, for example, in a critical battery alarm, timer expiry or |
| * alarm clock, toaster cooker, kettle, microwave, etc. |
| */ |
| #define BT_AUDIO_CONTEXT_TYPE_ALERTS BIT(10) |
| /** @def BT_AUDIO_CONTEXT_TYPE_EMERGENCY_ALARM |
| * @brief Emergency alarm |
| * |
| * Emergency alerts as, for example, with fire alarms or other urgent alerts. |
| */ |
| #define BT_AUDIO_CONTEXT_TYPE_EMERGENCY_ALARM BIT(11) |
| /** @def BT_AUDIO_CONTEXT_TYPE_ANY |
| * |
| * Any known context. |
| */ |
| #define BT_AUDIO_CONTEXT_TYPE_ANY (BT_AUDIO_CONTEXT_TYPE_UNSPECIFIED | \ |
| BT_AUDIO_CONTEXT_TYPE_CONVERSATIONAL | \ |
| BT_AUDIO_CONTEXT_TYPE_MEDIA | \ |
| BT_AUDIO_CONTEXT_TYPE_GAME | \ |
| BT_AUDIO_CONTEXT_TYPE_INSTRUCTIONAL | \ |
| BT_AUDIO_CONTEXT_TYPE_VOICE_ASSISTANTS | \ |
| BT_AUDIO_CONTEXT_TYPE_LIVE | \ |
| BT_AUDIO_CONTEXT_TYPE_SOUND_EFFECTS | \ |
| BT_AUDIO_CONTEXT_TYPE_NOTIFICATIONS | \ |
| BT_AUDIO_CONTEXT_TYPE_RINGTONE | \ |
| BT_AUDIO_CONTEXT_TYPE_ALERTS | \ |
| BT_AUDIO_CONTEXT_TYPE_EMERGENCY_ALARM) |
| |
| |
| /* Unicast Announcement Type, Generic Audio */ |
| #define BT_AUDIO_UNICAST_ANNOUNCEMENT_GENERAL 0x00 |
| #define BT_AUDIO_UNICAST_ANNOUNCEMENT_TARGETED 0x01 |
| |
| #if defined(CONFIG_BT_AUDIO_BROADCAST_SINK) |
| #define BROADCAST_SNK_STREAM_CNT CONFIG_BT_AUDIO_BROADCAST_SNK_STREAM_COUNT |
| #define BROADCAST_SNK_SUBGROUP_CNT CONFIG_BT_AUDIO_BROADCAST_SNK_SUBGROUP_COUNT |
| #else /* !CONFIG_BT_AUDIO_BROADCAST_SINK */ |
| #define BROADCAST_SNK_STREAM_CNT 0 |
| #define BROADCAST_SNK_SUBGROUP_CNT 0 |
| #endif /* CONFIG_BT_AUDIO_BROADCAST_SINK*/ |
| |
| /** @brief Abstract Audio Unicast Group structure. */ |
| struct bt_audio_unicast_group; |
| |
| /** @brief Abstract Audio Broadcast Sink structure. */ |
| struct bt_audio_broadcast_sink; |
| |
| /** @brief Abstract Audio Broadcast Source structure. */ |
| struct bt_audio_broadcast_source; |
| |
| /** @brief Codec configuration structure */ |
| struct bt_codec_data { |
| struct bt_data data; |
| uint8_t value[CONFIG_BT_CODEC_MAX_DATA_LEN]; |
| }; |
| |
| /** @def BT_CODEC_DATA |
| * @brief Helper to declare elements of bt_codec_data arrays |
| * |
| * This macro is mainly for creating an array of struct bt_codec_data |
| * elements inside bt_codec which is then passed to the likes of |
| * bt_audio_stream_config or bt_audio_stream_reconfig. |
| * |
| * @param _type Type of advertising data field |
| * @param _bytes Variable number of single-byte parameters |
| */ |
| #define BT_CODEC_DATA(_type, _bytes...) \ |
| { \ |
| .data = BT_DATA(_type, ((uint8_t []) { _bytes }), \ |
| sizeof((uint8_t []) { _bytes })) \ |
| } |
| |
| /** @def BT_CODEC |
| * @brief Helper to declare bt_codec structure |
| * |
| * @param _id Codec ID |
| * @param _cid Company ID |
| * @param _vid Vendor ID |
| * @param _data Codec Specific Data in LVT format |
| * @param _meta Codec Specific Metadata in LVT format |
| */ |
| #define BT_CODEC(_id, _cid, _vid, _data, _meta) \ |
| { \ |
| .id = _id, \ |
| .cid = _cid, \ |
| .vid = _vid, \ |
| .data_count = ARRAY_SIZE(((struct bt_codec_data[]) _data)), \ |
| .data = _data, \ |
| .meta_count = ARRAY_SIZE(((struct bt_codec_data[]) _meta)), \ |
| .meta = _meta, \ |
| } |
| |
| |
| /** @brief Meta data type ids used for LTV encoded metadata. |
| * |
| * These values are defined by the Generic Audio Assigned Numbers, bluetooth.com |
| */ |
| enum bt_audio_meta_type { |
| BT_CODEC_META_PREFER_CONTEXT = 0x01, |
| BT_CODEC_META_CONTEXT = 0x02, |
| BT_CODEC_META_PROGRAM_INFO = 0x03, |
| BT_CODEC_META_LANGUAGE = 0x04, |
| BT_CODEC_META_CCID_LIST = 0x05, |
| BT_CODEC_META_PARENTAL_RATING = 0x06, |
| BT_CODEC_META_PROGRAM_INFO_URI = 0x07, |
| BT_CODEC_META_EXTENDED_METADATA = 0xFE, |
| BT_CODEC_META_VENDOR_SPECIFIC = 0xFF, |
| }; |
| |
| /** @brief Location values for BT Audio. |
| * |
| * These values are defined by the Generic Audio Assigned Numbers, bluetooth.com |
| */ |
| enum bt_audio_location { |
| BT_AUDIO_LOCATION_FRONT_LEFT = BIT(0), |
| BT_AUDIO_LOCATION_FRONT_RIGHT = BIT(1), |
| BT_AUDIO_LOCATION_FRONT_CENTER = BIT(2), |
| BT_AUDIO_LOCATION_LOW_FREQ_EFFECTS_1 = BIT(3), |
| BT_AUDIO_LOCATION_BACK_LEFT = BIT(4), |
| BT_AUDIO_LOCATION_BACK_RIGHT = BIT(5), |
| BT_AUDIO_LOCATION_FRONT_LEFT_OF_CENTER = BIT(6), |
| BT_AUDIO_LOCATION_FRONT_RIGHT_OF_CENTER = BIT(7), |
| BT_AUDIO_LOCATION_BACK_CENTER = BIT(8), |
| BT_AUDIO_LOCATION_LOW_FREQ_EFFECTS_2 = BIT(9), |
| BT_AUDIO_LOCATION_SIDE_LEFT = BIT(10), |
| BT_AUDIO_LOCATION_SIDE_RIGHT = BIT(11), |
| BT_AUDIO_LOCATION_TOP_FRONT_LEFT = BIT(12), |
| BT_AUDIO_LOCATION_TOP_FRONT_RIGHT = BIT(13), |
| BT_AUDIO_LOCATION_TOP_FRONT_CENTER = BIT(14), |
| BT_AUDIO_LOCATION_TOP_CENTER = BIT(15), |
| BT_AUDIO_LOCATION_TOP_BACK_LEFT = BIT(16), |
| BT_AUDIO_LOCATION_TOP_BECK_RIGHT = BIT(17), |
| BT_AUDIO_LOCATION_TOP_SIDE_LEFT = BIT(18), |
| BT_AUDIO_LOCATION_TOP_SIDE_RIGHT = BIT(19), |
| BT_AUDIO_LOCATION_TOP_BACK_CENTER = BIT(20), |
| BT_AUDIO_LOCATION_BOTTOM_FRONT_CENTER = BIT(21), |
| BT_AUDIO_LOCATION_BOTTOM_FRONT_LEFT = BIT(22), |
| BT_AUDIO_LOCATION_BOTTOM_FRONT_RIGHT = BIT(23), |
| BT_AUDIO_LOCATION_FRONT_LEFT_WIDE = BIT(24), |
| BT_AUDIO_LOCATION_FRONT_RIGHT_WIDE = BIT(25), |
| BT_AUDIO_LOCATION_LEFT_SURROUND = BIT(26), |
| BT_AUDIO_LOCATION_RIGHT_SURROUND = BIT(27), |
| }; |
| |
| /** @brief Codec structure. */ |
| struct bt_codec { |
| /** Codec ID */ |
| uint8_t id; |
| /** Codec Company ID */ |
| uint16_t cid; |
| /** Codec Company Vendor ID */ |
| uint16_t vid; |
| /** Codec Specific Data count */ |
| size_t data_count; |
| /** Codec Specific Data */ |
| struct bt_codec_data data[CONFIG_BT_CODEC_MAX_DATA_COUNT]; |
| /** Codec Specific Metadata count */ |
| size_t meta_count; |
| /** Codec Specific Metadata */ |
| struct bt_codec_data meta[CONFIG_BT_CODEC_MAX_METADATA_COUNT]; |
| }; |
| |
| struct bt_audio_base_bis_data { |
| /* Unique index of the BIS */ |
| uint8_t index; |
| /** Codec Specific Data count. |
| * |
| * Only valid if the data_count of struct bt_codec in the subgroup is 0 |
| */ |
| size_t data_count; |
| /** Codec Specific Data |
| * |
| * Only valid if the data_count of struct bt_codec in the subgroup is 0 |
| */ |
| struct bt_codec_data data[CONFIG_BT_CODEC_MAX_DATA_COUNT]; |
| }; |
| |
| struct bt_audio_base_subgroup { |
| /* Number of BIS in the subgroup */ |
| size_t bis_count; |
| /** Codec information for the subgroup |
| * |
| * If the data_count of the codec is 0, then codec specific data may be |
| * found for each BIS in the bis_data. |
| */ |
| struct bt_codec codec; |
| /* Array of BIS specific data for each BIS in the subgroup */ |
| struct bt_audio_base_bis_data bis_data[BROADCAST_SNK_STREAM_CNT]; |
| }; |
| |
| struct bt_audio_base { |
| /* Number of subgroups in the BASE */ |
| size_t subgroup_count; |
| /* Array of subgroups in the BASE */ |
| struct bt_audio_base_subgroup subgroups[BROADCAST_SNK_SUBGROUP_CNT]; |
| }; |
| |
| /** @brief Audio Capability type */ |
| enum bt_audio_pac_type { |
| BT_AUDIO_SINK = 0x01, |
| BT_AUDIO_SOURCE = 0x02, |
| }; |
| |
| /** @def BT_CODEC_QOS |
| * @brief Helper to declare elements of bt_codec_qos |
| * |
| * @param _interval SDU interval (usec) |
| * @param _framing Framing |
| * @param _phy Target PHY |
| * @param _sdu Maximum SDU Size |
| * @param _rtn Retransmission number |
| * @param _latency Maximum Transport Latency (msec) |
| * @param _pd Presentation Delay (usec) |
| */ |
| #define BT_CODEC_QOS(_interval, _framing, _phy, _sdu, _rtn, _latency, \ |
| _pd) \ |
| { \ |
| .interval = _interval, \ |
| .framing = _framing, \ |
| .phy = _phy, \ |
| .sdu = _sdu, \ |
| .rtn = _rtn, \ |
| .latency = _latency, \ |
| .pd = _pd, \ |
| } |
| |
| /** @brief Codec QoS Framing */ |
| enum { |
| BT_CODEC_QOS_UNFRAMED = 0x00, |
| BT_CODEC_QOS_FRAMED = 0x01, |
| }; |
| |
| /** @brief Codec QoS Preferred PHY */ |
| enum { |
| BT_CODEC_QOS_1M = BIT(0), |
| BT_CODEC_QOS_2M = BIT(1), |
| BT_CODEC_QOS_CODED = BIT(2), |
| }; |
| |
| /** @def BT_CODEC_QOS_UNFRAMED |
| * @brief Helper to declare Input Unframed bt_codec_qos |
| * |
| * @param _interval SDU interval (usec) |
| * @param _sdu Maximum SDU Size |
| * @param _rtn Retransmission number |
| * @param _latency Maximum Transport Latency (msec) |
| * @param _pd Presentation Delay (usec) |
| */ |
| #define BT_CODEC_QOS_UNFRAMED(_interval, _sdu, _rtn, _latency, _pd) \ |
| BT_CODEC_QOS(_interval, BT_CODEC_QOS_UNFRAMED, BT_CODEC_QOS_2M, _sdu, \ |
| _rtn, _latency, _pd) |
| |
| /** @def BT_CODEC_QOS_FRAMED |
| * @brief Helper to declare Input Framed bt_codec_qos |
| * |
| * @param _interval SDU interval (usec) |
| * @param _sdu Maximum SDU Size |
| * @param _rtn Retransmission number |
| * @param _latency Maximum Transport Latency (msec) |
| * @param _pd Presentation Delay (usec) |
| */ |
| #define BT_CODEC_QOS_FRAMED(_interval, _sdu, _rtn, _latency, _pd) \ |
| BT_CODEC_QOS(_interval, BT_CODEC_QOS_FRAMED, BT_CODEC_QOS_2M, _sdu, \ |
| _rtn, _latency, _pd) |
| |
| /** @brief Codec QoS structure. */ |
| struct bt_codec_qos { |
| /** QoS PHY */ |
| uint8_t phy; |
| |
| /** QoS Framing */ |
| uint8_t framing; |
| |
| /** QoS Retransmission Number */ |
| uint8_t rtn; |
| |
| /** QoS SDU */ |
| uint16_t sdu; |
| |
| /** QoS Transport Latency */ |
| uint16_t latency; |
| |
| /** QoS Frame Interval */ |
| uint32_t interval; |
| /** QoS Presentation Delay */ |
| uint32_t pd; |
| }; |
| |
| /** @def BT_CODEC_QOS_PREF |
| * @brief Helper to declare elements of @ref bt_codec_qos_pref |
| * |
| * @param _unframed_supported Unframed PDUs supported |
| * @param _phy Preferred Target PHY |
| * @param _rtn Preferred Retransmission number |
| * @param _latency Preferred Maximum Transport Latency (msec) |
| * @param _pd_min Minimum Presentation Delay (usec) |
| * @param _pd_max Maximum Presentation Delay (usec) |
| * @param _pref_pd_min Preferred Minimum Presentation Delay (usec) |
| * @param _pref_pd_max Preferred Maximum Presentation Delay (usec) |
| */ |
| #define BT_CODEC_QOS_PREF(_unframed_supported, _phy, _rtn, _latency, _pd_min, \ |
| _pd_max, _pref_pd_min, _pref_pd_max) \ |
| { \ |
| .unframed_supported = _unframed_supported, \ |
| .phy = _phy, \ |
| .rtn = _rtn, \ |
| .latency = _latency, \ |
| .pd_min = _pd_min, \ |
| .pd_max = _pd_max, \ |
| .pref_pd_min = _pref_pd_min, \ |
| .pref_pd_max = _pref_pd_max, \ |
| } |
| |
| /** @brief Audio Stream Quality of Service Preference structure. */ |
| struct bt_codec_qos_pref { |
| /** @brief Unframed PDUs supported |
| * |
| * Unlike the other fields, this is not a preference but whether |
| * the codec supports unframed ISOAL PDUs. |
| */ |
| bool unframed_supported; |
| |
| /** Preferred PHY */ |
| uint8_t phy; |
| |
| /** Preferred Retransmission Number */ |
| uint8_t rtn; |
| |
| /** Preferred Transport Latency */ |
| uint16_t latency; |
| |
| /** @brief Minimum Presentation Delay |
| * |
| * Unlike the other fields, this is not a preference but a minimum |
| * requirement. |
| */ |
| uint32_t pd_min; |
| |
| /** @brief Maximum Presentation Delay |
| * |
| * Unlike the other fields, this is not a preference but a maximum |
| * requirement. |
| */ |
| uint32_t pd_max; |
| |
| /** @brief Preferred minimum Presentation Delay */ |
| uint32_t pref_pd_min; |
| |
| /** @brief Preferred maximum Presentation Delay */ |
| uint32_t pref_pd_max; |
| }; |
| |
| /** Struct to hold a BAP defined LC3 preset */ |
| struct bt_audio_lc3_preset { |
| /** The LC3 Codec */ |
| struct bt_codec codec; |
| /** The BAP spec defined QoS values */ |
| struct bt_codec_qos qos; |
| }; |
| |
| /** Helper to declare an LC3 preset structure */ |
| #define BT_AUDIO_LC3_PRESET(_codec, _qos) \ |
| { \ |
| .codec = _codec, \ |
| .qos = _qos, \ |
| } |
| |
| /* LC3 Unicast presets defined by table 5.2 in the BAP v1.0 specification */ |
| #define BT_AUDIO_LC3_UNICAST_PRESET_8_1_1 \ |
| BT_AUDIO_LC3_PRESET( \ |
| BT_CODEC_LC3_CONFIG_8_1, \ |
| BT_CODEC_LC3_QOS_7_5_UNFRAMED(26u, 2u, 8u, 40000u) \ |
| ) |
| |
| #define BT_AUDIO_LC3_UNICAST_PRESET_8_2_1 \ |
| BT_AUDIO_LC3_PRESET( \ |
| BT_CODEC_LC3_CONFIG_8_2, \ |
| BT_CODEC_LC3_QOS_10_UNFRAMED(30u, 2u, 10u, 40000u) \ |
| ) |
| |
| #define BT_AUDIO_LC3_UNICAST_PRESET_16_1_1 \ |
| BT_AUDIO_LC3_PRESET( \ |
| BT_CODEC_LC3_CONFIG_16_1, \ |
| BT_CODEC_LC3_QOS_7_5_UNFRAMED(30u, 2u, 8u, 40000u) \ |
| ) |
| |
| /** Mandatory to support as both unicast client and server */ |
| #define BT_AUDIO_LC3_UNICAST_PRESET_16_2_1 \ |
| BT_AUDIO_LC3_PRESET( \ |
| BT_CODEC_LC3_CONFIG_16_2, \ |
| BT_CODEC_LC3_QOS_10_UNFRAMED(40u, 2u, 10u, 40000u) \ |
| ) |
| |
| #define BT_AUDIO_LC3_UNICAST_PRESET_24_1_1 \ |
| BT_AUDIO_LC3_PRESET( \ |
| BT_CODEC_LC3_CONFIG_24_1, \ |
| BT_CODEC_LC3_QOS_7_5_UNFRAMED(45u, 2u, 8u, 40000u) \ |
| ) |
| |
| /** Mandatory to support as unicast server */ |
| #define BT_AUDIO_LC3_UNICAST_PRESET_24_2_1 \ |
| BT_AUDIO_LC3_PRESET( \ |
| BT_CODEC_LC3_CONFIG_24_2, \ |
| BT_CODEC_LC3_QOS_10_UNFRAMED(60u, 2u, 10u, 40000u) \ |
| ) |
| |
| #define BT_AUDIO_LC3_UNICAST_PRESET_32_1_1 \ |
| BT_AUDIO_LC3_PRESET( \ |
| BT_CODEC_LC3_CONFIG_32_1, \ |
| BT_CODEC_LC3_QOS_7_5_UNFRAMED(60u, 2u, 8u, 40000u) \ |
| ) |
| |
| #define BT_AUDIO_LC3_UNICAST_PRESET_32_2_1 \ |
| BT_AUDIO_LC3_PRESET( \ |
| BT_CODEC_LC3_CONFIG_32_2, \ |
| BT_CODEC_LC3_QOS_10_UNFRAMED(80u, 2u, 10u, 40000u) \ |
| ) |
| |
| #define BT_AUDIO_LC3_UNICAST_PRESET_441_1_1 \ |
| BT_AUDIO_LC3_PRESET( \ |
| BT_CODEC_LC3_CONFIG_441_1, \ |
| BT_CODEC_QOS(8163u, BT_CODEC_QOS_FRAMED, \ |
| BT_CODEC_QOS_2M, 97u, 5u, 24u, 40000u) \ |
| ) |
| |
| #define BT_AUDIO_LC3_UNICAST_PRESET_441_2_1 \ |
| BT_AUDIO_LC3_PRESET( \ |
| BT_CODEC_LC3_CONFIG_441_2, \ |
| BT_CODEC_QOS(10884u, BT_CODEC_QOS_FRAMED, \ |
| BT_CODEC_QOS_2M, 130u, 5u, 31u, 40000u) \ |
| ) |
| |
| #define BT_AUDIO_LC3_UNICAST_PRESET_48_1_1 \ |
| BT_AUDIO_LC3_PRESET( \ |
| BT_CODEC_LC3_CONFIG_48_1, \ |
| BT_CODEC_LC3_QOS_7_5_UNFRAMED(75u, 5u, 15u, 40000u) \ |
| ) |
| |
| #define BT_AUDIO_LC3_UNICAST_PRESET_48_2_1 \ |
| BT_AUDIO_LC3_PRESET( \ |
| BT_CODEC_LC3_CONFIG_48_2, \ |
| BT_CODEC_LC3_QOS_10_UNFRAMED(100u, 5u, 20u, 40000u) \ |
| ) |
| |
| #define BT_AUDIO_LC3_UNICAST_PRESET_48_3_1 \ |
| BT_AUDIO_LC3_PRESET( \ |
| BT_CODEC_LC3_CONFIG_48_3, \ |
| BT_CODEC_LC3_QOS_7_5_UNFRAMED(90u, 5u, 15u, 40000u) \ |
| ) |
| |
| #define BT_AUDIO_LC3_UNICAST_PRESET_48_4_1 \ |
| BT_AUDIO_LC3_PRESET( \ |
| BT_CODEC_LC3_CONFIG_48_4, \ |
| BT_CODEC_LC3_QOS_10_UNFRAMED(120u, 5u, 20u, 40000u) \ |
| ) |
| |
| #define BT_AUDIO_LC3_UNICAST_PRESET_48_5_1 \ |
| BT_AUDIO_LC3_PRESET( \ |
| BT_CODEC_LC3_CONFIG_48_5, \ |
| BT_CODEC_LC3_QOS_7_5_UNFRAMED(117u, 5u, 15u, 40000u) \ |
| ) |
| |
| #define BT_AUDIO_LC3_UNICAST_PRESET_48_6_1 \ |
| BT_AUDIO_LC3_PRESET( \ |
| BT_CODEC_LC3_CONFIG_48_6, \ |
| BT_CODEC_LC3_QOS_10_UNFRAMED(155u, 5u, 20u, 40000u) \ |
| ) |
| |
| /* Following presets are for unicast high reliability audio data */ |
| #define BT_AUDIO_LC3_UNICAST_PRESET_8_1_2 \ |
| BT_AUDIO_LC3_PRESET( \ |
| BT_CODEC_LC3_CONFIG_8_1, \ |
| BT_CODEC_LC3_QOS_7_5_UNFRAMED(26u, 13u, 75u, 40000u) \ |
| ) |
| |
| #define BT_AUDIO_LC3_UNICAST_PRESET_8_2_2 \ |
| BT_AUDIO_LC3_PRESET( \ |
| BT_CODEC_LC3_CONFIG_8_2, \ |
| BT_CODEC_LC3_QOS_10_UNFRAMED(30u, 13u, 95u, 40000u) \ |
| ) |
| |
| #define BT_AUDIO_LC3_UNICAST_PRESET_16_1_2 \ |
| BT_AUDIO_LC3_PRESET( \ |
| BT_CODEC_LC3_CONFIG_16_1, \ |
| BT_CODEC_LC3_QOS_7_5_UNFRAMED(30u, 13u, 75u, 40000u) \ |
| ) |
| |
| #define BT_AUDIO_LC3_UNICAST_PRESET_16_2_2 \ |
| BT_AUDIO_LC3_PRESET( \ |
| BT_CODEC_LC3_CONFIG_16_2, \ |
| BT_CODEC_LC3_QOS_10_UNFRAMED(40u, 13u, 95u, 40000u) \ |
| ) |
| |
| #define BT_AUDIO_LC3_UNICAST_PRESET_24_1_2 \ |
| BT_AUDIO_LC3_PRESET( \ |
| BT_CODEC_LC3_CONFIG_24_1, \ |
| BT_CODEC_LC3_QOS_7_5_UNFRAMED(45u, 13u, 75u, 40000u) \ |
| ) |
| |
| #define BT_AUDIO_LC3_UNICAST_PRESET_24_2_2 \ |
| BT_AUDIO_LC3_PRESET( \ |
| BT_CODEC_LC3_CONFIG_24_2, \ |
| BT_CODEC_LC3_QOS_10_UNFRAMED(60u, 13u, 95u, 40000u) \ |
| ) |
| |
| #define BT_AUDIO_LC3_UNICAST_PRESET_32_1_2 \ |
| BT_AUDIO_LC3_PRESET( \ |
| BT_CODEC_LC3_CONFIG_32_1, \ |
| BT_CODEC_LC3_QOS_7_5_UNFRAMED(60u, 13u, 75u, 40000u) \ |
| ) |
| |
| #define BT_AUDIO_LC3_UNICAST_PRESET_32_2_2 \ |
| BT_AUDIO_LC3_PRESET( \ |
| BT_CODEC_LC3_CONFIG_32_2, \ |
| BT_CODEC_LC3_QOS_10_UNFRAMED(80u, 13u, 95u, 40000u) \ |
| ) |
| |
| #define BT_AUDIO_LC3_UNICAST_PRESET_441_1_2 \ |
| BT_AUDIO_LC3_PRESET( \ |
| BT_CODEC_LC3_CONFIG_441_1, \ |
| BT_CODEC_QOS(8163u, BT_CODEC_QOS_FRAMED, \ |
| BT_CODEC_QOS_2M, 97u, 13u, 80u, 40000u) \ |
| ) |
| |
| #define BT_AUDIO_LC3_UNICAST_PRESET_441_2_2 \ |
| BT_AUDIO_LC3_PRESET( \ |
| BT_CODEC_LC3_CONFIG_441_2, \ |
| BT_CODEC_QOS(10884u, BT_CODEC_QOS_FRAMED, \ |
| BT_CODEC_QOS_2M, 130u, 13u, 85u, 40000u) \ |
| ) |
| |
| #define BT_AUDIO_LC3_UNICAST_PRESET_48_1_2 \ |
| BT_AUDIO_LC3_PRESET( \ |
| BT_CODEC_LC3_CONFIG_48_1, \ |
| BT_CODEC_LC3_QOS_7_5_UNFRAMED(75u, 13u, 75u, 40000u) \ |
| ) |
| |
| #define BT_AUDIO_LC3_UNICAST_PRESET_48_2_2 \ |
| BT_AUDIO_LC3_PRESET( \ |
| BT_CODEC_LC3_CONFIG_48_2, \ |
| BT_CODEC_LC3_QOS_10_UNFRAMED(100u, 13u, 95u, 40000u) \ |
| ) |
| |
| #define BT_AUDIO_LC3_UNICAST_PRESET_48_3_2 \ |
| BT_AUDIO_LC3_PRESET( \ |
| BT_CODEC_LC3_CONFIG_48_3, \ |
| BT_CODEC_LC3_QOS_7_5_UNFRAMED(90u, 13u, 75u, 40000u) \ |
| ) |
| |
| #define BT_AUDIO_LC3_UNICAST_PRESET_48_4_2 \ |
| BT_AUDIO_LC3_PRESET( \ |
| BT_CODEC_LC3_CONFIG_48_4, \ |
| BT_CODEC_LC3_QOS_10_UNFRAMED(120u, 13u, 100u, 40000u) \ |
| ) |
| |
| #define BT_AUDIO_LC3_UNICAST_PRESET_48_5_2 \ |
| BT_AUDIO_LC3_PRESET( \ |
| BT_CODEC_LC3_CONFIG_48_5, \ |
| BT_CODEC_LC3_QOS_7_5_UNFRAMED(117u, 13u, 75u, 40000u) \ |
| ) |
| |
| #define BT_AUDIO_LC3_UNICAST_PRESET_48_6_2 \ |
| BT_AUDIO_LC3_PRESET( \ |
| BT_CODEC_LC3_CONFIG_48_6, \ |
| BT_CODEC_LC3_QOS_10_UNFRAMED(155u, 13u, 100u, 40000u) \ |
| ) |
| |
| /* LC3 Broadcast presets defined by table 6.4 in the BAP v1.0 specification */ |
| #define BT_AUDIO_LC3_BROADCAST_PRESET_8_1_1 \ |
| BT_AUDIO_LC3_PRESET( \ |
| BT_CODEC_LC3_CONFIG_8_1, \ |
| BT_CODEC_LC3_QOS_7_5_UNFRAMED(26u, 2u, 8u, 40000u) \ |
| ) |
| |
| #define BT_AUDIO_LC3_BROADCAST_PRESET_8_2_1 \ |
| BT_AUDIO_LC3_PRESET( \ |
| BT_CODEC_LC3_CONFIG_8_2, \ |
| BT_CODEC_LC3_QOS_10_UNFRAMED(30u, 2u, 10u, 40000u) \ |
| ) |
| |
| #define BT_AUDIO_LC3_BROADCAST_PRESET_16_1_1 \ |
| BT_AUDIO_LC3_PRESET( \ |
| BT_CODEC_LC3_CONFIG_16_1, \ |
| BT_CODEC_LC3_QOS_7_5_UNFRAMED(30u, 2u, 8u, 40000u) \ |
| ) |
| |
| /** Mandatory to support as both broadcast source and sink */ |
| #define BT_AUDIO_LC3_BROADCAST_PRESET_16_2_1 \ |
| BT_AUDIO_LC3_PRESET( \ |
| BT_CODEC_LC3_CONFIG_16_2, \ |
| BT_CODEC_LC3_QOS_10_UNFRAMED(40u, 2u, 10u, 40000u) \ |
| ) |
| |
| #define BT_AUDIO_LC3_BROADCAST_PRESET_24_1_1 \ |
| BT_AUDIO_LC3_PRESET( \ |
| BT_CODEC_LC3_CONFIG_24_1, \ |
| BT_CODEC_LC3_QOS_7_5_UNFRAMED(45u, 2u, 8u, 40000u) \ |
| ) |
| |
| /** Mandatory to support as broadcast sink */ |
| #define BT_AUDIO_LC3_BROADCAST_PRESET_24_2_1 \ |
| BT_AUDIO_LC3_PRESET( \ |
| BT_CODEC_LC3_CONFIG_24_2, \ |
| BT_CODEC_LC3_QOS_10_UNFRAMED(60u, 2u, 10u, 40000u) \ |
| ) |
| |
| #define BT_AUDIO_LC3_BROADCAST_PRESET_32_1_1 \ |
| BT_AUDIO_LC3_PRESET( \ |
| BT_CODEC_LC3_CONFIG_32_1, \ |
| BT_CODEC_LC3_QOS_7_5_UNFRAMED(60u, 2u, 8u, 40000u) \ |
| ) |
| |
| #define BT_AUDIO_LC3_BROADCAST_PRESET_32_2_1 \ |
| BT_AUDIO_LC3_PRESET( \ |
| BT_CODEC_LC3_CONFIG_32_2, \ |
| BT_CODEC_LC3_QOS_10_UNFRAMED(80u, 2u, 10u, 40000u) \ |
| ) |
| |
| #define BT_AUDIO_LC3_BROADCAST_PRESET_441_1_1 \ |
| BT_AUDIO_LC3_PRESET( \ |
| BT_CODEC_LC3_CONFIG_441_1, \ |
| BT_CODEC_QOS(8163u, BT_CODEC_QOS_FRAMED, \ |
| BT_CODEC_QOS_2M, 97u, 4u, 24u, 40000u) \ |
| ) |
| |
| #define BT_AUDIO_LC3_BROADCAST_PRESET_441_2_1 \ |
| BT_AUDIO_LC3_PRESET( \ |
| BT_CODEC_LC3_CONFIG_441_2, \ |
| BT_CODEC_QOS(10884u, BT_CODEC_QOS_FRAMED, \ |
| BT_CODEC_QOS_2M, 130u, 4u, 31u, 40000u) \ |
| ) |
| |
| #define BT_AUDIO_LC3_BROADCAST_PRESET_48_1_1 \ |
| BT_AUDIO_LC3_PRESET( \ |
| BT_CODEC_LC3_CONFIG_48_1, \ |
| BT_CODEC_LC3_QOS_7_5_UNFRAMED(75u, 4u, 15u, 40000u) \ |
| ) |
| |
| #define BT_AUDIO_LC3_BROADCAST_PRESET_48_2_1 \ |
| BT_AUDIO_LC3_PRESET( \ |
| BT_CODEC_LC3_CONFIG_48_2, \ |
| BT_CODEC_LC3_QOS_10_UNFRAMED(100u, 4u, 20u, 40000u) \ |
| ) |
| |
| #define BT_AUDIO_LC3_BROADCAST_PRESET_48_3_1 \ |
| BT_AUDIO_LC3_PRESET( \ |
| BT_CODEC_LC3_CONFIG_48_3, \ |
| BT_CODEC_LC3_QOS_7_5_UNFRAMED(90u, 4u, 15u, 40000u) \ |
| ) |
| |
| #define BT_AUDIO_LC3_BROADCAST_PRESET_48_4_1 \ |
| BT_AUDIO_LC3_PRESET( \ |
| BT_CODEC_LC3_CONFIG_48_4, \ |
| BT_CODEC_LC3_QOS_10_UNFRAMED(120u, 4u, 20u, 40000u) \ |
| ) |
| |
| #define BT_AUDIO_LC3_BROADCAST_PRESET_48_5_1 \ |
| BT_AUDIO_LC3_PRESET( \ |
| BT_CODEC_LC3_CONFIG_48_5, \ |
| BT_CODEC_LC3_QOS_7_5_UNFRAMED(117u, 4u, 15u, 40000u) \ |
| ) |
| |
| #define BT_AUDIO_LC3_BROADCAST_PRESET_48_6_1 \ |
| BT_AUDIO_LC3_PRESET( \ |
| BT_CODEC_LC3_CONFIG_48_6, \ |
| BT_CODEC_LC3_QOS_10_UNFRAMED(155u, 4u, 20u, 40000u) \ |
| ) |
| |
| /* Following presets are for broadcast high reliability audio data */ |
| #define BT_AUDIO_LC3_BROADCAST_PRESET_8_1_2 \ |
| BT_AUDIO_LC3_PRESET( \ |
| BT_CODEC_LC3_CONFIG_8_1, \ |
| BT_CODEC_LC3_QOS_7_5_UNFRAMED(26u, 4u, 45u, 40000u) \ |
| ) |
| |
| #define BT_AUDIO_LC3_BROADCAST_PRESET_8_2_2 \ |
| BT_AUDIO_LC3_PRESET( \ |
| BT_CODEC_LC3_CONFIG_8_2, \ |
| BT_CODEC_LC3_QOS_10_UNFRAMED(30u, 4u, 60u, 40000u) \ |
| ) |
| |
| #define BT_AUDIO_LC3_BROADCAST_PRESET_16_1_2 \ |
| BT_AUDIO_LC3_PRESET( \ |
| BT_CODEC_LC3_CONFIG_16_1, \ |
| BT_CODEC_LC3_QOS_7_5_UNFRAMED(30u, 4u, 45u, 40000u) \ |
| ) |
| |
| /** Mandatory to support as both broadcast source and sink */ |
| #define BT_AUDIO_LC3_BROADCAST_PRESET_16_2_2 \ |
| BT_AUDIO_LC3_PRESET( \ |
| BT_CODEC_LC3_CONFIG_16_2, \ |
| BT_CODEC_LC3_QOS_10_UNFRAMED(40u, 4u, 60u, 40000u) \ |
| ) |
| |
| #define BT_AUDIO_LC3_BROADCAST_PRESET_24_1_2 \ |
| BT_AUDIO_LC3_PRESET( \ |
| BT_CODEC_LC3_CONFIG_24_1, \ |
| BT_CODEC_LC3_QOS_7_5_UNFRAMED(45u, 4u, 45u, 40000u) \ |
| ) |
| |
| /** Mandatory to support as broadcast sink */ |
| #define BT_AUDIO_LC3_BROADCAST_PRESET_24_2_2 \ |
| BT_AUDIO_LC3_PRESET( \ |
| BT_CODEC_LC3_CONFIG_24_2, \ |
| BT_CODEC_LC3_QOS_10_UNFRAMED(60u, 4u, 60u, 40000u) \ |
| ) |
| |
| #define BT_AUDIO_LC3_BROADCAST_PRESET_32_1_2 \ |
| BT_AUDIO_LC3_PRESET( \ |
| BT_CODEC_LC3_CONFIG_32_1, \ |
| BT_CODEC_LC3_QOS_7_5_UNFRAMED(60u, 4u, 45u, 40000u) \ |
| ) |
| |
| #define BT_AUDIO_LC3_BROADCAST_PRESET_32_2_2 \ |
| BT_AUDIO_LC3_PRESET( \ |
| BT_CODEC_LC3_CONFIG_32_2, \ |
| BT_CODEC_LC3_QOS_10_UNFRAMED(80u, 4u, 60u, 40000u) \ |
| ) |
| |
| #define BT_AUDIO_LC3_BROADCAST_PRESET_441_1_2 \ |
| BT_AUDIO_LC3_PRESET( \ |
| BT_CODEC_LC3_CONFIG_441_1, \ |
| BT_CODEC_QOS(8163u, BT_CODEC_QOS_FRAMED, \ |
| BT_CODEC_QOS_2M, 97u, 4u, 54u, 40000u) \ |
| ) |
| |
| #define BT_AUDIO_LC3_BROADCAST_PRESET_441_2_2 \ |
| BT_AUDIO_LC3_PRESET( \ |
| BT_CODEC_LC3_CONFIG_441_2, \ |
| BT_CODEC_QOS(10884u, BT_CODEC_QOS_FRAMED, \ |
| BT_CODEC_QOS_2M, 130u, 4u, 60u, 40000u) \ |
| ) |
| |
| #define BT_AUDIO_LC3_BROADCAST_PRESET_48_1_2 \ |
| BT_AUDIO_LC3_PRESET( \ |
| BT_CODEC_LC3_CONFIG_48_1, \ |
| BT_CODEC_LC3_QOS_7_5_UNFRAMED(75u, 4u, 50u, 40000u) \ |
| ) |
| |
| #define BT_AUDIO_LC3_BROADCAST_PRESET_48_2_2 \ |
| BT_AUDIO_LC3_PRESET( \ |
| BT_CODEC_LC3_CONFIG_48_2, \ |
| BT_CODEC_LC3_QOS_10_UNFRAMED(100u, 4u, 65u, 40000u) \ |
| ) |
| |
| #define BT_AUDIO_LC3_BROADCAST_PRESET_48_3_2 \ |
| BT_AUDIO_LC3_PRESET( \ |
| BT_CODEC_LC3_CONFIG_48_3, \ |
| BT_CODEC_LC3_QOS_7_5_UNFRAMED(90u, 4u, 50u, 40000u) \ |
| ) |
| |
| #define BT_AUDIO_LC3_BROADCAST_PRESET_48_4_2 \ |
| BT_AUDIO_LC3_PRESET( \ |
| BT_CODEC_LC3_CONFIG_48_4, \ |
| BT_CODEC_LC3_QOS_10_UNFRAMED(120u, 4u, 65u, 40000u) \ |
| ) |
| |
| #define BT_AUDIO_LC3_BROADCAST_PRESET_48_5_2 \ |
| BT_AUDIO_LC3_PRESET( \ |
| BT_CODEC_LC3_CONFIG_48_5, \ |
| BT_CODEC_LC3_QOS_7_5_UNFRAMED(117u, 4u, 50u, 40000u) \ |
| ) |
| |
| #define BT_AUDIO_LC3_BROADCAST_PRESET_48_6_2 \ |
| BT_AUDIO_LC3_PRESET( \ |
| BT_CODEC_LC3_CONFIG_48_6, \ |
| BT_CODEC_LC3_QOS_10_UNFRAMED(155u, 4u, 65u, 40000u) \ |
| ) |
| |
| /** @brief Audio stream structure. |
| * |
| * Audio Streams represents a stream configuration of a Remote Endpoint and |
| * a Local Capability. |
| * |
| * @note Audio streams are unidirectional although its QoS can be configured |
| * to be bidirectional if stream are linked, in which case the QoS must be |
| * symmetric in both directions. |
| */ |
| struct bt_audio_stream { |
| /** Connection reference */ |
| struct bt_conn *conn; |
| /** Endpoint reference */ |
| struct bt_audio_ep *ep; |
| /** Codec Configuration */ |
| struct bt_codec *codec; |
| /** QoS Configuration */ |
| struct bt_codec_qos *qos; |
| /** ISO channel reference */ |
| struct bt_iso_chan *iso; |
| /** Audio stream operations */ |
| struct bt_audio_stream_ops *ops; |
| sys_snode_t node; |
| |
| union { |
| void *group; |
| struct bt_audio_unicast_group *unicast_group; |
| struct bt_audio_broadcast_source *broadcast_source; |
| struct bt_audio_broadcast_sink *broadcast_sink; |
| }; |
| |
| /** Stream user data */ |
| void *user_data; |
| }; |
| |
| /** Unicast Server callback structure */ |
| struct bt_audio_unicast_server_cb { |
| /** @brief Endpoint config request callback |
| * |
| * Config callback is called whenever an endpoint is requested to be |
| * configured |
| * |
| * @param[in] conn Connection object. |
| * @param[in] ep Local Audio Endpoint being configured. |
| * @param[in] type Type of the endpoint. |
| * @param[in] codec Codec configuration. |
| * @param[out] stream Pointer to stream that will be configured for |
| * the endpoint. |
| * @param[out] pref Pointer to a QoS preference object that shall |
| * be populated with values. Invalid values will |
| * reject the codec configuration request. |
| * |
| * @return 0 in case of success or negative value in case of error. |
| */ |
| int (*config)(struct bt_conn *conn, |
| const struct bt_audio_ep *ep, |
| enum bt_audio_pac_type type, |
| const struct bt_codec *codec, |
| struct bt_audio_stream **stream, |
| struct bt_codec_qos_pref *const pref); |
| |
| /** @brief Stream reconfig request callback |
| * |
| * Reconfig callback is called whenever an Audio Stream needs to be |
| * reconfigured with different codec configuration. |
| * |
| * @param[in] stream Stream object being reconfigured. |
| * @param[in] type Type of the endpoint. |
| * @param[in] codec Codec configuration. |
| * @param[out] pref Pointer to a QoS preference object that shall |
| * be populated with values. Invalid values will |
| * reject the codec configuration request. |
| * |
| * @return 0 in case of success or negative value in case of error. |
| */ |
| int (*reconfig)(struct bt_audio_stream *stream, |
| uint8_t type, |
| const struct bt_codec *codec, |
| struct bt_codec_qos_pref *const pref); |
| |
| /** @brief Stream QoS request callback |
| * |
| * QoS callback is called whenever an Audio Stream Quality of |
| * Service needs to be configured. |
| * |
| * @param stream Stream object being reconfigured. |
| * @param qos Quality of Service configuration. |
| * |
| * @return 0 in case of success or negative value in case of error. |
| */ |
| int (*qos)(struct bt_audio_stream *stream, |
| const struct bt_codec_qos *qos); |
| |
| /** @brief Stream Enable request callback |
| * |
| * Enable callback is called whenever an Audio Stream is requested to |
| * be enabled to stream. |
| * |
| * @param stream Stream object being enabled. |
| * @param meta Metadata entries |
| * @param meta_count Number of metadata entries |
| * |
| * @return 0 in case of success or negative value in case of error. |
| */ |
| int (*enable)(struct bt_audio_stream *stream, |
| const struct bt_codec_data *meta, |
| size_t meta_count); |
| |
| /** @brief Stream Start request callback |
| * |
| * Start callback is called whenever an Audio Stream is requested to |
| * start streaming. |
| * |
| * @param stream Stream object. |
| * |
| * @return 0 in case of success or negative value in case of error. |
| */ |
| int (*start)(struct bt_audio_stream *stream); |
| |
| /** @brief Stream Metadata update request callback |
| * |
| * Metadata callback is called whenever an Audio Stream is requested to |
| * update its metadata. |
| * |
| * @param stream Stream object. |
| * @param meta Metadata entries |
| * @param meta_count Number of metadata entries |
| * |
| * @return 0 in case of success or negative value in case of error. |
| */ |
| int (*metadata)(struct bt_audio_stream *stream, |
| const struct bt_codec_data *meta, |
| size_t meta_count); |
| |
| /** @brief Stream Disable request callback |
| * |
| * Disable callback is called whenever an Audio Stream is requested to |
| * disable the stream. |
| * |
| * @param stream Stream object being disabled. |
| * |
| * @return 0 in case of success or negative value in case of error. |
| */ |
| int (*disable)(struct bt_audio_stream *stream); |
| |
| /** @brief Stream Stop callback |
| * |
| * Stop callback is called whenever an Audio Stream is requested to |
| * stop streaming. |
| * |
| * @param stream Stream object. |
| * |
| * @return 0 in case of success or negative value in case of error. |
| */ |
| int (*stop)(struct bt_audio_stream *stream); |
| |
| /** @brief Stream release callback |
| * |
| * Release callback is called whenever a new Audio Stream needs to be |
| * released and thus deallocated. |
| * |
| * @param stream Stream object. |
| * |
| * @return 0 in case of success or negative value in case of error. |
| */ |
| int (*release)(struct bt_audio_stream *stream); |
| |
| /** @brief Publish Capability callback |
| * |
| * Publish Capability callback is called whenever a remote client |
| * requests to read the Published Audio Capabilities (PAC) records. |
| * The callback will be called iteratively until it returns an error, |
| * increasing the @p index each time. Once an error value (non-zero) |
| * is returned, the previously returned @p codec values (if any) will |
| * be sent to the client that requested the value. |
| * |
| * @param conn The connection that requests the capabilities. |
| * Will be NULL if the capabilities is requested for |
| * sending a notification, as a result of calling |
| * bt_audio_capability_register() or |
| * bt_audio_capability_unregister(). |
| * @param type Type of the endpoint. |
| * @param index Index of the codec object requested. Multiple objects |
| * may be returned, and this value keep tracks of how |
| * many have previously been returned. |
| * @param codec Codec object that shall be populated if returning |
| * success (0). Ignored if returning non-zero. |
| * |
| * @return 0 in case of success or negative value in case of error. |
| */ |
| int (*publish_capability)(struct bt_conn *conn, uint8_t type, |
| uint8_t index, struct bt_codec *const codec); |
| |
| /** @brief Publish location callback |
| * |
| * Publish location callback is called whenever a remote client |
| * requests to read the Published Audio Capabilities (PAC) location, |
| * or if the location needs to be notified. |
| * |
| * @param[in] conn The connection that requests the location. |
| * Will be NULL if the location is requested |
| * for sending a notification, as a result of |
| * calling |
| * bt_audio_unicast_server_location_changed(). |
| * @param[in] type Type of the endpoint. |
| * @param[out] location Pointer to the location that needs to be set. |
| * |
| * @return 0 in case of success or negative value in case of error. |
| */ |
| int (*publish_location)(struct bt_conn *conn, |
| enum bt_audio_pac_type type, |
| enum bt_audio_location *location); |
| |
| /** @brief Write location callback |
| * |
| * Write location callback is called whenever a remote client |
| * requests to write the Published Audio Capabilities (PAC) location. |
| * |
| * @param conn The connection that requests the write. |
| * @param type Type of the endpoint. |
| * @param location The location being written. |
| * |
| * @return 0 in case of success or negative value in case of error. |
| */ |
| int (*write_location)(struct bt_conn *conn, enum bt_audio_pac_type type, |
| enum bt_audio_location location); |
| }; |
| |
| /** Broadcast Audio Sink callback structure */ |
| struct bt_audio_broadcast_sink_cb { |
| /** @brief Scan receive callback |
| * |
| * Scan receive callback is called whenever a broadcast source has been |
| * found. |
| * |
| * @param info Advertiser packet information. |
| * @param broadcast_id 24-bit broadcast ID |
| * |
| * @return true to sync to the broadcaster, else false. |
| * Syncing to the broadcaster will stop the current scan. |
| */ |
| bool (*scan_recv)(const struct bt_le_scan_recv_info *info, |
| uint32_t broadcast_id); |
| |
| /** @brief Periodic advertising sync callback |
| * |
| * Called when synchronized to a periodic advertising. When |
| * synchronized a bt_audio_broadcast_sink structure is allocated for |
| * future use. |
| * |
| * @param sink Pointer to the allocated sink structure. |
| * @param sync Pointer to the periodic advertising sync. |
| * @param broadcast_id 24-bit broadcast ID previously reported by |
| * scan_recv. |
| */ |
| void (*pa_synced)(struct bt_audio_broadcast_sink *sink, |
| struct bt_le_per_adv_sync *sync, |
| uint32_t broadcast_id); |
| |
| /** @brief Broadcast Audio Source Endpoint (BASE) received |
| * |
| * Callback for when we receive a BASE from a broadcaster after |
| * syncing to the broadcaster's periodic advertising. |
| * |
| * @param sink Pointer to the sink structure. |
| * @param base Broadcast Audio Source Endpoint (BASE). |
| */ |
| void (*base_recv)(struct bt_audio_broadcast_sink *sink, |
| const struct bt_audio_base *base); |
| |
| /** @brief Broadcast sink is syncable |
| * |
| * Called whenever a broadcast sink is not synchronized to audio, but |
| * the audio is synchronizable. This is inferred when a BIGInfo report |
| * is received. |
| * |
| * Once this callback has been called, it is possible to call |
| * bt_audio_broadcast_sink_sync() to synchronize to the audio stream(s). |
| * |
| * @param sink Pointer to the sink structure. |
| * @param encrypted Whether or not the broadcast is encrypted |
| */ |
| void (*syncable)(struct bt_audio_broadcast_sink *sink, bool encrypted); |
| |
| /** @brief Scan terminated callback |
| * |
| * Scan terminated callback is called whenever a scan started by |
| * bt_audio_broadcast_sink_scan_start() is terminated before |
| * bt_audio_broadcast_sink_scan_stop(). |
| * |
| * Typical reasons for this are that the periodic advertising has |
| * synchronized (success criteria) or the scan timed out. |
| * It may also be called if the periodic advertising failed to |
| * synchronize. |
| * |
| * @param err 0 in case of success or negative value in case of error. |
| */ |
| void (*scan_term)(int err); |
| |
| /** @brief Periodic advertising synchronization lost callback |
| * |
| * The periodic advertising synchronization lost callback is called if |
| * the periodic advertising sync is lost. If this happens, the sink |
| * object is deleted. To synchronize to the broadcaster again, |
| * bt_audio_broadcast_sink_scan_start() must be called. |
| * |
| * @param sink Pointer to the sink structure. |
| */ |
| void (*pa_sync_lost)(struct bt_audio_broadcast_sink *sink); |
| |
| /* Internally used list node */ |
| sys_snode_t node; |
| }; |
| |
| /** @brief Stream operation. */ |
| struct bt_audio_stream_ops { |
| #if defined(CONFIG_BT_AUDIO_UNICAST) |
| /** @brief Stream configured callback |
| * |
| * Configured callback is called whenever an Audio Stream has been |
| * configured. |
| * |
| * @param stream Stream object that has been configured. |
| * @param pref Remote QoS preferences. |
| */ |
| void (*configured)(struct bt_audio_stream *stream, |
| const struct bt_codec_qos_pref *pref); |
| |
| /** @brief Stream QoS set callback |
| * |
| * QoS set callback is called whenever an Audio Stream Quality of |
| * Service has been set or updated. |
| * |
| * @param stream Stream object that had its QoS updated. |
| */ |
| void (*qos_set)(struct bt_audio_stream *stream); |
| |
| /** @brief Stream enabled callback |
| * |
| * Enabled callback is called whenever an Audio Stream has been |
| * enabled. |
| * |
| * @param stream Stream object that has been enabled. |
| */ |
| void (*enabled)(struct bt_audio_stream *stream); |
| |
| /** @brief Stream metadata updated callback |
| * |
| * Metadata Updated callback is called whenever an Audio Stream's |
| * metadata has been updated. |
| * |
| * @param stream Stream object that had its metadata updated. |
| */ |
| void (*metadata_updated)(struct bt_audio_stream *stream); |
| |
| /** @brief Stream disabled callback |
| * |
| * Disabled callback is called whenever an Audio Stream has been |
| * disabled. |
| * |
| * @param stream Stream object that has been disabled. |
| */ |
| void (*disabled)(struct bt_audio_stream *stream); |
| |
| /** @brief Stream released callback |
| * |
| * Released callback is called whenever a Audio Stream has been |
| * released and can be deallocated. |
| * |
| * @param stream Stream object that has been released. |
| */ |
| void (*released)(struct bt_audio_stream *stream); |
| #endif /* CONFIG_BT_AUDIO_UNICAST */ |
| |
| /** @brief Stream started callback |
| * |
| * Started callback is called whenever an Audio Stream has been started |
| * and will be usable for streaming. |
| * |
| * @param stream Stream object that has been started. |
| */ |
| void (*started)(struct bt_audio_stream *stream); |
| |
| /** @brief Stream stopped callback |
| * |
| * Stopped callback is called whenever an Audio Stream has been |
| * stopped. |
| * |
| * @param stream Stream object that has been stopped. |
| */ |
| void (*stopped)(struct bt_audio_stream *stream); |
| |
| #if defined(CONFIG_BT_AUDIO_UNICAST) || defined(CONFIG_BT_AUDIO_BROADCAST_SINK) |
| /** @brief Stream audio HCI receive callback. |
| * |
| * This callback is only used if the ISO data path is HCI. |
| * |
| * @param stream Stream object. |
| * @param buf Buffer containing incoming audio data. |
| */ |
| void (*recv)(struct bt_audio_stream *stream, struct net_buf *buf); |
| #endif /* CONFIG_BT_AUDIO_UNICAST || CONFIG_BT_AUDIO_BROADCAST_SINK */ |
| |
| #if defined(CONFIG_BT_AUDIO_UNICAST) || defined(CONFIG_BT_AUDIO_BROADCAST_SOURCE) |
| /** @brief Stream audio HCI sent callback |
| * |
| * If this callback is provided it will be called whenever a SDU has |
| * been completely sent, or otherwise flushed due to transmission |
| * issues. |
| * This callback is only used if the ISO data path is HCI. |
| * |
| * @param chan The channel which has sent data. |
| */ |
| void (*sent)(struct bt_audio_stream *stream); |
| #endif /* CONFIG_BT_AUDIO_UNICAST || CONFIG_BT_AUDIO_BROADCAST_SOURCE */ |
| |
| }; |
| |
| /** @brief Register Audio callbacks for a stream. |
| * |
| * Register Audio callbacks for a stream. |
| * |
| * @param stream Stream object. |
| * @param ops Stream operations structure. |
| */ |
| void bt_audio_stream_cb_register(struct bt_audio_stream *stream, |
| struct bt_audio_stream_ops *ops); |
| /** |
| * @defgroup bt_audio_server Audio Server APIs |
| * @ingroup bt_audio |
| * @{ |
| */ |
| |
| /** @brief Register unicast server callbacks. |
| * |
| * Only one callback structure can be registered, and attempting to |
| * registering more than one will result in an error. |
| * |
| * @param cb Unicast server callback structure. |
| * |
| * @return 0 in case of success or negative value in case of error. |
| */ |
| int bt_audio_unicast_server_register_cb(const struct bt_audio_unicast_server_cb *cb); |
| |
| /** @brief Unregister unicast server callbacks. |
| * |
| * May only unregister a callback structure that has previously been |
| * registered by bt_audio_unicast_server_register_cb(). |
| * |
| * @param cb Unicast server callback structure. |
| * |
| * @return 0 in case of success or negative value in case of error. |
| */ |
| int bt_audio_unicast_server_unregister_cb(const struct bt_audio_unicast_server_cb *cb); |
| |
| /** @brief Notify location changed |
| * |
| * Notify connected clients that the location has changed |
| * |
| * @return 0 in case of success or negative value in case of error. |
| */ |
| int bt_audio_unicast_server_location_changed(enum bt_audio_pac_type type); |
| |
| /** @} */ /* End of group bt_audio_server */ |
| |
| /** |
| * @defgroup bt_audio_client Audio Client APIs |
| * @ingroup bt_audio |
| * @{ |
| */ |
| |
| struct bt_audio_discover_params; |
| |
| /** @typedef bt_audio_discover_func_t |
| * @brief Discover Audio capabilities and endpoints callback function. |
| * |
| * If discovery procedure has complete both cap and ep are set to NULL. |
| */ |
| typedef void (*bt_audio_discover_func_t)(struct bt_conn *conn, |
| struct bt_codec *codec, |
| struct bt_audio_ep *ep, |
| struct bt_audio_discover_params *params); |
| |
| struct bt_audio_discover_params { |
| /** Capabilities type */ |
| uint8_t type; |
| /** Callback function */ |
| bt_audio_discover_func_t func; |
| /** Number of capabilities found */ |
| uint8_t num_caps; |
| /** Number of endpoints found */ |
| uint8_t num_eps; |
| /** Error code. */ |
| uint8_t err; |
| struct bt_gatt_read_params read; |
| struct bt_gatt_discover_params discover; |
| }; |
| |
| /** @brief Discover remote capabilities and endpoints |
| * |
| * This procedure is used by a client to discover remote capabilities and |
| * endpoints and notifies via params callback. |
| * |
| * @note This procedure is asynchronous therefore the parameters need to |
| * remains valid while it is active. |
| * |
| * @param conn Connection object |
| * @param params Discover parameters |
| */ |
| int bt_audio_discover(struct bt_conn *conn, |
| struct bt_audio_discover_params *params); |
| |
| /** @brief Configure Audio Stream |
| * |
| * This procedure is used by a client to configure a new stream using the |
| * remote endpoint, local capability and codec configuration. |
| * |
| * @param conn Connection object |
| * @param stream Stream object being configured |
| * @param ep Remote Audio Endpoint being configured |
| * @param codec Codec configuration |
| * |
| * @return Allocated Audio Stream object or NULL in case of error. |
| */ |
| int bt_audio_stream_config(struct bt_conn *conn, |
| struct bt_audio_stream *stream, |
| struct bt_audio_ep *ep, |
| struct bt_codec *codec); |
| |
| /** @brief Reconfigure Audio Stream |
| * |
| * This procedure is used by a client to reconfigure a stream using the |
| * a different local capability and/or codec configuration. |
| * |
| * This can only be done for unicast streams. |
| * |
| * @param stream Stream object being reconfigured |
| * @param codec Codec configuration |
| * |
| * @return 0 in case of success or negative value in case of error. |
| */ |
| int bt_audio_stream_reconfig(struct bt_audio_stream *stream, |
| struct bt_codec *codec); |
| |
| /** @brief Configure Audio Stream QoS |
| * |
| * This procedure is used by a client to configure the Quality of Service of |
| * streams in a unicast group. All streams in the group for the specified |
| * @p conn will have the Quality of Service configured. |
| * This shall only be used to configure unicast streams. |
| * |
| * @param conn Connection object |
| * @param group Unicast group object |
| * @param qos Quality of Service configuration |
| * |
| * @return 0 in case of success or negative value in case of error. |
| */ |
| int bt_audio_stream_qos(struct bt_conn *conn, |
| struct bt_audio_unicast_group *group, |
| struct bt_codec_qos *qos); |
| |
| /** @brief Enable Audio Stream |
| * |
| * This procedure is used by a client to enable a stream. |
| * |
| * This shall only be called for unicast streams, as broadcast streams will |
| * always be enabled once created. |
| * |
| * @param stream Stream object |
| * @param meta_count Number of metadata entries |
| * @param meta Metadata entries |
| * |
| * @return 0 in case of success or negative value in case of error. |
| */ |
| int bt_audio_stream_enable(struct bt_audio_stream *stream, |
| struct bt_codec_data *meta, |
| size_t meta_count); |
| |
| /** @brief Change Audio Stream Metadata |
| * |
| * This procedure is used by a client to change the metadata of a stream. |
| * |
| * @param stream Stream object |
| * @param meta_count Number of metadata entries |
| * @param meta Metadata entries |
| * |
| * @return 0 in case of success or negative value in case of error. |
| */ |
| int bt_audio_stream_metadata(struct bt_audio_stream *stream, |
| struct bt_codec_data *meta, |
| size_t meta_count); |
| |
| /** @brief Disable Audio Stream |
| * |
| * This procedure is used by a client to disable a stream. |
| * |
| * This shall only be called for unicast streams, as broadcast streams will |
| * always be enabled once created. |
| * |
| * @param stream Stream object |
| * |
| * @return 0 in case of success or negative value in case of error. |
| */ |
| int bt_audio_stream_disable(struct bt_audio_stream *stream); |
| |
| /** @brief Start Audio Stream |
| * |
| * This procedure is used by a client to make a stream start streaming. |
| * |
| * This shall only be called for unicast streams. |
| * Broadcast sinks will always be started once synchronized, and broadcast |
| * source streams shall be started with bt_audio_broadcast_source_start(). |
| * |
| * @param stream Stream object |
| * |
| * @return 0 in case of success or negative value in case of error. |
| */ |
| int bt_audio_stream_start(struct bt_audio_stream *stream); |
| |
| /** @brief Stop Audio Stream |
| * |
| * This procedure is used by a client to make a stream stop streaming. |
| * |
| * This shall only be called for unicast streams. |
| * Broadcast sinks cannot be stopped. |
| * Broadcast sources shall be stopped with bt_audio_broadcast_source_stop(). |
| * |
| * @param stream Stream object |
| * |
| * @return 0 in case of success or negative value in case of error. |
| */ |
| int bt_audio_stream_stop(struct bt_audio_stream *stream); |
| |
| /** @brief Release Audio Stream |
| * |
| * This procedure is used by a client to release a unicast or broadcast |
| * source stream. |
| * |
| * Broadcast sink streams cannot be released, but can be deleted by |
| * bt_audio_broadcast_sink_delete(). |
| * Broadcast source streams cannot be released, but can be deleted by |
| * bt_audio_broadcast_source_delete(). |
| * |
| * @param stream Stream object |
| * @param cache True to cache the codec configuration or false to forget it |
| * |
| * @return 0 in case of success or negative value in case of error. |
| */ |
| int bt_audio_stream_release(struct bt_audio_stream *stream, bool cache); |
| |
| /** @brief Send data to Audio stream |
| * |
| * Send data from buffer to the stream. |
| * |
| * @note Data will not be sent to linked streams since linking is only |
| * consider for procedures affecting the state machine. |
| * |
| * @param stream Stream object. |
| * @param buf Buffer containing data to be sent. |
| * |
| * @return Bytes sent in case of success or negative value in case of error. |
| */ |
| int bt_audio_stream_send(struct bt_audio_stream *stream, struct net_buf *buf); |
| |
| /** @brief Create audio unicast group. |
| * |
| * Create a new audio unicast group with one or more audio streams as a |
| * unicast client. Streams in a unicast group shall share the same interval, |
| * framing and latency (see @ref bt_codec_qos). |
| * |
| * @param[in] streams Array of stream objects being used for the |
| * group. |
| * @param[in] num_stream Number of streams in @p streams. |
| * @param[out] unicast_group Pointer to the unicast group created |
| * |
| * @return Zero on success or (negative) error code otherwise. |
| */ |
| int bt_audio_unicast_group_create(struct bt_audio_stream *streams, |
| size_t num_stream, |
| struct bt_audio_unicast_group **unicast_group); |
| |
| /** @brief Add streams to a unicast group as a unicast client |
| * |
| * This function can be used to add additional streams to a |
| * bt_audio_unicast_group. |
| * |
| * This can be called at any time before any of the streams in the |
| * group has been started (see bt_audio_stream_ops.started()). |
| * This can also be called after the streams have been stopped |
| * (see bt_audio_stream_ops.stopped()). |
| * |
| * @param unicast_group Pointer to the unicast group |
| * @param streams Array of stream objects being added to the group. |
| * @param num_stream Number of streams in @p streams. |
| * |
| * @return 0 in case of success or negative value in case of error. |
| */ |
| int bt_audio_unicast_group_add_streams(struct bt_audio_unicast_group *unicast_group, |
| struct bt_audio_stream *streams, |
| size_t num_stream); |
| |
| /** @brief Remove streams from a unicast group as a unicast client |
| * |
| * This function can be used to remove streams from a bt_audio_unicast_group. |
| * |
| * This can be called at any time before any of the streams in the |
| * group has been started (see bt_audio_stream_ops.started()). |
| * This can also be called after the streams have been stopped |
| * (see bt_audio_stream_ops.stopped()). |
| * |
| * @param unicast_group Pointer to the unicast group |
| * @param streams Array of stream objects removed from the group. |
| * @param num_stream Number of streams in @p streams. |
| * |
| * @return 0 in case of success or negative value in case of error. |
| */ |
| int bt_audio_unicast_group_remove_streams(struct bt_audio_unicast_group *unicast_group, |
| struct bt_audio_stream *streams, |
| size_t num_stream); |
| |
| /** @brief Delete audio unicast group. |
| * |
| * Delete a audio unicast group as a client. All streams in the group shall |
| * be in the idle or configured state. |
| * |
| * @param unicast_group Pointer to the unicast group to delete |
| * |
| * @return Zero on success or (negative) error code otherwise. |
| */ |
| int bt_audio_unicast_group_delete(struct bt_audio_unicast_group *unicast_group); |
| |
| /** @} */ /* End of group bt_audio_client */ |
| |
| |
| /** |
| * @brief Audio Broadcast APIs |
| * @defgroup bt_audio_broadcast Audio Broadcast APIs |
| * @{ |
| */ |
| |
| /** @brief Create audio broadcast source. |
| * |
| * Create a new audio broadcast source with one or more audio streams. |
| * |
| * The broadcast source will be visible for scanners once this has been called, |
| * and the device will advertise audio announcements. |
| * |
| * No audio data can be sent until bt_audio_broadcast_source_start() has been |
| * called and no audio information (BIGInfo) will be visible to scanners |
| * (see bt_le_per_adv_sync_cb). |
| * |
| * @param[in] streams Array of stream objects being used for the |
| * broadcaster. This array shall remain valid for the |
| * duration of the broadcast source. |
| * @param[in] num_stream Number of streams in @p streams. |
| * @param[in] codec Codec configuration. |
| * @param[in] qos Quality of Service configuration |
| * @param[out] source Pointer to the broadcast source created |
| * |
| * @return Zero on success or (negative) error code otherwise. |
| */ |
| int bt_audio_broadcast_source_create(struct bt_audio_stream *streams, |
| size_t num_stream, |
| struct bt_codec *codec, |
| struct bt_codec_qos *qos, |
| struct bt_audio_broadcast_source **source); |
| |
| /** @brief Reconfigure audio broadcast source. |
| * |
| * Reconfigure an audio broadcast source with a new codec and codec quality of |
| * service parameters. |
| * |
| * @param source Pointer to the broadcast source |
| * @param codec Codec configuration. |
| * @param qos Quality of Service configuration |
| * |
| * @return Zero on success or (negative) error code otherwise. |
| */ |
| int bt_audio_broadcast_source_reconfig(struct bt_audio_broadcast_source *source, |
| struct bt_codec *codec, |
| struct bt_codec_qos *qos); |
| |
| /** @brief Start audio broadcast source. |
| * |
| * Start an audio broadcast source with one or more audio streams. |
| * The broadcast source will start advertising BIGInfo, and audio data can |
| * be streamed. |
| * |
| * @param source Pointer to the broadcast source |
| * |
| * @return Zero on success or (negative) error code otherwise. |
| */ |
| int bt_audio_broadcast_source_start(struct bt_audio_broadcast_source *source); |
| |
| /** @brief Stop audio broadcast source. |
| * |
| * Stop an audio broadcast source. |
| * The broadcast source will stop advertising BIGInfo, and audio data can no |
| * longer be streamed. |
| * |
| * @param source Pointer to the broadcast source |
| * |
| * @return Zero on success or (negative) error code otherwise. |
| */ |
| int bt_audio_broadcast_source_stop(struct bt_audio_broadcast_source *source); |
| |
| /** @brief Delete audio broadcast source. |
| * |
| * Delete an audio broadcast source. |
| * The broadcast source will stop advertising entirely, and the source can |
| * no longer be used. |
| * |
| * @param source Pointer to the broadcast source |
| * |
| * @return Zero on success or (negative) error code otherwise. |
| */ |
| int bt_audio_broadcast_source_delete(struct bt_audio_broadcast_source *source); |
| |
| /** @brief Register Broadcast sink callbacks |
| * * |
| * @param cb Broadcast sink callback structure. |
| */ |
| void bt_audio_broadcast_sink_register_cb(struct bt_audio_broadcast_sink_cb *cb); |
| |
| /** @brief Start scan for broadcast sources. |
| * |
| * Starts a scan for broadcast sources. Scan results will be received by |
| * the scan_recv callback. |
| * Only reports from devices advertising broadcast audio support will be sent. |
| * Note that a broadcast source may advertise broadcast audio capabilities, |
| * but may not be streaming. |
| * |
| * @param param Scan parameters. |
| * |
| * @return Zero on success or (negative) error code otherwise. |
| */ |
| int bt_audio_broadcast_sink_scan_start(const struct bt_le_scan_param *param); |
| |
| /** |
| * @brief Stop scan for broadcast sources. |
| * |
| * Stops ongoing scanning for broadcast sources. |
| * |
| * @return Zero on success or (negative) error code otherwise. |
| */ |
| int bt_audio_broadcast_sink_scan_stop(void); |
| |
| /** @brief Sync to a broadcaster's audio |
| * |
| * @param sink Pointer to the sink object from the base_recv |
| * callback. |
| * @param indexes_bitfield Bitfield of the BIS index to sync to. To sync to |
| * e.g. BIS index 1 and 2, this should have the value |
| * of BIT(1) | BIT(2). |
| * @param streams Stream objects to be used for the receiver. If |
| * multiple BIS indexes shall be synchronized, |
| * multiple streams shall be provided. |
| * @param codec Codec configuration. |
| * @param broadcast_code The 16-octet broadcast code. Shall be supplied if |
| * the broadcast is encrypted (see the syncable |
| * callback). |
| * |
| * @return 0 in case of success or negative value in case of error. |
| */ |
| int bt_audio_broadcast_sink_sync(struct bt_audio_broadcast_sink *sink, |
| uint32_t indexes_bitfield, |
| struct bt_audio_stream *streams, |
| struct bt_codec *codec, |
| const uint8_t broadcast_code[16]); |
| |
| /** @brief Stop audio broadcast sink. |
| * |
| * Stop an audio broadcast sink. |
| * The broadcast sink will stop receiving BIGInfo, and audio data can no |
| * longer be streamed. |
| * |
| * @param sink Pointer to the broadcast sink |
| * |
| * @return Zero on success or (negative) error code otherwise. |
| */ |
| int bt_audio_broadcast_sink_stop(struct bt_audio_broadcast_sink *sink); |
| |
| /** @brief Release a broadcast sink |
| * |
| * Once a broadcast sink has been allocated after the pa_synced callback, |
| * it can be deleted using this function. If the sink has synchronized to any |
| * broadcast audio streams, these must first be stopped using |
| * bt_audio_stream_stop. |
| * |
| * @param sink Pointer to the sink object to delete. |
| * |
| * @return 0 in case of success or negative value in case of error. |
| */ |
| int bt_audio_broadcast_sink_delete(struct bt_audio_broadcast_sink *sink); |
| |
| /** @} */ /* End of bt_audio_broadcast */ |
| |
| |
| /** |
| * @brief Audio codec Config APIs |
| * @defgroup bt_audio_codec_cfg Codec config parsing APIs |
| * |
| * Functions to parse codec config data when formatted as LTV wrapped into @ref bt_codec. |
| * |
| * @{ |
| */ |
| |
| /** |
| * @brief Codec parser error codes for @ref bt_audio_codec_cfg. |
| */ |
| enum bt_audio_codec_parse_err { |
| |
| /** @brief The requested type is not present in the data set. */ |
| BT_AUDIO_CODEC_PARSE_ERR_SUCCESS = 0, |
| |
| /** @brief The requested type is not present in the data set. */ |
| BT_AUDIO_CODEC_PARSE_ERR_TYPE_NOT_FOUND = -1, |
| |
| /** @brief The value found is invalid. */ |
| BT_AUDIO_CODEC_PARSE_ERR_INVALID_VALUE_FOUND = -2, |
| |
| /** @brief The parameters specified to the function call are not valid. */ |
| BT_AUDIO_CODEC_PARSE_ERR_INVALID_PARAM = -3, |
| }; |
| |
| /**@brief Extract the frequency from a codec configuration. |
| * |
| * @param codec The codec configuration to extract data from. |
| * |
| * @return The frequency in Hz if found else a negative value of type |
| * @ref bt_audio_codec_parse_err. |
| */ |
| int bt_codec_cfg_get_freq(const struct bt_codec *codec); |
| |
| /** @brief Extract frame duration from BT codec config |
| * |
| * @param codec The codec configuration to extract data from. |
| * |
| * @return Frame duration in microseconds if value is found else a negative value |
| * of type @ref bt_audio_codec_parse_err. |
| */ |
| int bt_codec_cfg_get_frame_duration_us(const struct bt_codec *codec); |
| |
| /** @brief Extract channel allocation from BT codec config |
| * |
| * The value returned is a bit field representing one or more audio locations as |
| * specified by @ref bt_audio_location |
| * Shall match one or more of the bits set in BT_PAC_SNK_LOC/BT_PAC_SRC_LOC. |
| * |
| * Up to the configured @ref BT_CODEC_LC3_CHAN_COUNT number of channels can be present. |
| * |
| * @param codec The codec configuration to extract data from. |
| * @param chan_allocation Pointer to the variable to store the extracted value in. |
| * |
| * @return BT_AUDIO_CODEC_PARSE_SUCCESS if value is found and stored in the pointer provided |
| * else a negative value of type @ref bt_audio_codec_parse_err. |
| */ |
| int bt_codec_cfg_get_chan_allocation_val(const struct bt_codec *codec, uint32_t *chan_allocation); |
| |
| /** @brief Extract frame size in octets from BT codec config |
| * |
| * The overall SDU size will be octets_per_frame * blocks_per_sdu. |
| * |
| * The Bluetooth specificationa are not clear about this value - it does not state that |
| * the codec shall use this SDU size only. A codec like LC3 supports variable bit-rate |
| * (per SDU) hence it might be allowed for an encoder to reduce the frame size below this |
| * value. |
| * Hence it is recommended to use the received SDU size and divide by |
| * blocks_per_sdu rather than relying on this octets_per_sdu value to be fixed. |
| * |
| * @param codec The codec configuration to extract data from. |
| * |
| * @return Frame length in octets if value is found else a negative value |
| * of type @ref bt_audio_codec_parse_err. |
| */ |
| int bt_codec_cfg_get_octets_per_frame(const struct bt_codec *codec); |
| |
| /** @brief Extract number of audio frame blockss in each SDU from BT codec config |
| * |
| * The overall SDU size will be octets_per_frame * frame_blocks_per_sdu * number-of-channels. |
| * |
| * If this value is not present a default value of 1 shall be used. |
| * |
| * A frame block is one or more frames that represents data for the same period of time but |
| * for different channels. If the stream have two audio channels and this value is two |
| * there will be four frames in the SDU. |
| * |
| * @param codec The codec configuration to extract data from. |
| * @param fallback_to_default If true this function will return the default value of 1 |
| * if the type is not found. In this case the function will only fail if a NULL |
| * pointer is provided. |
| * |
| * @return The count of codec frames in each SDU if value is found else a negative value |
| * of type @ref bt_audio_codec_parse_err - unless when \p fallback_to_default is true |
| * then the value 1 is returned if frames per sdu is not found. |
| */ |
| int bt_codec_cfg_get_frame_blocks_per_sdu(const struct bt_codec *codec, bool fallback_to_default); |
| |
| /** @brief Lookup a specific value based on type |
| * |
| * Depending on context bt_codec will be either codec capabilities, codec configuration or |
| * meta data. |
| * |
| * Typically types used are: |
| * @ref bt_codec_capability_type |
| * @ref bt_codec_config_type |
| * @ref bt_audio_meta_type |
| * |
| * @param codec The codec data to search in. |
| * @param type The type id to look for |
| * @param data Pointer to the data-pointer to update when item is found |
| * @return True if the type is found, false otherwise. |
| */ |
| bool bt_codec_get_val(const struct bt_codec *codec, |
| uint8_t type, |
| const struct bt_codec_data **data); |
| |
| /** @} */ /* End of bt_audio_codec_cfg */ |
| |
| #ifdef __cplusplus |
| } |
| #endif |
| |
| /** @} */ /* end of bt_audio */ |
| |
| #endif /* ZEPHYR_INCLUDE_BLUETOOTH_AUDIO_H_ */ |