ALSA 声音采集播放程序说明


1.demo测试项描述

本demo可以测试Comake PI D1环境下的ALSA接口与场景,包括录音、播放、passthrough直连,AMIC/DMIC/I2S/ECHO测试,支持录音增益和播放音量设置。


2.编译环境说明

Note

一般默认板端已经打包好了相应程序,因此程序编译并非必须。你可以直接在板端 /customer/sample_code/audio_ai_ao_demo 文件夹中找到prog_audio_ai_ao_demo。如果你没有找到文件或有自己修改程序的需求,可参考如下步骤。

2.1、在project路径下根据板子(nand/nor,ddr型号等)选择deconfig进行整包编译;

例如Comake PI D1型号板子,设置工具链,使用emmc配置命令参考如下,其他板子参考具体型号的《环境搭建参考》。

export ARCH=arm
export CROSS_COMPILE=arm-unknown-linux-gnueabihf-12.4.0-
export PATH=$PATH:/tools/toolchain/riscv_gcc/bin/:/tools/toolchain/arm-unknown-linux-gcc-12.4.0-glibc-2.37-gnueabihf/bin
make dispcam_pcupid.emmc.glibc-12.4.0-arm-squashfs.comake.pi.d1.1024.dual_sensor.bga_ddr4_riscv_defconfig
make clean; make image -j16

2.2、进入 sdk\verify\sample_code 目录下,执行 :

make clean; make source/pcupid/audio/ai_ao_demo

将out目录中的可执行文件prog_audio_ai_ao_demo放到板子,/customer/sample_code/audio_ai_ao_demo路径上,修改权限777。


3.运行环境说明

Note

如果你下载使用的是我们提供的代码包且使用了例中的defconfig进行编译,那么以下dts配置不用自行修改,已默认配置完毕。

目前运行的板子型号为Comake PI D1

3.1、AMIC连接MIC0,MIC1,MIC2(如图中绿色框所示),扬声器连接SPK_L和SPK_L(如图中蓝色框所示);

3.2、线形4麦克风阵列的DMIC连接J8(如图中黑色框所示),padmux中配置(kernel/arch/arm/boot/dts/pcupid-comake-pi-d1-dual-sensor-padmux.dtsi)如下引脚,同时注释掉冲突的引脚:

#if 1
                // DMIC
                <PAD_GPIOA_14            PINMUX_FOR_DMIC_8CH_MODE_2       MDRV_PUSE_DMIC0_CLK>,
                <PAD_GPIOA_15            PINMUX_FOR_DMIC_8CH_MODE_2       MDRV_PUSE_DMIC0_D0>,
                <PAD_GPIOA_16            PINMUX_FOR_DMIC_8CH_MODE_2       MDRV_PUSE_DMIC0_D1>,
                <PAD_GPIOA_17            PINMUX_FOR_DMIC_8CH_MODE_2       MDRV_PUSE_DMIC0_D2>,
                <PAD_GPIOA_18            PINMUX_FOR_DMIC_8CH_MODE_2       MDRV_PUSE_DMIC0_D3>,
                // PM_IR
                <PAD_PM_ADC00_IN         PINMUX_FOR_PM_IR_IN_MODE_2       MDRV_PUSE_IR4>,
#endif

4.运行命令与结果说明

执行 cd /customer/sample_code/audio_ai_ao_demo 。到文件相应路径。

4.1、命令行使用格式:./prog_audio_ai_ao_demo [usecase] -i [interface] [options]

usecase和interface的可选对应关系如下表:

usecase interface
capture adc_a/adc_b/dmic/echo_rx/i2s_a_rx/i2s_b_rx/i2s_c_rx
playback dac/echo_tx/i2s_a_tx/i2s_b_tx/i2s_c_tx
passthrough adc_a-dac/adc_b-dac/echo_tx-echo_rx
pass_mix adc_a/adc_b-dac 的硬件混音,包含播放音频和AI-AO直连
pass_echo echo_tx-echo_rx 回声采集

options说明如下表:

options 含义 options 含义
-A 捕获音频的声卡序号 -F 捕获音频的文件保存路径,wav格式
-a 播放音频的声卡序号 -f 播放的音频路径,wav格式
-D 捕获音频的设备序号 -T 捕获音频的时长,单位秒
-d 播放设备序号 -t 播放音频的时长,单位秒
-C 捕获音频的通道数 -V 捕获音频的增益,百分比,0-100
-c 播放音频的通道数 -v 播放音频的音量,百分比,0-100
-R 捕获音频的采样率 -r 播放音频的采样率

4.2、举例说明:

//使用AMIC录音10秒, 录音增益设置60%, 音频保存在test.wav中
./prog_audio_ai_ao_demo capture -i adc_a -F test_amic.wav -A 0 -D 0 -R 8000 -C 1 -T 10 -V 60
//使用DMIC录音10秒, 录音增益设置60%, 音频保存在test.wav中
./prog_audio_ai_ao_demo capture -i dmic -F test_dmic.wav -A 0 -D 0 -R 8000 -C 1 -T 10 -V 60
//使用SPEAKER播放10秒音频, 音量设置40%
./prog_audio_ai_ao_demo playback -i dac -f ./test.wav -a 0 -d 0 -c 2 -t 10 -v 40
//passthrough AI硬件直连AO边录边播
./prog_audio_ai_ao_demo passthrough -i adc_a-dac -a 0 -d 0 -r 8000 -v 60 -A 0 -D 0 -R 8000 -V 60
//播放一段音频,开启echo采集扬声器回声,录音增益50%,播放音量40%,时长10s
./prog_audio_ai_ao_demo pass_echo -i echo_tx-echo_rx -f ./48K_16bit_STERO_30s.wav -F echorx.wav  -a 0 -d 0 -r 48000 -t 10 -v 40 -A 0 -D 0 -R 48000 -T 10 -C 2 -V 50
// ADC/DAC硬件混音,循环播放10秒钟音频,然后开启ADC-DAC的硬件直连
// 此时喇叭播放的声音中会包含AMIC输入和音乐,Ctrl+C退出
// t:音乐时长,demo会循环播放该片段直到退出
// v:音乐播放的音量,V:sidetone音量,控制passthrough的音量大小
./prog_audio_ai_ao_demo pass_mix -i adc_a-dac -f ./48K_16bit_STERO_30s.wav -a 0 -d 0 -r 48000 -t 10 -v 40 -A 0 -D 0 -R 48000 -V 50

5.关键代码实现说明

5.1、录音总体流程图如下:

audio_capture

5.2、播放音频的总体流程图如下:

audio_playback

5.3 ALSA mixer控制流程如下:

audio_mixer_control