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

快速配置USB Audio功能

XMOS的USB Audio软件框架拥有独特的配置方式。XMOS将最常用的配置集中到一处,简单修改宏定义,您就可以改变XMOS的软件功能。

通过配置xua_conf.h.xn,用户不需要深入代码,也能够修改采样率、通道数以及USB描述符等功能,并快速生成固件。

xua_conf.h包含哪些定义?

我们将最常用的UAC参数配置放在了xua_conf.h中,您只需要了解这些宏定义的含义,并根据需求修改它们的值。

这些定义大致可以分为几类:

关于每一种功能的详细说明,您可以查阅配置与选项以了解全部的可配置功能。有关每个可配置宏的默认值的准确参考,您可以在xua_conf_default.h API中获得更多细节信息。

音频接口与功能定义

通过修改宏定义的值,用户可以改变通道数、开关音频接口。对于功能开关,通常1是打开,0是关闭。

简单的例子:

#define MIDI 		       (1) // 开启:1,关闭:0
#define I2S_CHANS_DAC (2) // 通道数:2
#define I2S_CHANS_ADC (2) // 通道数:2

在这里,我们开启了MIDI功能,并将与XMOS连接的ADC、DAC的通道数设置为2。同时,我们需要配置XN文件,以定义这些功能的硬件接口:

<Tile Number="0" Reference="tile[0]">
<!-- I2S -->
<Port Location="XS1_PORT_1A" Name="PORT_MCLK_IN"/>
<Port Location="XS1_PORT_1B" Name="PORT_I2S_LRCLK"/>
<Port Location="XS1_PORT_1C" Name="PORT_I2S_BCLK"/>
<Port Location="XS1_PORT_1D" Name="PORT_I2S_DAC0"/>
<Port Location="XS1_PORT_1F" Name="PORT_I2S_ADC0"/>
<!-- MIDI -->
<Port Location="XS1_PORT_1B" Name="PORT_MIDI_IN"/>
<Port Location="XS1_PORT_1A" Name="PORT_MIDI_OUT"/>
</Tile>

我们需要定义MIDI的I/O引脚,并为I2S定义时钟以及I/O引脚。需要注意的是,所有与I2S相关的端口都必须是1位端口。

算法与配置

您可以通过宏开关一些DSP功能,例如混音器,并配置他们的重要参数。

简单的例子:

#define MIXER              (1) // 开启:1,关闭:0
#define MAX_MIX_COUNT (8) // 最大混音数:8
#define FAST_MIXER (0) // 开启:1,关闭:0

在这里,我们开启了混音器,并将混音器的数量设置为8,混音器没有I/O,它会将根据当前采样率自动处理混音。

USB音频配置

通过修改宏定义的值,您可以更改音频采样率,USB设备VID/PID,设备名:

#define MCLK_441           (512*44100)					// 音频主时钟:22.5792MHz
#define MCLK_48 (512*48000) // 音频主时钟:24.576MHz
#define MAX_FREQ (192000) // 最大采样率:192kHz
#define MIN_FREQ (48000) // 最小采样率:48kHz
#define VENDOR_STR "Pawpaw" // 制造商字符串:Pawpaw
#define PRODUCT_STR_A2 "Pawpaw UAC Device (UAC2.0)" // 产品字符串(UAC2):Pawpaw UAC Device (UAC2.0)
#define PRODUCT_STR_A1 "Pawpaw UAC Device (UAC1.0)" // 产品字符串(UAC1):Pawpaw UAC Device (UAC1.0)

当您使用了独立的音频时钟时,您需要根据时钟频率,配置MCLK_441MCLK_48。通过修改MAX_FREQMIN_FREQ的值,可以定义音频采样率的上下限,这会改变主机在枚举时计入的采样率可选项。

其他常用定义

#define AUDIO_IO_TILE      (0) //音频的I/O所在的tile标签
#define XUD_TILE (0) //XUD所在的tile标签

当定义AUDIO_IO_TILE为0时,I2S的主要处理线程在对应的tile[0]上。同理,这里定义了USB的处理线程也在tile[0]上。

此时也需要配置XN文件,以定义这些功能的硬件接口。