蓝牙低功耗音频 Le audio音量控制协议(VCS)剖析

在无线音频的世界里,一场静默却深刻的革命正在进行。

它,就是LE Audio。

这不仅仅是一次技术迭代,而是从底层重新定义声音如何被创造、传输和体验的范式转移。其复杂性令人敬畏------它并非单一技术,而是一套精密的生态系统:全新的LC3编解码器以超凡效率重塑音质与功耗的平衡,多重串流音频让真无线立体声达到前所未有的稳定与同步,而音频广播功能则打破了"一对一"连接的百年窠臼,让声音如电台般自由播撒。

然而,正是这种复杂性,构成了我们必须深入学习它的不可辩驳的理由。未来的声音图景将由它绘制:从下一代真无线耳机、无障碍助听设备到公共场所的沉浸式音频导览、多语言广播,乃至元宇宙中清晰无缝的语音交互。不了解LE Audio,将意味着在即将到来的音频浪潮中失去对话的基石。

这不仅仅关乎技术本身,更关乎我们如何连接彼此,如何感知世界。让我们共同开启这段探索之旅,揭开LE Audio的复杂面纱,看清它为何必将成为未来数年里,每一个科技从业者、音频爱好者乃至普通用户都无法忽视的关键命题。

接下来的系列文章,我们将逐步拆解这座精妙的技术大厦。

同时我也录制了一系列的Le audio视频,有兴趣的可以咨询,我会带领你们入门Le audio!翻过大山,眼下皆是风景!!!


视频链接: https://item.taobao.com/item.htm?id=1001969040805&mi_id=000032T4qZX9WZoRwX6YbxlNUaZOfOI6XoxDx0jxsfnwlEc&spm=a21xtw.29178619.0.0


一. 概念

1. 概念

VCS(Volume Control Service )服务使设备能够公开其音频音量的控制功能和状态。

该配置文件定义了两个角色:音量渲染器 角色和音量控制器角色。

音量渲染器(Volume Renderer) 是接收一个或多个音频输入并对音频输出设备进行控制的设备。
**音量控制器(Volume Controller)**是控制此音频的音量及相关状态的设备。

  • 音量渲染器应作为GATT服务器。
  • 音量控制器应作为GATT客户端。

对应的关系如下:

其中Volume Controller对应设备的协议就是VCP(Volume Control Profile)协议

其中音频渲染器**(Volume Renderer)**设备包含VCS/AICS/VOCS协议,整个音频渲染器的架构如下:

一个设备上应最多只有一个音量控制服务实例。

VCS被实例化,用于公开一个能够控制音频输出(例如一个或多个扬声器)音量的设备的控制功能和状态。

VCS可以包含零个或多个音量偏移控制服务(VOCS) 实例,以及零个或多个**音频输入控制服务(AICS)**实例。

VCS在整个le audio的架构如下:

2. 特征属性

|--------------------------------|--------|---------------------|-------------|----------|
| 特征名称 (Characteristic Name) | 要求 | 必选属性 | 可选属性 | 安全权限 |
| 音量状态 (Volume State) | 必须 (M) | 读、通知 (Read, Notify) | 无 (None) | 需加密 |
| 音量控制点 (Volume Control Point) | 必须 (M) | 写 (Write) | 无 (None) | 需加密 |
| 音量标志 (Volume Flags) | 必须 (M) | 读 (Read) | 通知 (Notify) | 需加密 |

其中VCS的primary service的UUID为

VCS包含的服务属性的UUID为:

二. 特征介绍

1. Volume State

"音量状态"特征应用于反映此服务所对应的音频音量状态。其数值应符合表中规定的格式

Volume_Setting

音量设置字段是一个无量纲的数值,其数值的逐步增加应当对应音频输出音量的逐步提高,而其数值的逐步减少则对应音频输出音量的逐步降低("逐步"的大小由具体实现决定)。

当音量设置字段的值为 0 时,表示输出音量处于最小值;当该字段的值为 255 时,表示输出音量处于最大值。

Mute

静音字段有两个取值:"未静音"(或数字"0")和"已静音"(或数字"1")。该字段的值代表服务器的音频状态,其中"未静音"表示音频未被静音,而"已静音"表示音频已被静音。

静音字段的值不得影响音量设置字段的值;例如,将服务器静音不应将音量设置字段的值变为0。

该静音字段为整个设备提供一个统一的静音控制点。此外,输入状态特征中的AICS静音字段可用于静音各个独立输入。

Change_Counter

服务器应在每次对音量设置字段和静音字段的值进行更改时,将变更计数器字段的值递增1。如果同时更改了多个字段,变更计数器字段的值也应只递增一次。该字段的值在所有音量控制点指令中都会用到。

服务器应将变更计数器字段初始化为任意值,其取值范围为0至255。若递增后超过255,则从0重新开始循环。

2. Volume Control Point

音量控制点特征用于在向其写入数值时,请求服务器执行特定操作。有以下操作

|----------|-------------------------------------------|-----------|-----------------------------------------------|
| 操作码值 | 操作码 (Opcode) | 操作码要求 | 操作数 (Operand) |
| 0x00 | 相对音量降低 (Relative Volume Down) | M (必需) | 变更计数器 (Change_Counter) |
| 0x01 | 相对音量升高 (Relative Volume Up) | M (必需) | 变更计数器 (Change_Counter) |
| 0x02 | 取消静音/相对音量降低 (Unmute/Relative Volume Down) | M (必需) | 变更计数器 (Change_Counter) |
| 0x03 | 取消静音/相对音量升高 (Unmute/Relative Volume Up) | M (必需) | 变更计数器 (Change_Counter) |
| 0x04 | 设置绝对音量 (Set Absolute Volume) | M (必需) | 变更计数器 (Change_Counter), 音量设置 (Volume_Setting) |
| 0x05 | 取消静音 (Unmute) | M (必需) | 变更计数器 (Change_Counter) |
| 0x06 | 静音 (Mute) | M (必需) | 变更计数器 (Change_Counter) |

a. 相对音量降低

如果向音量控制点写入"相对音量降低"操作码,并且所携带的变更计数器操作数与音量状态特征值中的变更计数器字段相匹配,则服务器应通过以下公式降低音量设置字段的值:

音量设置 = max(音量设置 - 步进值, 0)

若该"相对音量降低"操作导致音量设置字段的值发生改变,则服务器应将变更计数器字段递增,并通知客户端新的音量状态特征值。

"相对音量降低"操作不应影响静音字段的值。

用于执行"相对音量降低"操作的音量控制点特征值应按照表所列的格式进行设置。

b. 相对音量升高操作

如果向音量控制点写入"相对音量升高"操作码,并且所携带的变更计数器操作数与音量状态特征值中的变更计数器字段相匹配,则服务器应通过以下公式提高音量设置字段的值:

音量设置 = min(音量设置 + 步进值, 255)

若该"相对音量升高"操作导致音量设置字段的值发生改变,则服务器应将变更计数器字段递增,并通知客户端新的音量状态特征值。

"相对音量升高"操作不应影响静音字段的值。

用于执行"相对音量升高"操作的音量控制点特征值应按照表所列的格式进行设置。

c. 取消静音/相对音量降低操作

如果向音量控制点写入"取消静音/相对音量降低"操作码,并且所携带的变更计数器操作数与音量状态特征值中的变更计数器字段相匹配,则服务器应通过以下公式降低音量设置字段的值:

音量设置 = max(音量设置 -- 步进值, 0)

同时,服务器应将静音字段的值设为"未静音"。若此"取消静音/相对音量降低"操作导致音量设置字段或静音字段的值发生改变,服务器应将变更计数器字段的值递增,并通知客户端新的音量状态特征值。

用于执行"取消静音/相对音量降低"操作的音量控制点特征值应按照表所列的格式进行设置。

d. 取消静音/相对音量升高操作

若向音量控制点写入"取消静音/相对音量升高"操作码,且所附变更计数器操作数与音量状态特征值中的变更计数器字段相匹配,则服务器应通过以下公式增加音量设置字段的值:

音量设置 = min(音量设置 + 步进值, 255)

同时,服务器应将静音字段的值设为"未静音"。若此"取消静音/相对音量升高"操作导致音量设置字段或静音字段的值发生改变,服务器应递增变更计数器字段的值,并将新的音量状态特征值通知客户端。

用于执行"取消静音/相对音量升高"操作的音量控制点特征值应按照表所列的格式进行设置。

e. 设置绝对音量操作

若向音量控制点写入"设置绝对音量"操作码,且所附变更计数器操作数与音量状态特征值中的变更计数器字段相匹配,则服务器应将音量设置字段的值设为所附音量设置操作数的值。

若此"设置绝对音量"操作导致音量设置字段的值发生改变,服务器应将新的音量状态值通知客户端。

"设置绝对音量"操作不得影响静音字段的值。

用于执行"设置绝对音量"操作的音量控制点特征值应按照表所列的格式进行设置。

f. 取消静音操作

若向音量控制点写入"取消静音"操作码,且所附变更计数器操作数与音量状态特征值中的变更计数器字段相匹配,则服务器应将静音字段的值设为"未静音"。

如果此取消静音操作导致静音字段的值发生变化,服务器应递增变更计数器字段的值,并将新的音量状态特征值通知客户端。

用于执行取消静音操作的音量控制点特征值应按照表所列的格式进行设置。

g. 静音操作

若向音量控制点写入"静音"操作码,且其附带的变更计数器操作数与音量状态特征值中的变更计数器字段相匹配,则服务器应将静音字段的值设为"已静音"。

如果此静音操作导致静音字段的值发生变化,服务器应递增变更计数器字段的值,并将新的音量状态特征值通知客户端。

用于执行静音操作的音量控制点特征值应按照表所列的格式进行设置。

3. Volume Flags

音量标志特征应设为一个反映音量控制服务 (VCS) 属性的值。

客户端可以读取音量标志特征值。如果服务器支持更改音量标志值,则服务器应支持该特征的通知功能。当音量标志值发生改变时,服务器应向已启用客户端特征配置描述符以接收通知的客户端发送新的值。

如果音量状态特征的音量设置字段值是一个初始值(例如服务器重置后的默认值),且未经用户更改修改,则"音量设置持久化"字段应设置为"重置音量设置"。用户更改包括通过客户端操作、服务器自身或其他任何方式对音量设置字段值的修改。如果服务器不支持更改音量标志特征值,则"音量设置持久化"字段应设置为"用户设置音量"。

当音量状态特征的音量设置字段值发生用户更改后,"音量设置持久化"字段应设置为"用户设置音量"。如果服务器被重置或断开连接,但仍保留了音量设置字段的值,则"音量设置持久化"字段应继续保持为"用户设置音量"。

音量标志特征值应遵循表所描述的格式。

|------------------------------------|----------------|------------------------------------------------------------------------------|
| 字段名称 (Field Name) | 位 (Bit(s)) | 取值 (Value) |
| 音量设置持久化 (Volume_Setting_Persisted) | 0 | 0x00 = 重置音量设置 (Reset Volume Setting) 0x01 = 用户设置音量 (User Set Volume Setting) |
| 保留将来使用 (RFU) | 1-7 | 0x00 |

相关推荐
Wireless_Link7 小时前
蓝牙低功耗音频 Le audio音量偏移控制协议(VOCS)剖析
ble audio·le audio·蓝牙低功耗音频·le audio vocs·volume offset