整个hardware接口的作用就是apk下面的jni跟协议栈对接的接口,路径如下:
/packages/modules/Bluetooth/system/include/hardware/bt_le_audio.h
一. LeAudioClientInterface
class LeAudioClientInterface {
public:
virtual ~LeAudioClientInterface() = default;
/* Register the LeAudio callbacks */
virtual void Initialize(LeAudioClientCallbacks* callbacks,
const std::vector<btle_audio_codec_config_t>& offloading_preference) = 0;
/** Connect to LEAudio */
virtual void Connect(const RawAddress& address) = 0;
/** Disconnect from LEAudio */
virtual void Disconnect(const RawAddress& address) = 0;
/* Set enable/disable State for the LeAudio device */
virtual void SetEnableState(const RawAddress& address, bool enabled) = 0;
/* Cleanup the LeAudio */
virtual void Cleanup(void) = 0;
/* Called when LeAudio is unbonded. */
virtual void RemoveDevice(const RawAddress& address) = 0;
/* Attach le audio node to group */
virtual void GroupAddNode(int group_id, const RawAddress& addr) = 0;
/* Detach le audio node from a group */
virtual void GroupRemoveNode(int group_id, const RawAddress& addr) = 0;
/* Set active le audio group */
virtual void GroupSetActive(int group_id) = 0;
/* Set codec config preference */
virtual void SetCodecConfigPreference(int group_id, btle_audio_codec_config_t input_codec_config,
btle_audio_codec_config_t output_codec_config) = 0;
/* Set Ccid for context type */
virtual void SetCcidInformation(int ccid, int context_type) = 0;
/* Set In call flag */
virtual void SetInCall(bool in_call) = 0;
/* Set Sink listening mode flag */
virtual void SetUnicastMonitorMode(uint8_t direction, bool enable) = 0;
/* Sends a preferred audio profiles change */
virtual void SendAudioProfilePreferences(int group_id, bool is_output_preference_le_audio,
bool is_duplex_preference_le_audio) = 0;
/* Set allowed to stream context */
virtual void SetGroupAllowedContextMask(int group_id, int sink_context_types,
int source_context_types) = 0;
};
|-------------------------------|--------------------|
| 方法名 | 功能描述 |
| Initialize | 初始化 LE Audio 客户端接口 |
| Connect | 连接到 LE Audio 设备 |
| Disconnect | 断开 LE Audio 设备连接 |
| SetEnableState | 设置设备的启用/禁用状态 |
| Cleanup | 清理 LE Audio 客户端资源 |
| RemoveDevice | 移除已配对的设备 |
| GroupAddNode | 将设备添加到组 |
| GroupRemoveNode | 从组中移除设备 |
| GroupSetActive | 设置活动组 |
| SetCodecConfigPreference | 设置编解码器配置偏好 |
| SetCcidInformation | 设置 CCID 与上下文类型映射 |
| SetInCall | 设置通话状态标志 |
| SetUnicastMonitorMode | 设置单播监控模式 |
| SendAudioProfilePreferences | 发送音频配置文件偏好 |
| SetGroupAllowedContextMask | 设置组允许的上下文掩码 |
1. Initialize - 初始化接口
virtual void Initialize(LeAudioClientCallbacks* callbacks,
const std::vector<btle_audio_codec_config_t>& offloading_preference) = 0;
- 功能:初始化 LE Audio 客户端,注册回调并设置硬件加速偏好
- 参数:
-
callbacks:上层回调接口,接收协议栈事件offloading_preference:编解码器卸载到硬件的偏好配置(如 DSP 加速)
- 使用时机:蓝牙服务启动时调用
- 对应 Java :
BluetoothLeAudio类的初始化
2. Connect - 连接设备
virtual void Connect(const RawAddress& address) = 0;
- 功能:建立与指定 LE Audio 设备的连接
- 参数 :
address- 目标设备的 MAC 地址 - 底层操作:触发 GATT连线
- 对应 Java API :
BluetoothLeAudio.connect()
3. Disconnect - 断开连接
virtual void Disconnect(const RawAddress& address) = 0;
- 功能:断开与 LE Audio 设备的连接
- 参数 :
address- 目标设备的 MAC 地址 - 清理工作:关闭音频流,释放资源
- 对应 Java API :
BluetoothLeAudio.disconnect()
4. SetEnableState - 设置启用状态
virtual void SetEnableState(const RawAddress& address, bool enabled) = 0;
- 功能:启用或禁用特定设备的 LE Audio 功能
- 场景:用户手动禁用设备、电池低电量时自动禁用
- 区别 :与
Disconnect不同,此方法保持连接但禁用音频功能
5. Cleanup - 清理资源
virtual void Cleanup(void) = 0;
- 功能:清理所有 LE Audio 相关资源
- 时机:蓝牙服务停止、配置文件卸载时调用
- 作用:释放内存,关闭所有连接
6. RemoveDevice - 移除设备
virtual void RemoveDevice(const RawAddress& address) = 0;
- 功能:移除已配对的设备
- 时机:用户取消配对、设备信息清理
- 清理内容:删除配对信息、配置参数等
7. GroupAddNode - 添加设备到组
virtual void GroupAddNode(int group_id, const RawAddress& addr) = 0;
- 功能:将设备添加到指定的音频组
- 应用:将左右耳塞添加到同一组实现同步
- 参数 :
group_id- 组 ID,addr- 设备地址
8. GroupRemoveNode - 从组中移除设备
virtual void GroupRemoveNode(int group_id, const RawAddress& addr) = 0;
- 功能:从组中移除设备
- 场景:设备断开、用户手动移除
- 影响:组内剩余设备继续同步播放
9. GroupSetActive - 设置活动组
virtual void GroupSetActive(int group_id) = 0;
- 功能:设置当前活动的音频组
- 场景:多组设备切换(如家庭影院组和耳机组切换)
- 影响:音频流将发送到活动组
10. SetCodecConfigPreference - 设置编解码器偏好
virtual void SetCodecConfigPreference(int group_id, btle_audio_codec_config_t input_codec_config,
btle_audio_codec_config_t output_codec_config) = 0;
- 功能:设置组级的编解码器配置偏好
- 参数:
-
input_codec_config:输入(麦克风)编解码器配置output_codec_config:输出(扬声器)编解码器配置
- 示例:设置使用 LC3 48kHz 24-bit 立体声
11. SetCcidInformation - 设置 CCID 映射
virtual void SetCcidInformation(int ccid, int context_type) = 0;
- 功能:建立 CCID(Content Control ID)与上下文类型的映射
- 用途:音频内容类型识别,如媒体、通话、通知
- 示例:CCID 1 → 媒体音频,CCID 2 → 通话音频
12. SetInCall - 设置通话状态
virtual void SetInCall(bool in_call) = 0;
- 功能:通知协议栈当前是否在通话中
- 影响:切换音频路径、调整编解码器优先级
- 场景:来电时优先保证通话质量
13. SetUnicastMonitorMode - 设置监控模式
virtual void SetUnicastMonitorMode(uint8_t direction, bool enable) = 0;
- 功能:启用/禁用单播监控模式
- 用途:调试、质量监控、音频分析
- 参数 :
direction- 0x01 输入,0x02 输出
14. SendAudioProfilePreferences - 发送音频偏好
virtual void SendAudioProfilePreferences(int group_id, bool is_output_preference_le_audio,
bool is_duplex_preference_le_audio) = 0;
- 功能:发送音频配置文件的偏好设置
- 参数:
-
is_output_preference_le_audio:输出是否偏好 LE Audiois_duplex_preference_le_audio:双工通信是否偏好 LE Audio
- 场景:设备同时支持传统蓝牙和 LE Audio 时选择
15. SetGroupAllowedContextMask - 设置上下文掩码
virtual void SetGroupAllowedContextMask(int group_id, int sink_context_types,
int source_context_types) = 0;
- 功能:设置组允许的音频上下文类型
- 参数:
-
sink_context_types:接收端允许的上下文(如媒体播放)source_context_types:发送端允许的上下文(如麦克风输入)
- 用途:限制特定组处理的音频类型
二. LeAudioClientCallbacks
class LeAudioClientCallbacks {
public:
virtual ~LeAudioClientCallbacks() = default;
/* Callback to notify Java that stack is ready */
virtual void OnInitialized(void) = 0;
/** Callback for profile connection state change */
virtual void OnConnectionState(ConnectionState state, const RawAddress& address) = 0;
/* Callback with group status update */
virtual void OnGroupStatus(int group_id, GroupStatus group_status) = 0;
/* Callback with node status update */
virtual void OnGroupNodeStatus(const RawAddress& bd_addr, int group_id,
GroupNodeStatus node_status) = 0;
/* Callback for newly recognized or reconfigured existing le audio group */
virtual void OnAudioConf(uint8_t direction, int group_id,
std::optional<std::bitset<32>> snk_audio_location,
std::optional<std::bitset<32>> src_audio_location,
uint16_t avail_cont) = 0;
/* Callback for sink audio location recognized */
virtual void OnSinkAudioLocationAvailable(const RawAddress& address,
std::optional<std::bitset<32>> snk_audio_location) = 0;
/* Callback with local codec capabilities */
virtual void OnAudioLocalCodecCapabilities(
std::vector<btle_audio_codec_config_t> local_input_capa_codec_conf,
std::vector<btle_audio_codec_config_t> local_output_capa_codec_conf) = 0;
/* Callback with current group codec configurations. Should change when PACs
* changes */
virtual void OnAudioGroupCurrentCodecConf(int group_id,
btle_audio_codec_config_t input_codec_conf,
btle_audio_codec_config_t output_codec_conf) = 0;
/* Callback with selectable group codec configurations. Should change when
* context changes */
virtual void OnAudioGroupSelectableCodecConf(
int group_id, std::vector<btle_audio_codec_config_t> input_selectable_codec_conf,
std::vector<btle_audio_codec_config_t> output_selectable_codec_conf) = 0;
virtual void OnHealthBasedRecommendationAction(const RawAddress& address,
LeAudioHealthBasedAction action) = 0;
virtual void OnHealthBasedGroupRecommendationAction(int group_id,
LeAudioHealthBasedAction action) = 0;
virtual void OnUnicastMonitorModeStatus(uint8_t direction, UnicastMonitorModeStatus status) = 0;
/* Callback with group stream status update */
virtual void OnGroupStreamStatus(int group_id, GroupStreamStatus group_stream_status) = 0;
};
|------------------------------------------|------------|---------------------|
| 回调方法 | 功能描述 | 触发时机 |
| OnInitialized | 协议栈初始化完成 | 蓝牙服务启动,LE Audio 栈就绪 |
| OnConnectionState | 设备连接状态变化 | 设备连接/断开 |
| OnGroupStatus | 组状态更新 | 组激活/非激活 |
| OnGroupNodeStatus | 组内节点状态更新 | 设备加入/离开组 |
| OnAudioConf | 音频配置更新 | 组创建或重新配置 |
| OnSinkAudioLocationAvailable | 接收端音频位置识别 | 设备音频位置信息可用 |
| OnAudioLocalCodecCapabilities | 本地编解码器能力 | 本地编解码器能力变化 |
| OnAudioGroupCurrentCodecConf | 当前组编解码器配置 | PACs 变化时 |
| OnAudioGroupSelectableCodecConf | 可选编解码器配置 | 音频上下文变化时 |
| OnHealthBasedRecommendationAction | 基于设备健康度的建议 | 连接质量差、电池低等 |
| OnHealthBasedGroupRecommendationAction | 基于组健康度的建议 | 组整体健康度变化 |
| OnUnicastMonitorModeStatus | 单播监控模式状态 | 监控模式启用/禁用 |
| OnGroupStreamStatus | 组流状态更新 | 音频流开始/停止 |
1. OnInitialized - 协议栈初始化完成
virtual void OnInitialized(void) = 0;
- 功能:通知上层 LE Audio 协议栈初始化完成,可以开始使用
- 触发时机:
-
- 蓝牙服务启动时
- LE Audio 协议栈加载完成后
- 底层操作:
-
- 初始化 ISO 通道管理器
- 设置音频编解码器模块
- 配置同步机制
2. OnConnectionState - 设备连接状态变化
virtual void OnConnectionState(ConnectionState state, const RawAddress& address) = 0;
- 功能:设备连接状态发生变化
状态枚举:
enum ConnectionState {
DISCONNECTED = 0,
CONNECTING = 1,
CONNECTED = 2,
DISCONNECTING = 3
};
典型流程:
CONNECTING → CONNECTED → 音频协商 → 音频流
设备断开 → DISCONNECTING → DISCONNECTED
3. OnGroupStatus - 组状态更新
virtual void OnGroupStatus(int group_id, GroupStatus group_status) = 0;
- 功能:LE Audio 组的状态变化(激活/非激活)
- 组状态:
-
INACTIVE:组存在但未用于音频流ACTIVE:组可用于音频流传输
- 使用场景:
-
- 多设备同步组创建时设为 ACTIVE
- 所有设备断开时设为 INACTIVE
- 用户手动激活/停用组
4. OnGroupNodeStatus - 组内节点状态更新
virtual void OnGroupNodeStatus(const RawAddress& bd_addr, int group_id,
GroupNodeStatus node_status) = 0;
- 功能:组内设备节点的状态变化
- 节点状态:
-
NODE_ADDED:设备加入组NODE_REMOVED:设备离开组NODE_ACTIVE:设备在组中激活
- 特殊处理:
-
- 助听器:左右耳设备加入同一组
- LE Audio 耳机:左右耳塞加入同一组同步
5. 5. OnAudioConf - 音频配置更新
virtual void OnAudioConf(uint8_t direction, int group_id,
std::optional<std::bitset<32>> snk_audio_location,
std::optional<std::bitset<32>> src_audio_location,
uint16_t avail_cont) = 0;
- 功能:音频配置更新(最重要回调之一)
- 参数详解:
-
- direction:音频方向掩码
-
-
0x01:接收(Sink,设备接收音频)0x02:发送(Source,设备发送音频)
-
snk_audio_location:接收端音频位置(32位位掩码)
// 蓝牙分配的音频位置定义
bitset<32> location;
location.set(0); // 右耳前方
location.set(1); // 左耳前方
location.set(2); // 右耳后方
// ... 共32个位置
-
- src_audio_location:发送端音频位置
avail_cont:可用上下文类型(16位掩码)
// 蓝牙定义的音频上下文
#define CONTEXT_UNSPECIFIED 0x0001
#define CONTEXT_CONVERSATIONAL 0x0002 // 通话
#define CONTEXT_MEDIA 0x0004 // 媒体
#define CONTEXT_GAME 0x0008 // 游戏
#define CONTEXT_INSTRUCTIONAL 0x0010 // 教学
#define CONTEXT_VOICE_ASSISTANTS 0x0020 // 语音助手
#define CONTEXT_LIVE 0x0040 // 直播
#define CONTEXT_SOUND_EFFECTS 0x0080 // 音效
#define CONTEXT_NOTIFICATIONS 0x0100 // 通知
#define CONTEXT_RINGTONE 0x0200 // 铃声
6. OnSinkAudioLocationAvailable - 接收端音频位置识别
virtual void OnSinkAudioLocationAvailable(const RawAddress& address,
std::optional<std::bitset<32>> snk_audio_location) = 0;
- 功能:设备音频位置信息可用
- 使用场景:
-
- 识别左右耳塞
- 识别多声道音箱位置
- 音频平衡调整
7. OnAudioLocalCodecCapabilities - 本地编解码器能力
virtual void OnAudioLocalCodecCapabilities(
std::vector<btle_audio_codec_config_t> local_input_capa_codec_conf,
std::vector<btle_audio_codec_config_t> local_output_capa_codec_conf) = 0;
- 功能:报告本地设备支持的编解码器能力
编解码器配置结构:
typedef struct {
uint8_t codec_type; // LC3, SBC, AAC 等
uint32_t sample_rate; // 采样率:16000, 24000, 32000, 44100, 48000
uint8_t bits_per_sample; // 位深度:16, 24, 32
uint8_t channel_count; // 声道数:1(单声道), 2(立体声)
uint32_t bitrate; // 比特率:16000-320000 bps
uint16_t frame_duration; // 帧时长:7500us, 10000us
// 编解码器特定参数
uint8_t lc3_config[10]; // LC3 特定配置
} btle_audio_codec_config_t;
8. OnAudioGroupCurrentCodecConf - 当前组编解码器配置
virtual void OnAudioGroupCurrentCodecConf(int group_id,
btle_audio_codec_config_t input_codec_conf,
btle_audio_codec_config_t output_codec_conf) = 0;
- 功能:当前使用的编解码器配置变化
- 触发条件:
-
- PACs(Published Audio Capabilities)变化
- 设备重新协商编解码器
- 音频上下文变化
9. OnAudioGroupSelectableCodecConf - 可选编解码器配置
virtual void OnAudioGroupSelectableCodecConf(
int group_id, std::vector<btle_audio_codec_config_t> input_selectable_codec_conf,
std::vector<btle_audio_codec_config_t> output_selectable_codec_conf) = 0;
- 功能:可选的编解码器配置列表
- 使用场景:
-
- 音频质量自适应(根据网络状况选择)
- 用户手动选择编解码器
- 不同音频场景使用不同编解码器
10. 健康度建议回调
virtual void OnHealthBasedRecommendationAction(const RawAddress& address,
LeAudioHealthBasedAction action) = 0;
virtual void OnHealthBasedGroupRecommendationAction(int group_id,
LeAudioHealthBasedAction action) = 0;
- 功能:基于健康度的建议操作
- 健康度指标:
-
- 连接质量(RSSI、丢包率)
- 设备电池电量
- 音频同步延迟
- 编解码器错误率
建议操作枚举:
enum LeAudioHealthBasedAction {
NO_ACTION = 0,
WARN_POOR_CONNECTION = 1, // 警告连接质量差
REDUCE_AUDIO_QUALITY = 2, // 降低音频质量
SWITCH_TO_BROADCAST = 3, // 切换到广播模式
DISCONNECT_DEVICE = 4, // 断开设备
DISABLE_LE_AUDIO = 5, // 禁用 LE Audio
SWITCH_TO_CLASSIC_AUDIO = 6, // 切换到经典蓝牙音频
};
11. OnUnicastMonitorModeStatus - 单播监控模式状态
virtual void OnUnicastMonitorModeStatus(uint8_t direction, UnicastMonitorModeStatus status) = 0;
- 功能:单播监控模式状态变化
- 用途:
-
- 音频质量分析
- 调试音频同步问题
- 性能测试和优化
监控模式:
enum UnicastMonitorModeStatus {
MONITOR_MODE_DISABLED = 0,
MONITOR_MODE_ENABLED = 1,
MONITOR_MODE_ACTIVE = 2, // 正在监控
};
12. OnGroupStreamStatus - 组流状态更新
virtual void OnGroupStreamStatus(int group_id, GroupStreamStatus group_stream_status) = 0;
- 功能:音频流状态变化
流状态枚举:
enum GroupStreamStatus {
IDLE = 0, // 空闲,无音频流
STREAMING = 1, // 正在流传输
SUSPENDED = 2, // 暂停
RECONFIGURING = 3, // 重新配置中
};
状态转换:
IDLE → 应用开始播放 → STREAMING
STREAMING → 暂停 → SUSPENDED
SUSPENDED → 恢复 → STREAMING
STREAMING → 编解码器切换 → RECONFIGURING → STREAMING
三. LeAudioBroadcasterInterface
class LeAudioBroadcasterInterface {
public:
virtual ~LeAudioBroadcasterInterface() = default;
/* Register the LeAudio Broadcaster callbacks */
virtual void Initialize(LeAudioBroadcasterCallbacks* callbacks) = 0;
/* Stop the LeAudio Broadcaster and all active broadcasts */
virtual void Stop(void) = 0;
/* Cleanup the LeAudio Broadcaster */
virtual void Cleanup(void) = 0;
/* Create Broadcast instance */
virtual void CreateBroadcast(bool is_public, std::string broadcast_name,
std::optional<BroadcastCode> broadcast_code,
std::vector<uint8_t> public_metadata,
std::vector<uint8_t> subgroup_quality,
std::vector<std::vector<uint8_t>> subgroup_metadata) = 0;
/* Update the ongoing Broadcast metadata */
virtual void UpdateMetadata(uint32_t broadcast_id, std::string broadcast_name,
std::vector<uint8_t> public_metadata,
std::vector<std::vector<uint8_t>> subgroup_metadata) = 0;
/* Start the existing Broadcast stream */
virtual void StartBroadcast(uint32_t broadcast_id) = 0;
/* Pause the ongoing Broadcast stream */
virtual void PauseBroadcast(uint32_t broadcast_id) = 0;
/* Stop the Broadcast (no stream, no periodic advertisements */
virtual void StopBroadcast(uint32_t broadcast_id) = 0;
/* Destroy the existing Broadcast instance */
virtual void DestroyBroadcast(uint32_t broadcast_id) = 0;
/* Get Broadcast Metadata */
virtual void GetBroadcastMetadata(uint32_t broadcast_id) = 0;
};
|------------------------|------------------|----------|
| 方法名 | 功能描述 | 使用场景 |
| Initialize | 初始化 LE Audio 广播器 | 广播功能启动时 |
| Stop | 停止广播器及所有活跃广播 | 关闭广播功能时 |
| Cleanup | 清理广播器资源 | 广播功能卸载时 |
| CreateBroadcast | 创建广播实例 | 开始新广播时 |
| UpdateMetadata | 更新广播元数据 | 广播内容变化时 |
| StartBroadcast | 启动广播流 | 开始广播音频流时 |
| PauseBroadcast | 暂停广播流 | 临时暂停广播时 |
| StopBroadcast | 停止广播 | 结束广播时 |
| DestroyBroadcast | 销毁广播实例 | 完全移除广播时 |
| GetBroadcastMetadata | 获取广播元数据 | 查询广播信息时 |
1. Initialize - 初始化广播器
virtual void Initialize(LeAudioBroadcasterCallbacks* callbacks) = 0;
- 功能:初始化 LE Audio 广播功能,注册回调接口
- 参数 :
callbacks- 广播器回调接口指针,用于接收广播事件 - 初始化内容:
-
- 设置广播参数
- 初始化同步流
- 准备广告数据
- 对应广播:LE Audio Broadcast 技术,用于一对多音频广播
2. Stop - 停止广播器
virtual void Stop(void) = 0;
- 功能:立即停止广播器及所有活跃的广播
- 清理内容:
-
- 停止所有音频流
- 停止广播广告
- 释放广播资源
- 使用场景:用户关闭广播功能、蓝牙关闭时
3. Cleanup - 清理资源
virtual void Cleanup(void) = 0;
- 功能:彻底清理广播器资源
- 与 Stop 的区别:
-
Stop:临时停止,可以重新启动Cleanup:永久清理,需要重新初始化
- 使用时机:广播功能卸载、协议栈关闭时
4. CreateBroadcast - 创建广播实例
virtual void CreateBroadcast(bool is_public, std::string broadcast_name,
std::optional<BroadcastCode> broadcast_code,
std::vector<uint8_t> public_metadata,
std::vector<uint8_t> subgroup_quality,
std::vector<std::vector<uint8_t>> subgroup_metadata) = 0;
- 功能:创建一个新的广播实例(最重要的接口)
- 参数详解:
is_public - 广播类型
bool is_public = true; // 公开广播:任何人都可以接收
bool is_public = false; // 私有广播:需要广播码才能接收
broadcast_name - 广播名称
broadcast_code - 广播码(可选)
public_metadata - 公共元数据
subgroup_quality - 子组质量
subgroup_metadata - 子组元数据
5. UpdateMetadata - 更新元数据
virtual void UpdateMetadata(uint32_t broadcast_id, std::string broadcast_name,
std::vector<uint8_t> public_metadata,
std::vector<std::vector<uint8_t>> subgroup_metadata) = 0;
- 功能:更新正在进行的广播的元数据
- 使用场景:
-
- 广播内容变化(如切换歌曲)
- 广播名称修改
- 音频参数调整
- 实时性:更新会立即生效,接收端会收到通知
6. StartBroadcast - 启动广播流
virtual void StartBroadcast(uint32_t broadcast_id) = 0;
- 功能:启动指定广播实例的音频流
- 启动流程:
-
- 开始发送广播广告
- 启动音频编码和传输
- 建立同步流
- 广播ID :由
CreateBroadcast返回的唯一标识符
7. PauseBroadcast - 暂停广播流
virtual void PauseBroadcast(uint32_t broadcast_id) = 0;
- 功能:暂停广播流,但保持广播实例
- 与 Stop 的区别:
-
Pause:临时暂停,可以快速恢复Stop:完全停止,需要重新开始
- 使用场景:插播广告、临时中断
8. StopBroadcast - 停止广播
virtual void StopBroadcast(uint32_t broadcast_id) = 0;
- 功能:停止指定广播(无音频流,无广告)
- 保留状态:广播实例仍然存在,可以重新启动
- 清理内容:
-
- 停止音频编码
- 停止同步流
- 停止广播广告
9. DestroyBroadcast - 销毁广播实例
virtual void DestroyBroadcast(uint32_t broadcast_id) = 0;
- 功能:完全销毁广播实例,释放资源
- 与 Stop 的区别:
-
Stop:停止广播,实例还在Destroy:销毁实例,无法恢复
- 使用时机:广播彻底结束,不再需要
10. GetBroadcastMetadata - 获取元数据
virtual void GetBroadcastMetadata(uint32_t broadcast_id) = 0;
- 功能:获取广播的元数据信息
- 异步返回:通过回调返回元数据
- 返回信息:广播名称、编解码器、质量参数等
四. LeAudioBroadcasterCallbacks
class LeAudioBroadcasterCallbacks {
public:
virtual ~LeAudioBroadcasterCallbacks() = default;
/* Callback for the newly created broadcast event. */
virtual void OnBroadcastCreated(uint32_t broadcast_id, bool success) = 0;
/* Callback for the destroyed broadcast event. */
virtual void OnBroadcastDestroyed(uint32_t broadcast_id) = 0;
/* Callback for the broadcast source state event. */
virtual void OnBroadcastStateChanged(uint32_t broadcast_id, BroadcastState state) = 0;
/* Callback for the broadcast metadata change. */
virtual void OnBroadcastMetadataChanged(uint32_t broadcast_id,
const BroadcastMetadata& broadcast_metadata) = 0;
/* Callback for broadcast audio session create event. */
virtual void OnBroadcastAudioSessionCreated(bool success) = 0;
};
|----------------------------------|----------|------------|
| 回调方法 | 功能描述 | 对应操作 |
| OnBroadcastCreated | 广播创建完成 | 广播实例创建完成 |
| OnBroadcastDestroyed | 广播销毁完成 | 广播实例销毁完成 |
| OnBroadcastStateChanged | 广播状态变化 | 广播启动、暂停、停止 |
| OnBroadcastMetadataChanged | 广播元数据变化 | 广播内容或配置变化 |
| OnBroadcastAudioSessionCreated | 广播音频会话创建 | 音频资源就绪 |
1. OnBroadcastCreated - 广播创建完成
virtual void OnBroadcastCreated(uint32_t broadcast_id, bool success) = 0;
- 功能:通知上层广播实例创建完成
- 参数详解:
-
broadcast_id:系统分配的广播ID,用于后续操作该广播success:创建是否成功
-
-
true:创建成功,广播ID有效false:创建失败,广播ID无效
-
2. OnBroadcastDestroyed - 广播销毁完成
virtual void OnBroadcastDestroyed(uint32_t broadcast_id) = 0;
- 功能:通知上层广播实例已完全销毁
- 清理工作:
-
- 释放广播相关的所有资源
- 清理广播广告
- 关闭音频流
- 使用场景:
-
- 用户主动结束广播
- 广播异常终止
- 系统资源回收
3. OnBroadcastStateChanged - 广播状态变化
virtual void OnBroadcastStateChanged(uint32_t broadcast_id, BroadcastState state) = 0;
- 功能:广播状态发生变化时回调
BroadcastState 枚举:
enum BroadcastState {
BROADCAST_STATE_IDLE = 0, // 空闲状态
BROADCAST_STATE_CONFIGURING = 1, // 配置中
BROADCAST_STATE_READY = 2, // 就绪,可以启动
BROADCAST_STATE_STREAMING = 3, // 正在流传输
BROADCAST_STATE_PAUSED = 4, // 已暂停
BROADCAST_STATE_STOPPED = 5, // 已停止
BROADCAST_STATE_ERROR = 6 // 错误状态
};
4. OnBroadcastMetadataChanged - 广播元数据变化
virtual void OnBroadcastMetadataChanged(uint32_t broadcast_id,
const BroadcastMetadata& broadcast_metadata) = 0;
- 功能:广播元数据发生变化时回调
BroadcastMetadata 结构:
struct BroadcastMetadata {
std::string broadcast_name; // 广播名称
bool is_public; // 是否公开广播
std::optional<BroadcastCode> broadcast_code; // 广播码(可选)
std::vector<uint8_t> public_metadata; // 公共元数据
std::vector<std::vector<uint8_t>> subgroup_metadata; // 子组元数据
// 编解码器信息
AudioCodecConfig codec_config;
// 音频参数
uint32_t sample_rate;
uint8_t channel_count;
// 广播参数
uint16_t advertising_interval;
uint8_t phy; // 物理层(1M/2M)
};
- 触发时机:
-
- 调用
UpdateMetadata后 - 广播内部参数自适应调整
- 接收端反馈导致元数据变化
- 调用
5. OnBroadcastAudioSessionCreated - 广播音频会话创建
virtual void OnBroadcastAudioSessionCreated(bool success) = 0;
- 功能:广播音频会话创建完成回调
- 音频会话内容:
-
- 音频编码器实例
- 同步流管理
- 音频数据缓冲区
- 时钟同步机制
- 重要性:音频会话是广播的核心,创建失败则无法进行音频传输