blob: 9d5a25f1ce60c42299985351ea2e3fa63299064d [file] [log] [blame]
/** @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 */
/* Audio Context Type, Generic Audio */
#define BT_AUDIO_CONTEXT_TYPE_PROHIBITED BIT(0)
#define BT_AUDIO_CONTEXT_TYPE_UNSPECIFIED BIT(1)
#define BT_AUDIO_CONTEXT_TYPE_CONVERSATIONAL BIT(2)
#define BT_AUDIO_CONTEXT_TYPE_MEDIA BIT(3)
#define BT_AUDIO_CONTEXT_TYPE_GAME BIT(4)
#define BT_AUDIO_CONTEXT_TYPE_INSTRUCTIONAL BIT(5)
#define BT_AUDIO_CONTEXT_TYPE_VOICE_ASSISTANTS BIT(6)
#define BT_AUDIO_CONTEXT_TYPE_LIVE BIT(7)
#define BT_AUDIO_CONTEXT_TYPE_SOUND_EFFECTS BIT(8)
#define BT_AUDIO_CONTEXT_TYPE_NOTIFICATIONS BIT(9)
#define BT_AUDIO_CONTEXT_TYPE_RINGTONE BIT(10)
#define BT_AUDIO_CONTEXT_TYPE_ALERTS BIT(11)
#define BT_AUDIO_CONTEXT_TYPE_EMERGENCY_ALARM BIT(12)
/* 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_SUBGROUP_CNT CONFIG_BT_AUDIO_BROADCAST_SUBGROUP_COUNT
#else /* !CONFIG_BT_AUDIO_BROADCAST_SINK */
#define BROADCAST_SNK_STREAM_CNT 0
#define BROADCAST_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, \
}
/* TODO: Remove base once LTV types are defined, are these specific to LC3? */
#define BT_CODEC_META_BASE 0x01
#define BT_CODEC_META_PREFER_CONTEXT (BT_CODEC_META_BASE)
#define BT_CODEC_META_CONTEXT (BT_CODEC_META_BASE + 1)
/* @def BT_CODEC_META_CONTEXT_NONE
*
* Unspecified. Matches any audio content.
*/
#define BT_CODEC_META_CONTEXT_NONE BIT(0)
/* @def BT_CODEC_META_CONTEXT_VOICE
*
* Conversation between humans as, for example, in telephony or video calls.
*/
#define BT_CODEC_META_CONTEXT_VOICE BIT(1)
/* @def BT_CODEC_META_CONTEXT_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_CODEC_META_CONTEXT_MEDIA BIT(2)
/* @def BT_CODEC_META_CONTEXT_INSTRUCTION
*
* Instructional audio as, for example, in navigation, traffic announcements or
* user guidance.
*/
#define BT_CODEC_META_CONTEXT_INSTRUCTION BIT(3)
/* @def BT_CODEC_META_CONTEXT_ATTENTION
*
* Attention seeking audio as, for example, in beeps signalling arrival of a
* message or keyboard clicks.
*/
#define BT_CODEC_META_CONTEXT_ATTENTION BIT(4)
/* @def BT_CODEC_META_CONTEXT_ALERT
*
* Immediate alerts as, for example, in a low battery alarm, timer expiry or
* alarm clock.
*/
#define BT_CODEC_META_CONTEXT_ALERT BIT(5)
/* @def BT_CODEC_META_CONTEXT_MAN_MACHINE
*
* Man machine communication as, for example, with voice recognition or
* virtual assistant.
*/
#define BT_CODEC_META_CONTEXT_MAN_MACHINE BIT(6)
/* @def BT_CODEC_META_CONTEXT_EMERGENCY
*
* Emergency alerts as, for example, with fire alarms or other urgent alerts.
*/
#define BT_CODEC_META_CONTEXT_EMERGENCY BIT(7)
/* @def BT_CODEC_META_CONTEXT_RINGTONE
*
* Ringtone as in a call alert.
*/
#define BT_CODEC_META_CONTEXT_RINGTONE BIT(8)
/* @def BT_CODEC_META_CONTEXT_TV
*
* Audio associated with a television program and/or with metadata conforming
* to the Bluetooth Broadcast TV profile.
*/
#define BT_CODEC_META_CONTEXT_TV BIT(9)
/* @def BT_CODEC_META_CONTEXT_ANY
*
* Any known context.
*/
#define BT_CODEC_META_CONTEXT_ANY (BT_CODEC_META_CONTEXT_NONE | \
BT_CODEC_META_CONTEXT_VOICE | \
BT_CODEC_META_CONTEXT_MEDIA | \
BT_CODEC_META_CONTEXT_INSTRUCTION | \
BT_CODEC_META_CONTEXT_ATTENTION | \
BT_CODEC_META_CONTEXT_ALERT | \
BT_CODEC_META_CONTEXT_MAN_MACHINE | \
BT_CODEC_META_CONTEXT_EMERGENCY | \
BT_CODEC_META_CONTEXT_RINGTONE | \
BT_CODEC_META_CONTEXT_TV)
/** Location values for BT Audio.
*
* These values are defined by the Generic Audio Assigned Numbers
*/
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_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 Minimun 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 minimun 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 callling
* 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
* callling
* 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);
/** @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);
/**
* @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);
/** @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);
/** @} */
#ifdef __cplusplus
}
#endif
/**
* @}
*/
#endif /* ZEPHYR_INCLUDE_BLUETOOTH_AUDIO_H_ */