zephyr/include/bluetooth/audio/audio.h
Emil Gydesen 18466530ab Bluetooth: PACS: Refactor PAC location read/write
Refactor the PAC location read and write. Instead
of storing the location in the service, the
location is now stored in the application, and
is retrieved by the service via callbacks.

Similarly, if a client writes the location, this
request is being sent to the application.

Signed-off-by: Emil Gydesen <emil.gydesen@nordicsemi.no>
2022-03-11 11:36:19 -08:00

1750 lines
54 KiB
C

/** @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_ */