蓝牙耳机音量控制问题

背景

之前测试提了一个蓝牙音量相关的BUG: 调节蓝牙耳机音量,系统音量不跟随变化,即耳机音量没有和系统音量同步;

虽然知道是绝对音量的问题,但不太清楚整个具体流程,特此记录下

分析与解决

音量调节的流程

音量调节的整个流程:

			  蓝牙
OS(数字音量)<-- --> 蓝牙耳机(数字音量+模拟音量)

在使用蓝牙耳机时,

  • 调节OS上的音量
    当调节OS上的音量时, 其调节的是数字音量,即调整了蓝牙传输的数字音频数据增益,从而使耳机听起来的音量有所变化

  • 调节蓝牙耳机上的音量
    当调节蓝牙耳机上的音量时,一般是直接调节蓝牙芯片的数字音量,使DAC出来的音量发生变化,所以这种情况下一般不会对OS的音量有所影响。

蓝牙的绝对音量

如果在调节蓝牙耳机上的音量时,需要将耳机音量同步给OS系统该怎么办呢? 也是可以做的,蓝牙协议已经帮忙考虑到这一点了,即设置蓝牙的绝对音量,需要走AVRCP协议,并且主机和蓝牙耳机都要支持该协议

具体流程见下图

  1. 首先,主机(OS)需向耳机注册音量变化的通知事件

  2. 耳机回复临时的响应

  3. 当用户调节耳机音量时,就会有音量变化的事件上报给主机(OS)

在Android手机的设置里一般都会有是否启用蓝牙绝对音量的选项
在Linux系统中,可能就需要bluez去操作了

参考

  • Bluetooth Profile Specification– Audio/Video Remote Control (v1.6.2)