一. 概念
1. 概念
AICS(Audio Input Control Service)使设备能够公开音频输入的控制和状态.
该配置文件定义了两个角色:音量渲染器 角色和音量控制器角色。
音量渲染器(Volume Renderer) 是接收一个或多个音频输入并对音频输出设备进行控制的设备。
**音量控制器(Volume Controller)**是控制此音频的音量及相关状态的设备。
- 音量渲染器应作为GATT服务器。
- 音量控制器应作为GATT客户端。
对应的关系如下:

其中Volume Controller对应设备的协议就是VCP(Volume Control Profile)协议
其中音频渲染器**(Volume Renderer)**设备包含VCS/AICS/VOCS协议,整个音频渲染器的架构如下:

AICS在整个LE audio的架构如下:

2. 特征属性
|-------------------------------------|--------|-----------------------|-------------------|----------|
| 特性名称 | 要求 | 必需属性 | 可选属性 | 安全权限 |
| 音频输入状态 (Audio Input State) | M | 读取 (Read) 通知 (Notify) | 无 | 需要加密 |
| 增益设置属性 (Gain Setting Properties) | M | 读取 (Read) | 无 | 需要加密 |
| 音频输入类型 (Audio Input Type) | M | 读取 (Read) | 无 | 需要加密 |
| 音频输入状态 (Audio Input Status) | M | 读取 (Read) 通知 (Notify) | 无 | 需要加密 |
| 音频输入控制点 (Audio Input Control Point) | M | 写入 (Write) | 无 | 需要加密 |
| 音频输入描述 (Audio Input Description) | M | 读取 (Read) 通知 (Notify) | 无响应写入 通知 (Notify) | 需要加密 |
其中AICS的primary service的UUID为

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

二. 特征介绍
在介绍这些属性之前,我们先来介绍一下基本的概念,因为下面好多属性会依赖于这些概念
1. 概念介绍
a. 增益设置字段(Gain_Setting field)
增益设置字段控制服务器所管理的单个音频输入(如蓝牙音频流或麦克风)的振幅。
增益设置字段是一个有符号值,其单次递增或递减应导致输入振幅相应增加或减少一个增益设置属性 特性值中"增益设置单位"字段所定义的值。增益设置值为0应表示不对输入的原始振幅进行改变。
增益设置字段以分贝为单位的精度和范围,由增益设置属性 特性值描述。增益设置值应小于或等于增益设置属性 特性值中的"增益设置最大值"字段,并大于或等于其"增益设置最小值"字段。
如果增益模式字段的值为"自动"或"仅自动",则增益设置字段不影响音频输入,服务器应忽略增益设置字段的值。
b. 静音字段
静音字段描述音频输入的静音状态。静音字段的值在表中描述。
|-----------------------|---------------|
| 静音字段 (Mute Field) | 值 (Value) |
| 未静音 (Not Muted) | 0 |
| 已静音 (Muted) | 1 |
| 已禁用 (Disabled) | 2 |
静音字段值代表服务器的音频状态,其中"未静音"表示音频未被静音,"已静音"表示音频被静音,"已禁用"表示静音命令已被禁用(例如,通过本地的物理隐私开关或其他方式)。
静音字段值不应影响增益设置字段的值;例如,将服务器静音不应导致增益设置字段的值变为增益设置最小值字段的值。
c. 增益模式字段
增益模式字段描述服务器是否自动设置音频输入的增益。该字段允许服务器公开对音频输入增益模式的控制。一个可选择增益模式控制的例子是,一个麦克风既可以通过自动增益控制自动调整其增益,也允许手动设置增益。
增益模式字段的值在如下表中
|------------------------------|---------------|
| 增益模式字段 (Gain_Mode Field) | 值 (Value) |
| 仅手动 (Manual Only) | 0 |
| 仅自动 (Automatic Only) | 1 |
| 手动 (Manual) | 2 |
| 自动 (Automatic) | 3 |
增益模式字段值代表服务器的增益调整功能。
值为"手动"或"仅手动"表示通过更改增益设置字段 来手动进行增益调整。值为"自动"或"仅自动"表示自动增益调整,此时忽略增益设置字段的值。
当增益模式字段的值为"仅自动"或"仅手动"时,服务器不支持更改增益模式字段。当增益模式字段的值为"自动"或"手动"时,服务器支持在增益模式字段的"自动"和"手动"值之间切换。
d. 变更计数器字段
每当增益设置 、静音 和增益模式 字段的值发生任何更改时,服务器应将变更计数器 字段的值递增一。变更计数器字段的值在所有音频输入控制点命令中都会用到。
服务器应将变更计数器字段初始化为一个任意值。该值应在0到255的范围内,且当递增后超过255时应回滚至0。
2. Audio Input State
音频输入状态特性应用于反映本服务所管理的音频输入的增益和静音状态。音频输入状态特性的值应使用表中描述的格式。

前面已经介绍了这4个概念,我们就不额外多做介绍了
3. Gain Setting Properties
增益设置属性 特性应设置为一个反映增益设置字段值的限制和单位的值。增益设置属性特性的值应使用表
|--------------------------------|--------------|-------------|
| 字段名称 (Field Name) | 大小 (Size,字节) | 格式 (Format) |
| 增益设置单位 (Gain_Setting_Units) | 1 | uint8 |
| 增益设置最小值 (Gain_Setting_Minimum) | 1 | int8 |
| 增益设置最大值 (Gain_Setting_Maximum) | 1 | int8 |
增益设置单位字段应设置为一个反映增益设置值单次递增或递减大小的值,其单位为0.1分贝
4. Audio Input Type
音频输入类型 特性应设置为一个反映此音频输入控制服务所描述的音频输入源的值。音频输入类型值的示例包括:本地、等时流、模拟连接器和数字连接器。特性用户描述可选地可以进一步描述音频输入类型,例如使用麦克风、HDMI等值。音频输入类型特性值的定义
|---------------|-------------------|----------------------|
| 值 (Value) | 标签 (Label) | 描述 (Description) |
| 0x00 | 未指定 (Unspecified) | 未指定的输入 |
| 0x01 | 蓝牙 (Bluetooth) | 蓝牙音频流 |
| 0x02 | 麦克风 (Microphone) | 麦克风 |
| 0x03 | 模拟 (Analog) | 模拟接口 |
| 0x04 | 数字 (Digital) | 数字接口 |
| 0x05 | 收音机 (Radio) | 调幅/调频/卫星广播等 |
| 0x06 | 流媒体 (Streaming) | 流媒体音频源 |
| 0x07 | 环境音 (Ambient) | 通透模式/直通 |
5. Audio Input Status
音频输入状态特性应设置为一个反映音频输入当前状态的值。音频输入状态是一个单字节值,其取值应为表中定义的非预留值之一
|----------------|---------------|
| 名称 (Name) | 值 (Value) |
| 未激活 (Inactive) | 0x00 |
| 已激活 (Active) | 0x01 |
| 预留待用 (RFU) | 0x02--0xFF |
6. Audio Input Control Point
音频输入控制点特性用于在向其写入一个值时,请求服务器执行特定的操作流程。
|----------|-------------------------------------|-----------|-------------------------------------------|
| 操作码值 | 操作码 (Opcode) | 操作码要求 | 操作数 (Operand) |
| 0x01 | 设置增益设置 (Set Gain Setting) | M | 变更计数器,增益设置 (Change_Counter, Gain_Setting) |
| 0x02 | 取消静音 (Unmute) | M | 变更计数器 (Change_Counter) |
| 0x03 | 静音 (Mute) | M | 变更计数器 (Change_Counter) |
| 0x04 | 设置为手动增益模式 (Set Manual Gain Mode) | M | 变更计数器 (Change_Counter) |
| 0x05 | 设置为自动增益模式 (Set Automatic Gain Mode) | M | 变更计数器 (Change_Counter) |
a. 设置增益设置流程
若向音频输入控制点写入"设置增益设置"操作码,且操作数"变更计数器"与音频输入状态特性值中的"变更计数器"字段相匹配,则当增益模式字段为"手动"或"仅手动"时,服务器应将"增益设置"字段值设置为操作数"增益设置"的值。若此操作导致"增益设置"字段值发生变化,服务器应按第3.1.5节所述,将新的音频输入状态值通知给客户端。
若操作数"增益设置"的值小于"增益设置最小值"字段值或大于"增益设置最大值"字段值,则服务器应返回一个ATT错误响应,其错误码为"值超出范围"。
"设置增益设置"流程不应影响"静音"字段的值。
用于"设置增益设置"流程的音频输入控制点特性值格式应符合表

b. 取消静音流程
若向音频输入控制点写入"取消静音"操作码,且操作数"变更计数器"与音频输入状态特性值中的"变更计数器"字段相匹配,同时"静音"字段值不为"已禁用",则服务器应将"静音"字段值设置为"未静音"。
若"静音"字段值为"已禁用",服务器应返回一个ATT错误响应,其错误码为表1.2所定义的"静音已禁用"。只有服务器本地的操作(例如拨动隐私开关)才能将该值从"已禁用"转换到其他状态。
若"取消静音"流程导致"静音"字段值发生变化,服务器应递增"变更计数器",并按第3.1.5节所述,将新的音频输入状态特性值通知给客户端。
用于"取消静音"流程的音频输入控制点特性值格式应符合表所列。

c. 静音流程
若向音频输入控制点写入"静音"操作码,且操作数"变更计数器"与音频输入状态特性值中的"变更计数器"字段相匹配,同时"静音"字段值不为"已禁用",则服务器应将"静音"字段值设置为"已静音"。
若"静音"字段值为"已禁用",服务器应返回一个ATT错误响应,其错误码为表1.2所定义的"静音已禁用"。只有服务器本地的操作(例如拨动隐私开关)才能将该值从"已禁用"转换到其他状态。
若"静音"流程导致"静音"字段值发生变化,服务器应递增"变更计数器"字段值,并按第3.1.5节所述,将新的音频输入状态特性值通知给客户端。
用于"静音"流程的音频输入控制点特性值格式应符合表3.8所列。

d. 设置为手动增益模式流程
若向音频输入控制点写入"设置为手动增益模式"操作码,且操作数"变更计数器"与音频输入状态特性值中的"变更计数器"字段相匹配,则当"增益模式"字段值为"自动"时,服务器应将其设置为"手动"。
若"增益模式"字段值为"仅自动"或"仅手动",服务器应返回一个ATT错误响应,其错误码为表1.2所定义的"增益模式更改不被允许"。
若"设置为手动增益模式"流程导致"增益模式"字段值发生变化,服务器应递增"变更计数器"字段值,并按第3.1.5节所述,将新的音频输入状态特性值通知给客户端。
用于"设置为手动增益模式"流程的音频输入控制点特性值格式应符合表所列。

e. 设置为自动增益模式流程
若向音频输入控制点写入"设置为自动增益模式"操作码,且操作数"变更计数器"与音频输入状态特性值中的"变更计数器"字段相匹配,则当"增益模式"字段值为"手动"时,服务器应将其设置为"自动"。
若"增益模式"字段值为"仅自动"或"仅手动",服务器应返回一个ATT错误响应,其错误码为表1.2所定义的"增益模式更改不被允许"。
若"设置为自动增益模式"流程导致"增益模式"字段值发生变化,服务器应递增"变更计数器"字段值,并按第3.1.5节所述,将新的音频输入状态特性值通知给客户端。
用于"设置为自动增益模式"流程的音频输入控制点特性值格式应符合表所列。

7. Audio Input Description
音频输入描述特性应设置为对此音频输入控制服务实例所描述的音频输入的说明。例如,如果设备为"蓝牙"和"线路输入"音频输入各实例化了一个服务,那么"音频输入描述"值在一个服务上应设置为"蓝牙",在另一个服务上应设置为"线路输入"。如果表示了多个蓝牙音频输入,服务器可将"音频输入描述"设置为远程源的名称、代表内容类型的字符串、内容控制服务器名称等。该特性值是一个零或多个字符的UTF-8字符串。