Android Le audio hardware native接口

整个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 加速)
  • 使用时机:蓝牙服务启动时调用
  • 对应 JavaBluetoothLeAudio 类的初始化

2. Connect - 连接设备

复制代码
virtual void Connect(const RawAddress& address) = 0;
  • 功能:建立与指定 LE Audio 设备的连接
  • 参数address - 目标设备的 MAC 地址
  • 底层操作:触发 GATT连线
  • 对应 Java APIBluetoothLeAudio.connect()

3. Disconnect - 断开连接

复制代码
virtual void Disconnect(const RawAddress& address) = 0;
  • 功能:断开与 LE Audio 设备的连接
  • 参数address - 目标设备的 MAC 地址
  • 清理工作:关闭音频流,释放资源
  • 对应 Java APIBluetoothLeAudio.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 Audio
    • is_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;
  • 功能:音频配置更新(最重要回调之一)
  • 参数详解
    1. direction:音频方向掩码
      • 0x01:接收(Sink,设备接收音频)
      • 0x02:发送(Source,设备发送音频)

snk_audio_location:接收端音频位置(32位位掩码)

复制代码
// 蓝牙分配的音频位置定义
bitset<32> location;
location.set(0);  // 右耳前方
location.set(1);  // 左耳前方
location.set(2);  // 右耳后方
// ... 共32个位置
    1. 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;
  • 功能:当前使用的编解码器配置变化
  • 触发条件
    1. PACs(Published Audio Capabilities)变化
    2. 设备重新协商编解码器
    3. 音频上下文变化

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;
  • 功能:启动指定广播实例的音频流
  • 启动流程
    1. 开始发送广播广告
    2. 启动音频编码和传输
    3. 建立同步流
  • 广播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)
};
  • 触发时机
    1. 调用 UpdateMetadata
    2. 广播内部参数自适应调整
    3. 接收端反馈导致元数据变化

5. OnBroadcastAudioSessionCreated - 广播音频会话创建

复制代码
virtual void OnBroadcastAudioSessionCreated(bool success) = 0;
  • 功能:广播音频会话创建完成回调
  • 音频会话内容
    • 音频编码器实例
    • 同步流管理
    • 音频数据缓冲区
    • 时钟同步机制
  • 重要性:音频会话是广播的核心,创建失败则无法进行音频传输
相关推荐
Wireless_Link4 天前
蓝牙低功耗音频 Le audio音频输入控制协议(AICS)剖析
le audio·le audio aics·低功耗蓝牙音频aics·低功耗音频aics·lea aics
Wireless_Link10 天前
蓝牙低功耗音频 Le audio麦克风控制协议(MICP/MICS)剖析
le audio·低功耗蓝牙音频·le audio micp·le audio mics·micp/mics
byte轻骑兵10 天前
【LE Audio】BAP协议精讲[1]: 开启低功耗音频新纪元
人工智能·音视频·蓝牙·le audio·bap
Wireless_Link17 天前
Le audio也有通话功能了!Le audio之通话控制介绍,涵盖CCP/TBS的技术细节
le audio·le audio通话·lea tbs·lea ccp·低功耗音频通话
Wireless_Link19 天前
Le audio之媒体控制(Media control)介绍,涵盖MCP/MCS的技术细节
le audio·le audio mcp·le audio mcs·le audio媒体控制·mcp/mcs
墨染倾城殇2 个月前
蓝牙模块低功耗革命:LE Audio多通道音频技术详解(TWS同步/家庭影院/VR音效)
蓝牙模块·低功耗蓝牙模块·le audio
jiang_bluetooth1 年前
Bluetooth LE AUDIO架构概述
架构·蓝牙·ble audio·le audio