快速配置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_441与MCLK_48。通过修改MAX_FREQ和MIN_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文件,以定义这些功能的硬件接口。