UAC(三)Spec-Interrupt

Interrupts

中断用于通知 host 音频功能的当前状态发生了变化。本规范目前定义了两种不同类型的中断:

  • Memory Change: 某些内部实体的内存位置已更新。可以通知主机软件,以便采取适当的行动。
  • Control Change: 音频函数内部的某些可寻址控件更改了其一个或多个属性值

时钟实体、单元或终端内部的音频控件可以是中断的源。同样,AudioControl 接口中的任何可寻址 Control 或任何 AudioStreaming 接口都可以生成中断。最后所有与音频端点相关的可寻址控件都可能是中断的源。

音频功能的状态变化通常是由发生的特定事件引起的。事件可以是用户发起的,也可以是设备发起的。用户发起的插孔插入或移除是用户发起事件的典型示例。主机可以切换选择器或混音器,以便从刚刚插入的设备 (例如耳机)播放音频,并停止从当前设备(例如扬声器) 播放音频。设备启动事件的示例如下:一个外部设备 (例如 A/V 接收器可以在其光学数字输出上从 PCM 转换为 AC-3 编码数据,这取决于当前正在播放的材料如果此设备连接到具有自动检测功能的音频功能的光学数字输入,则该音频功能上的接口可能需要重新配置(例如,启动 AC-3 解码过程),这可能会导致所有其他接口的格式发生某些变化,甚至变得不可用。设备可以发出中断,让主机知道音频功能需要重新配置。

Interrupt Data Message

实际的中断类型(内存更改或控制更改)及其发起者通过中断端点发送的中断数据消息传递给主机。然后,主机负责通过获取内存请求或第 5.2 节“类特定请求”中定义的获取控制请求之一来查询音频功能,以获得关于中断原因的更详细信息。

中断被认为是“edge-triggered”类型,这意味着当事件发生时就会生成中断,但是 Host 不需要采取特定的操作来清除中断条件。当 Host 响应中断发出获取请求时,将返回控件属性的最新值。

中断数据消息的长度始终为 6 个字节。所有中断数据消息都需要第一个 bInfo 字段。它包含 D0 中的信息,表明这是特定于供应商的中断(D0 = 0b1)还是特定于类的中断(D0 = 0b0)。位 D1 表示中断是来自接口(D1 = 0b0)还是来自端点(D1 = 0b1)。bInfo 字段的位 D7..2 被保留为将来的扩展,并且必须设置为零。对于特定于供应商的中断,将不会对中断消息的其余部分的布局进行定义。对于特定于类的中断,其布局定义如下。

当中断来自接口中的实体(bInfo 字段中的 D1=0b0)时,wIndex 字段指定低字节和实体 ID(时钟实体 ID、单元 ID、终端 ID、编码器 ID 或解码器 ID)中的接口。为了指示接口本身,必须在高字节中指定实体 ID。

当中断来自一个端点(bInfo 字段中的 D1=0b1)时,wIndex 字段指定要以低字节处理的端点和以高字节处理的零端点。

wValue 字段的解释由 wIndex 字段中的值限定。wValue 字段的布局根据地址的实体而变化。对于每个支持的 Gat value 控制请求,wValue 字段遵循第 5 节“请求”中概述的完全相同的规则。wValue 字段返回高字节中的控制选择器(CS)和低字节中的通道号(CN)。控制选择器和通道号(CN)一起准确地指示哪个控制产生中断的。如果一个控制是通道独立的,则控制被认为是一个主控制,并返回虚拟信道零以指示它(CN = 0)。

上面有两个例外。第一个是当混合器单元控制请求返回高字节中的 CS = MU_MIXER_CONTROL 时。然后以低字节返回混合器控制号(MCN)。第二个是内存请求,其中 wValue 字段指定一个基于零的偏移值,该值表示生成中断的实体的内存空间中的位置的地址。如果偏移值为零,则表示多个内存位置可能发生了更改,需要检查整个内存空间

bAttribute 字段包含一个常量,用来标识被寻址的控件或实体的哪个属性导致了中断。可能的属性包括:

  • Current setting attribute (CUR)
  • Range attribute (RANGE)
  • Memory space attribute (MEM)

当没有挂起的中断时,中断端点在轮询时必须为 NAK。下表指定了当 D0 = 0b0 时,中断消息的格式:

Interrupt Sources

音频功能的可寻址实体内的任何控制都可以是中断的源。中断消息包含足够的信息来确定究竟是哪个控制导致了中断。然后,主机可以发出正常的控制请求,以进一步确定中断的原因。

参考文献

《USB2.0 协议规范》
《UAC2 协议规范》