Skip to main content
欢迎来到PAWPAW技术文档网站了解更多信息

特性与选项 - USB Audio

本节中,会介绍USB音频设计的一些可用功能。

4.1 设备固件升级(DFU)

DFU接口处理对设备的启动镜像(boot image)的更新。DFU代码是由端点0核心调用的。

该接口将USB连接到XMOS闪存用户库(见XM-000953-PC)。在应用模式下,DFU可以接受命令以将设备复位到DFU模式。有两种方法可以做到这一点:

  • 主机可以发送一个DETACH请求,然后重置设备。如果设备在指定的超时时间内被主机重置,它将在DFU模式下启动(这最初被设置为一秒钟,可由主机配置)。

  • 主机可用发送一个自定义的用户指令XMOS_DFU_RESETDEVICE给DFU接口,这会立刻将设备重置到DFU模式下。

一旦设备处于DFU模式,DFU接口就可以接受由DFU 1.1类规范定义的指令。此外,该接口还接受自定义命令XMOS_DFU_REVERTFACTORY,将激活的启动镜像恢复到工厂镜像。请注意,XMOS特定的命令请求标识符在module_dfudfu_types.h中定义。

4.2 USB Audio类支持的版本

XMOS USB Audio框架支持USB Audio 1.0以及USB Audio 2.0。

USB Audio Class 2.0比USB音频类1.0有许多改进,最引人注目的是完全支持高速(high-speed)操作。这意味着音频类设备不再局限于全速(full-speed)运行,允许更大的通道数、采样频率和采样比特深度。还有其他的改进包括:

  • 增加了对多时钟域、时钟描述和时钟控制的支持
  • 广泛支持了中断,以通知主机不同实体的动态变化,比如时钟等变化

4.2.1 驱动支持

4.2.1.1 Audio Class 1.0

Apple OSX 已经完全支持Audio Class 1.0。现代的Microsoft Windows操作系统(如Windows XP及以后版本)也完全支持Audio Class 1.0。

4.2.1.2 Audio Class 2.0

Apple OSX 自版本10.6.4以后已经完全支持Audio Class 2.0。但Windows操作系统并不原生支持Audio Class 2.0,因此需要安装一个驱动。Windows驱动程序的文档超出了本文件的范围,请联系XMOS以了解更多细节。

注意

现阶段XMOS自身并不开发相关的UAC2.0驱动,如您需要UAC2.0驱动或者需要进行USB DFU更新,需要向为XMOS设备提供音频驱动的开发商申请购买,例如Thesycon。另外,MacOS与Linus系系统不需要驱动。

4.2.2 Audio Class 1.0模式和回落(Fall-back)

XMOS USB音频应用的正常默认状态是以高速(high-speed)Audio Class 2.0设备的形式运行。然而,有些产品可能倾向以Audio Class 1.0模式运行,这通常是为了在Windows操作系统中实现 "免驱 "操作。

注意

为了确保符合规范,Audio Class 1.0总是运行在全速(full-speed)USB模式下。

如果下列选项之一为真,那么设备会在全速Audio Class 1.0模式下运行:

  • 工程代码仅针对USB Audio Class 1.0进行编译
  • 工程代码是针对USB Audio Class2.0编译的,但设备通过全速(full-speed)链路与主机连接(前提是已启用Audio Class回落功能)

控制这种行为的选项详见usb_audio_sec_custom_defines_api。当在音频类1.0模式下运行时,会有以下限制:

  • MIDI被禁用
  • DFU被禁用(因为Windows操作系统会提示需要安装DFU驱动)

因为全速USB的带宽限制,下列采样率限制也会被应用:

  • 当输入和输出同时启用时,采样率会被限制在最高48kHz
  • 当输入和输出中仅有一者被启用时,采样率会被限制在最高96kHz

4.3 通过人体学接口设备(HID)进行音频控制

设计电路支持简单的音频控制,例如播放/暂停,音量加/减,例如通过USB HID类规范。

通过将HID_CONTROLS定义设置为1来启用该功能,设置为0则禁用该功能。

当该功能打开时,下面的选项将会被启用:

  1. 在配置描述符中启用HID描述符,通知主机该设备有HID接口
  2. 在端点0中启用了获取报告描述符的请求
  3. 在缓冲区核心中启用了端点数据处理

在端点0中启用的Get Descriptor Request返回HID设备的报告描述符。它详细说明了从设备返回给主机的HID报告的格式。它也将报告中的每一个bit映射到一个函数(或功能),例如播放/暂停。

USB Audio框架实现了一个报告描述符,这个描述符应当兼容大多数基本的音频设备控制。如果需要进一步的控制,应当修改descriptors.h中的HID报告描述符。默认的报告大小为一个byte,格式如下:

Default HID Report Format

图28:默认的HID报告格式

在主机发出的每个HID报告请求中,函数Vendor_ReadHidButtons(unsigned char h)被从buffer()调用。这个函数通过引用传递一个数组hidData[]。程序员应当把他的按钮状态报告给这个数组。例如,如果需要增大音量,则bit 3应当被置为1,否则为0。

因为函数Vendor_ReadHidButtons()是从buffer逻辑核心调用的,需要注意的是不要给这个函数增加过多的执行时间,因为这会导致为其他端点服务时出现问题。

需要添加链接

如果需要一个完整的例子,请看**§6.1**的HID选择

4.4 Apple MFi兼容性

XMOS设备能够与支持USB主机的苹果iPod、iPhone和iPad设备一起运行。有关该功能的信息受Made For iPod(MFi)计划和相关许可的保护。

请联系XMOS以了解详情以及获取进一步的文件。

4.5 音频流格式

当前的设计支持多达三种不同的音频格式用于输出/播放,也可在(设备)运行时选择。这是通过使用音频流接口中备用的设置实现的。

一个音频流接口可以存在备用设置,可用于改变接口和底层端点的某些特性。替代设置的一个典型用途是提供一种方法来改变激活的音频流接口上的子帧大小和/或通道数量。只要音频流接口需要一个异步数据端点,就必须至少提供默认的备用设置(备用setting 0),带宽要求为零(没有定义异步数据端点),并提供一个包含实际异步数据端点的额外备用设置。

更多信息请参考USB音频设备类定义的3.16.2

注意,一个0带宽的备用setting 0总是被设计所牵制(按照USB规范的要求)。

替代设置的可定制参数如下:

  • 音频样本解析
  • 音频样本子槽大小
  • 音频数据格式
提示

名词解释:

  • 音频流(Audio Stream):一个音频槽集合(数量上可能非常大)的串联,按照升序时间排列
  • 音频槽(Audio Slot):一个音频子槽的集合,每个子槽包含一个不同物理音频通道的PCM音频样本,在同一时间段内拍摄。例如立体声,每个音频槽包含两个音频子槽,因为它是双声道的
  • 音频子槽(Audio Subslot):存放一个单独的PCM音频样本

关于本节的详细内容,请参考USB官方文档音频数据格式的USB2.0设备类定义

警告

目前只支持单一格式的输入/记录流

4.5.1 音频子插槽

一个音频子槽容纳一个音频样本。完整的细节见USB设备类定义中的音频数据格式。这由设备描述符中的bSubslotSize表示。

一个音频子槽总是包含一个整数大小的字节。该规范将可能的音频子槽大小(bSubslotSize)限制为每个音频子槽1、2、3或4字节。 通常情况下,由于它是在32位机器上运行的,所以子槽的值为4,这意味着打包/解包样本是非常小的。其他值也可以使用(目前的设计支持4、3和2)。

出于以下原因,可以使用其他值:

  • 总线带宽需要得到有效的利用时。例如,在全速(full-speed)运行中最大限度地提高通道数/采样率。
  • 为了支持某些主机的限制。例如,许多基于Android的主机只支持2字节子插槽的16位采样。

bSubSlot的大小是通过以下定义设置的:

  • 当运行在high-speed时:
    • HS_STREAM_FORMAT_OUTPUT_1_SUBSLOT_BYTES
    • HS_STREAM_FORMAT_OUTPUT_2_SUBSLOT_BYTES
    • HS_STREAM_FORMAT_OUTPUT_3_SUBSLOT_BYTES
  • 当运行在full-speed时:
    • FS_STREAM_FORMAT_OUTPUT_1_SUBSLOT_BYTES
    • FS_STREAM_FORMAT_OUTPUT_2_SUBSLOT_BYTES
    • FS_STREAM_FORMAT_OUTPUT_3_SUBSLOT_BYTES

4.5.2 音频样本解析

一个音频样本使用的比特数(bBitResolution)小于或等于音频子槽中可用的总比特数,即bBitResolution<= bSubslotSize * 8。支持的值是16、24和32。

下面是一些定义:

  • 下列定义会影响high-speed下的操作:
    • HS_STREAM_FORMAT_OUTPUT_1_RESOLUTION_BITS
    • HS_STREAM_FORMAT_OUTPUT_2_RESOLUTION_BITS
    • HS_STREAM_FORMAT_OUTPUT_3_RESOLUTION_BITS
  • 下列定义会影响full-speed下的操作:
    • FS_STREAM_FORMAT_OUTPUT_1_RESOLUTION_BITS
    • FS_STREAM_FORMAT_OUTPUT_2_RESOLUTION_BITS
    • FS_STREAM_FORMAT_OUTPUT_3_RESOLUTION_BITS

4.5.3 音频格式

当前设计支持两种音频格式,分别是PCM以及直接比特流数字编码(DSD)。后者需要一个具有DSD功能的DAC。

USB音频原始数据格式是用来表示DSD数据的(USB设备类定义的音频数据格式的2.3.1.7.5)。这种在替代设置中使用RAW/DSD格式的做法被称为Native DSD 下面的定义对full-speed和high-speed操作都有影响:

  • STREAM_FORMAT_OUTPUT_1_DATAFORMAT
  • STREAM_FORMAT_OUTPUT_2_DATAFORMAT
  • STREAM_FORMAT_OUTPUT_3_DATAFORMAT

同时支持以下选项:

  • UAC_FORMAT_TYPEI_RAW_DATA
  • UAC_FORMAT_TYPEI_PCM
important

目前DSD仅在输出/播放流上支持

important

RAW/DSD格式需要4个字节的插槽大小,分辨率为32位 原生DSD需要驱动支持,在Thesycon Windows驱动中通过ASIO提供

4.6 以PCM格式传输DSD (DoP)

虽然在Windows中,可以通过驱动程序提供本地的DSD支持,但OSX中仅集成了支持PCM的USB驱动程序,中央音频引擎CoreAudio也是如此。因此,上面定义的方案无法用于OSX内置驱动程序。

由于Apple OS仅允许传输PCM,因此产生了一种在PCM帧上传输DSD音频数据的方法。然后可以通过OSX原生的USB音频支持发送此数据。

XMOS USB音频设计采用 DoP Open Standard 1.1中所述的方法

标准DSD的采样大小为1位,采样率为2.8224MHz--这是标准CD采样率(PCM 44.1kHz)的64倍。这等同于与176.4kHz的16位PCM流相同的数据速率。

为了清楚地识别PCM流中何时包含DSD以及何时包含PCM,将一些头部标记bits添加到样本中。因此使用24位PCM流,最高有效字节用于DSD标记(交替使用0x05和0xFA标记)。

启用后,如果USB音频设计检测到这些样本正在不间断地运行(高于定义的阈值),则会切换到DSD模式,使用低16位作为DSD样本数据。当无法检测到DSD标头时,设计将退回到PCM模式。DOP检测和切换完全在音频/I2S内核(Audio.xc)中完成。所有的其他代码会将音频样本作为PCM处理。

该设计支持更高的DSD/DoP速率(即DSD128),只需将基础PCM采样率从176.4kHz提高到352.8kHz即可。无论速率如何,标记字节方案都保持完全相同。

重要

DOP需要bits-perfect的传输--因此任何的音频/音量处理都会中断流。