UAC(二)Spec-Requests
Standard Requests
音频设备类支持 USB 规范的第 9 节“USB 设备框架”中描述的标准请求。音频设备类对标准请求的值没有提出特定的要求。
Class-Specific Requests
特定于类的请求用于设置和获取与音频相关的控件。这些控制器主要分为两组:那些操纵音频功能的控制器,如音量,音调,选择器的位置等。以及那些影响等时终点上的数据传输的数据,比如当前的采样频率。
AudioControl Requests
对音频功能的控制是通过操作嵌入在音频功能的实体中的单个控件的属性来执行的。特定于类的音频控件接口描述符包含一组实体描述符,每个描述符指示实体中存在哪些控件。音频控制请求总是指向音频功能的单个音频控制接口。请求包含足够的信息(实体 ID、控制选择器和通道号),以便音频功能决定必须路由特定请求的位置。同样的请求布局也可用于特定于供应商的对扩展单元的请求。但是,本规范不包括它们
AudioStreaming Requests
对音频流接口的类特定行为的控制是通过操作接口控制或端点控制来执行的。它们可以是特定于类的(如本规范中定义的)或特定于供应商的。对于任何一种情况,都可以使用相同的请求布局。音频流请求被定向到控件所在的收件人。这可以是接口或它关联的等时端点。
音频设备类支持一个附加的特定于类的请求:
Memory Requests
音频功能中的每个可寻址实体(时钟实体、终端、单元、接口和端点)都可以公开一个内存映射接口,从而提供通用地操作实体的方法。特定于供应商的控制实现可以基于这种类型的请求。
原则上,所有的请求都是可选的。如果音频功能不支持某个请求,则必须通过在向该功能发出请求时停止控制管道来表明这一点。但是,如果支持某个集合请求,则也必须支持关联的 Get 请求。可以支持获取请求,而不支持关联的集合请求。如果支持中断,那么就必须实现所有必要的 Get 请求,这些请求需要从音频功能中检索适当的信息,以响应这些中断
Control Attributes
实体中的每个控件都可以具有一个或多个与其关联的属性。控件当前定义的属性包括:
- Current setting attribute (CUR)
- Range attribute (RANGE)
CUR 属性用于操作控件的当前实际设置。范围属性提供了关于控制对 CUR 的允许设置所施加的限制的信息属性。范围属性实际上是由一个子属性数组组成的。子属性为最小值(MIN)、最大值(MAX)和分辨率(RES)。它们总是以 [MIN,MAX,RES] 形式的三联体进行操作,不能单独访问或修改。范围属性支持这些三联体的数组,以便能够准确地报告一个控件的不连续的多个子范围。数组中的第一个元素包含控件所支持的子范围的数量。数组中的后续三联体元素对应于每个子范围。子范围必须按升序排列(从较低值到较高值)。单个子范围不能重叠(即前一个子集的最大值不能等于下一个子范围的最小值)。如果一个子集只包含一个值,则对应的三值组必须同时包含其 MIN 和 MAX 子属性的该值,并且 RES 子属性必须设置为零
例如,考虑一个(假设的)volume 控制,它可以为其 CUR 属性获取以下值:
- -∞ dB
- -70 dB to -40 dB in steps of 3 dB
- -40 dB to -20 dB in steps of 2 dB
- -20 dB to 0 dB in steps of 1 dB
范围属性的一个可能的布局是:
RANGE(0) = 3 RANGE(1) = [-70, -40, 3] RANGE(2) = [-38, -20, 2] RANGE(3) = [-19, 0, 1]
表示相同控件的另一种方法如下:
RANGE(0) = 3 RANGE(1) = [-70, -43, 3] RANGE(2) = [-40, -22, 2] RANGE(3) = [-20, 0, 1]
它是由设计者来选择一个合适的表示方式的。虽然可以将一个范围表示为构成该范围的离散值,但非常不鼓励使用这种表示。
Control Request Layout
音频设备类定义的请求布局严格遵循 USB 规范中定义的标准请求布局。该请求用于设置或获取音频功能的实体内的控件的属性。下表详细说明了请求的布局:
Bit D7 of the bmRequestType field specifies whether this is a Set request (D7 = 0b0) or a Get request
(D7 = 0b1). It is a class-specific request (D6..5 = 0b01), directed to either an interface (AudioControl or
AudioStreaming) of the audio function (D4..0 = 0b00001) or the isochronous endpoint of an
AudioStreaming interface (D4..0 = 0b00010).
bReset 字段包含一个常量,标识要操作的控件的哪个属性。控件的可能属性包括:
- Current setting attribute (CUR)
- Range attribute (RANGE)
如果寻址的控件不支持修改某个属性,则在尝试修改该属性时,控制管道必须指示失速。在大多数情况下,Set 请求只支持 CUR 属性。但是,此规范并不阻止设计者使范围属性可编程。有关请求常量的列表,请参见附录 A.14,“音频类别特定的请求代码”。
作为一般规则,当设置了一个属性值时,一个控件将自动将传递的值调整到最接近的可用有效值。这个值可以通过后续的获取控制请求来检索。
上面这个规则的唯一例外是复制保护控制。当复制保护控制不能准确地满足“设置”请求时,控制管道必须指示一个 stall。
wValue 字段指定高字节中的控制选择器(CS),以及低字节中的通道号(CN)。控制选择器指示此请求正在操作的控制类型。通道号(CN)表示要影响集群的哪个逻辑通道。如果一个控制是通道独立的,则控制被认为是一个主控制,虚拟信道零被用来解决它(CN = 0)。如果请求为该单元指定了未知或不支持的 CS 或 CN,则控制管道必须指示 stall。
上面也有一个例外。如果混音器单元控制请求想要处理一个混音器控制,它将在高字节中指定 CS = MU_MIXER_CONTROL 为控制选择器,在低字节中指定混音器控制号(MCN)。
当请求处理接口(bmRequestType=0b00100001 或 10100001)中的实体时,wIndex 字段指定 Interface 由低字节和实体 ID(时钟实体 ID、单元 ID、终端 ID、编码器 ID 或解码器 ID)。要寻址接口本身,必须在高字节中指定一个为零的实体 ID。
当请求寻端点(bmRequestType=0b00100010 或 10100010)时,wIndex 字段指定 Endpoint 由低字节寻址,高字节为 0。
wIndex 中的值必须适用于 recipient。只能处理音频功能或音频流媒体接口中的现有实体,并且只能使用适当的接口或端点编号。如果请求指定了未知或非实体 ID 或未知的接口或端点编号,则控制管道必须指示 stall。
Set 请求的实际参数在控制传输的数据阶段中传递。参数块的长度在请求的 wLength 字段中表示。参数块的布局由 bRequest 和 wIndex 字段限定。有关所有可能的实体的参数块布局的详细描述,请参阅以下部分。
Get 请求的实际参数将在控制传输的数据阶段中返回。要返回的参数块的长度在请求的 wLength 字段中表示。如果参数块比 wLength 字段中指示的长度更长,则只返回参数块的初始字节。如果参数块小于 wLength 字段中所指示的值,则该设备在请求进一步的数据时,通过发送一个较短的数据包来表示控制传输的结束。参数块的布局由 bRequest 和 wIndex 字段限定。有关所有可能的实体的参数块布局的详细描述,请参阅以下部分。
Control Request Parameter Block Layout
除了少数例外情况外,几乎所有的控制请求在集合或获取请求期间都操作单个控制参数。对于这些请求,可能的参数块布局可以分为三类,这取决于控件的 CUR 属性的字节大小。一个 CUR 属性的大小可以是一个 1Byte 一个 word(2 字节)或一个 double word(4 字节)。以下段落指定了这三个类别的 CUR 和范围参数块的布局
对于那些使用偏差参数块布局的请求,实际布局将在相关部分中明确定义
Layout 1 Parameter Block
控件的 1 字节大小的 CUR 属性的参数块如下:
该控件的范围属性的关联参数块如下:
Layout 2 Parameter Block
控件的 2 字节大小的 CUR 属性的参数块如下:
该控件的范围属性的关联参数块如下:
Layout 3 Parameter Block
控件的 4 字节大小的 CUR 属性的参数块如下:
该控件的范围属性的关联参数块如下:
Common Controls
以下部分描述了一些可以出现在多个实体类型中的控件。这里只对它们进行了描述一次,并且为所有可以包含任何这些控件的实体提供了对这些控件描述的引用
Enable Control
启用控件用于启用实体的功能或完全绕过该实体。在后一种情况下,将假定为默认行为。启用控件必须只有 CUR 属性。“启用控件 CUR”属性的值可以为 TRUE 或 FALSE。“控制选择器”字段必须设置为 XX_ENABLE_CONTROL(其中 XX 必须由特定实体的适当的双字母缩写替换),并且“通道号”字段必须设置为零(主控制)。此控制请求的参数块使用布局 1(参见第 5.2.3.1 节,“布局 1 参数块”)。
Mode Select Control
模式选择控件用于更改实体的行为。模式选择控件必须只有 CUR 属性。CUR 属性的有效范围是从 1 到实体支持的模式数(通过实体描述符的 bNrModes 字段报告)。“控制选择器”字段必须设置为 XX_MODE_SELECT_CONTROL(其中 XX 必须由特定实体的适当的双字母缩写替换),并且“通道号”字段必须设置为零(主控制)。此控制请求的参数块使用布局 1(参见第 5.2.3.1 节,“布局 1 参数块”)。
Cluster Control
集群控制用于从实体中检索当前的逻辑音频通道集群描述符。此控件仅支持 Get 请求(只读)。集群控件必须只有 CUR 属性。CUR 属性返回一个描述符,它按照第 4.1 节“音频通道集群描述符”中定义的格式化。“控制选择器”字段必须设置为 XX_CLUSTER_CONTROL(其中 XX 必须由特定实体的适当的双字母缩写替换),并且“通道号”字段必须设置为零(主控制)。群集控制的 CUR 属性的参数块如下:
Underflow Control
Underflow Control 用于指示自上次获取 Underflow 请求以来在实体中出现的计算 Underflow 情况。当试图为一个无符号变量赋值一个负值时,就会出现计算欠流。此控件仅支持 Get 请求(只读)。响应 Get 请求将返回 CUR 属性,然后清除其值。Underflow 控制必须只有 CUR 属性。Underflow 控制 CUR 属性的值必须为 TRUE(发生 Underflow 条件)或 false(正常)。控制选择器字段必须设置为 XX_UNDERFLOW_CONTROL(其中 XX 必须由特定实体的适当的双字母缩写替换),并且“通道号”字段表示所需的通道。此控制请求的参数块使用布局 1(参见第 5.2.3.1 节,“布局 1 参数块”)。
Overflow Control
溢出控制用于指示自上次获取溢出请求以来在实体内出现的计算溢出情况。当一个值太正或太负,在有符号计算后无法表示,以及当它在无符号计算后表示得太正时,就会发生计算溢出。此控件仅支持 Get 请求(只读)。响应 Get 请求将返回 CUR 属性,然后清除其值。溢出控制必须只有 CUR 属性。溢出控制 CUR 属性的值必须为 TRUE(发生溢出情况)或 false(正常)。
Encoder Error Control
编码器错误控制用于指示自上一次获取编码器错误请求以来,编码器中是否存在一个错误条件。此控件仅支持 Get 请求(只读)。响应 Get 请求将返回 CUR 属性,然后清除其值。编码器错误控制必须只有 CUR 属性。CUR 属性的设置范围可以从-32768(0x8000)到 32767(0x7FFF),步骤为 1(0x0001)。值 0 表示不存在错误的情况。所有其他值都表明存在一个错误条件。
本规范定义了许多可能出现的错误代码。表 5-9“错误代码”列举了错误代码及其说明。
Decoder Error Control
解码器错误控制用于指示自上一次获取解码器错误请求以来,解码器中存在的错误条件。此控件仅支持 Get 请求(只读)。响应 Get 请求将返回 CUR 属性,然后清除其值。解码器错误控制必须只有 CUR 属性。CUR 属性的设置范围可以从-32768(0x8000)到 32767(0x7FFF),步骤为 1(0x0001)。值 0 表示不存在错误的情况。所有其他值都表明存在一个错误条件。本规范定义了许多可能出现的错误代码。表 5-9“错误代码”列举了错误代码及其说明。控制选择器字段必须设置为 XX_DECODER_ERROR_CONTROL(其中 XX 必须由特定实体的适当的双字母缩写替换),并且“通道号”字段必须设置为零(主控制)。此控制请求的参数块使用布局 2(参见第 5.2.3.2 节,“布局 2 参数块”)。
Latency Control
音频功能必须不支持此控制(特定类音频控制接口描述符的 bm 控制字段中的 D1..0=0b00)或支持音频功能内的每个终端和单元的只读控制(特定类音频控制接口描述符的 bm 控制字段中的 D1..0=0b01)。终端延迟必须包括由 A/D 或 D/A 转换器、编码器、解码器等引起的所有延迟。延迟控制用于准确报告被址实体产生的以纳秒表示的延迟。此控件仅支持 Get 请求(只读)。延迟控件必须只有 CUR 属性。CUR 属性的设置范围可以从 0 ns(0x00000000)到 4,294,967,295ns(0x FFFFFFFF),步骤为 1 ns(0x00000001)。“控制选择器”字段必须设置为 XX_LATENCY_CONTROL(其中 XX 必须由特定实体的适当的双字母缩写替换),并且“通道号”字段必须设置为零(主控制)。此控制请求的参数块使用布局 3(参见第 5.2.3.3 节,“布局 3 参数块”)。
AudioControl Requests
以下部分描述了可用于操作音频功能通过其实体公开的音频控制的可能请求。集合和 Get 请求都使用相同的参数块布局。
Clock Source Control Request
此请求用于操作音频功能的时钟源实体内的控件。请求的确切布局在第 5.2.2 节“控制请求布局”中定义。以下各段详细描述了时钟源实体可以合并的所有可能的控制项。对于每个控件,都指定受支持的属性及其值范围。此外,还列出了适当的控制选择器值和参数块的布局类型。控制选择器代码在附录 A.17.1,“时钟源控制选择器”中定义。
Sampling Frequency Control
采样频率控制用于操纵由时钟源实体产生的时钟信号的实际采样频率。采样频率控制必须支持 CUR 和范围(MIN、MAX、RES)属性。CUR、MIN、MAX 和 RES 属性的设置范围可以从 0Hz(0x000000000)到 4,294,967,295Hz(0x FFFFFFFF),步骤为 1 Hz(0x00000001)。注:可以使用 5.2.1 节“控制属性”中解释的方法的离散列表来表示。在许多情况下,时钟源实体表示一个基于单一固定频率的晶体振荡器的发生器。在这种情况下,不支持设置请求。控制选择器字段必须设置为 CS_SAM_FREQ_CONTROL,通道号字段必须设置为零(主控制)。此控制请求的参数块使用布局 3(参见第 5.2.3.3.3 节“布局 3 参数块”)
Clock Validity Control
时钟有效性控制用于指示由时钟源实体产生的时钟信号是否有效(稳定和可靠)。此控件只支持 Get 请求。时钟有效性控制必须只有 CUR 属性。时钟有效性控制 CUR 属性的值必须为 TRUE(时钟有效)或 false(时钟无效)。控制选择器字段必须设置为 CS_CLOCK_VALID_CONTROL,通道号字段必须设置为零(主控制)。此控制请求的参数块使用布局 1(参见第 5.2.3.1 节,“布局 1 参数块”)。
Clock Selector Control Request
此请求用于操作音频功能的时钟选择器实体内的控制。请求的确切布局在第 5.2.2 节“控制请求布局”中定义。以下段落详细描述了时钟选择器实体可以合并的所有可能的控制项。对于每个控件,都指定了受支持的属性及其值范围。此外,还列出了适当的控制选择器值和参数块的布局类型。控制选择器代码在附录 A.17.2,“时钟选择器控制选择器”中都有定义。
- Clock Selector Control
- Clock Multiplier Control Request
- Numerator Control
- Denominator Control
Terminal Control Request
此请求用于操作音频功能的终端内的控件。请求的确切布局在第 5.2.2 节“控制请求布局”中定义。以下各段详细描述了终端可以包含的所有可能的控制件。对于每个控件,都指定了受支持的属性及其值范围。此外,还列出了适当的控制选择器值和参数块的布局类型。控制选择器代码的定义见附录 A.17.4,“终端控制选择器”
…
Feature Unit Control Request
此请求用于操作音频功能的特征单元内的控制。请求的确切布局在第 5.2.2 节“控制请求布局”中定义。以下各段详细描述了特性单元可以合并的所有可能的控制件。对于每个控件,都指定了受支持的属性及其值范围。此外,还列出了适当的控制选择器值和参数块的布局类型。控制选择器代码的定义见附录 A.17.7,“特征单元控制选择器。
Mute Control
静音控件是功能单元的构建模块之一。静音控件必须只有 CUR 属性。“静音控件 CUR”属性的值必须为 TRUE(静音)或 false(非静音)。通过设置/获取特征单元内的特定静音控制请求的单元 ID 和通道号字段进行处理。通道号字段的有效范围是从零(“主”通道)到音频通道集群中的逻辑通道数目。控制选择器字段必须设置为 FU_MUTE_CONTROL,并且通道号字段指示所需的通道。此控制请求的参数块使用布局 1(参见第 5.2.3.1 节,“布局 1 参数块”)。
Volume Control
音量控制是功能单元的构建模块之一。volume 控制必须支持 CUR 和范围(MIN、MAX、RES)属性。CUR、MIN 和 MAX 属性的设置范围可以从+127.9961 dB(0x7FFF)到-127.9961 dB(0x8001),步骤为 1/256 dB 或 0.00390625 dB(0x0001)。RES 属性的设置只能为正值,且范围从 1/256 dB(0x0001)到+127.9961 dB(0x7FFF)。此外,必须始终实现表示沉默(即-∞dB)的代码 0x8000。但是,永远不能将其报告为 MIN 属性值。
通过设置/获取特征单元控制请求中的单元 ID 和通道号字段来处理特征单元内的特定卷控制。通道号字段的有效范围是从零(“主”通道)到音频通道集群中的逻辑通道数目。控制选择器字段必须设置为 FU_VOLUME_CONTROL,“通道号”字段指示所需的通道。此控制请求的参数块使用布局 2(参见第 5.2.3.2 节,“布局 2 参数块”)。
参考文献
《USB2.0 协议规范》
《UAC2 协议规范》