audio 之 BtHelper
Android 音频系统中的一个核心组件,用于管理与蓝牙音频设备相关的所有通信和状态。
代码位置
frameworks/base/services/core/java/com/android/server/audio/BtHelper.java。
1.核心作用:
蓝牙音频设备管理的中枢
这个类 (BtHelper) 充当了 Android 音频服务 (AudioService) 和底层蓝牙协议栈(如 BluetoothHeadset, BluetoothA2dp, BluetoothHearingAid, BluetoothLeAudio)之间的桥梁。它封装了所有与蓝牙服务交互的复杂逻辑,为上层的 AudioDeviceBroker 提供一个清晰、简化的接口。
主要功能详解
a. 管理蓝牙配置文件代理的连接
• 它通过 BluetoothProfile.ServiceListener 监听并获取各种蓝牙Profile的服务代理(Proxy),包括:
◦ BluetoothHeadset (HFP/HSP): 用于通话和语音识别的单声道SCO连接。◦ BluetoothA2dp: 用于播放高质量立体声音乐。◦ BluetoothHearingAid: 用于助听器设备(ASHA协议)。◦ BluetoothLeAudio: 用于新一代低功耗蓝牙音频(LE Audio/LC3协议)。
• 当这些服务的连接状态发生变化(连接或断开)时,它会通知 AudioDeviceBroker。
b. 处理SCO(Synchronous Connection-Oriented)链路
SCO链路用于蓝牙通话和语音识别(如Google Assistant)。该类负责:
• 状态管理:跟踪复杂的SCO状态机(mScoAudioState),包括内部请求、外部请求、激活中、失效中等状态。
• 连接控制:提供 startBluetoothSco 和 stopBluetoothSco 方法供上层调用,并最终通过 BluetoothHeadset 的 API(如 startScoUsingVirtualVoiceCall)来实际建立或断开SCO连接。
• 意图广播:在SCO状态改变时(连接中、已连接、已断开),向系统发送标准的 ACTION_SCO_AUDIO_STATE_UPDATED 广播,以便其他应用(如拨号盘、电话应用)能够知晓状态变化。
c. 管理活跃的蓝牙设备
监听 BluetoothHeadset.ACTION_ACTIVE_DEVICE_CHANGED
等Intent,当用户切换了活跃的蓝牙设备(例如从耳机A切换到耳机B)时,它会通知 AudioDeviceBroker 更新系统的音频路由。
它将蓝牙设备信息(BluetoothDevice)转换为音频系统内部的设备表示(AudioDeviceAttributes),并缓存解析后的设备信息。
d. 音量控制
• 绝对音量(AVRCP):如果蓝牙设备支持绝对音量控制(mAvrcpAbsVolSupported),该类会提供
• setAvrcpAbsoluteVolumeIndex 方法,将系统的音量指数映射到蓝牙设备期望的值并发送给它,从而实现精确同步。
• LE Audio音量:提供 setLeAudioVolume 方法,将系统音量映射到LE Audio设备所需的0-255范围。
• 助听器音量:提供 setHearingAidVolume 方法,将系统音量转换为助听器设备所需的增益值(以分贝为单位)。
e. 编解码器信息查询
• 提供 getCodec 和 getCodecWithFallback 方法,用于从 BluetoothA2dp 和
BluetoothLeAudio 服务中查询当前活动设备正在使用的音频编解码器(如SBC, AAC, aptX, LC3)。
这些信息对于音频策略管理器(Audio Policy Manager)选择正确的音频硬件路径和配置非常重要。
f. 设备分类和元数据查询
• 提供 getBtDeviceCategory 方法,根据蓝牙设备的元数据 (METADATA_DEVICE_TYPE) 或设备类别
(BluetoothClass),将设备分类为诸如耳机、扬声器、车载套件、手表等类别
(AUDIO_DEVICE_CATEGORY_HEADPHONES等)。
这有助于系统对不同类型的设备采取不同的音频策略(如不同的默认音量曲线)。
g. LE Audio组管理
• 通过 MyLeAudioCallback 监听LE Audio组的变化(设备加入、离开组)。
• 提供 getLeAudioGroupAddresses 方法来获取同一个LE
Audio组中所有设备的地址,这对于管理多设备同步播放至关重要。
2. 上下文关系:
简单来说,BtHelper 是Android音频系统中专门负责与蓝牙打交道的“大管家”。
它的存在使得上层的音频路由逻辑 (AudioDeviceBroker) 无需关心蓝牙协议的具体细节,只需发出“连接这个设备”、“断开SCO”、“设置音量”等高级指令。BtHelper 会将这些指令翻译成具体的蓝牙API调用,并处理所有来自蓝牙服务的异步事件和回调,确保音频状态与蓝牙状态始终保持一致。
没有这个类,Android设备将无法正常地通过蓝牙耳机进行通话、听音乐或使用语音助手。