录音和内部Codec的播放
一 原理介绍
1.1 录音有两种方式
第一,采用dmic硬件采样音频模拟信号并转成数字信号,软件直接读dmic输出的数字信号并编码成指定的文件格式,从而录音产生相应格式的音频文件,比如wav格式。
第二,采用内部codec(简称icodec) + amic(采样音频模拟信号的传感器),从而,接上amic之后,硬件上可以实现录音。
1.2 播放
播放统一采用内部codec(简称icodec)这个设备实现。所以,icodec也是要软件配置的。
二 具体实现
2.1 iConfigTool中 dmic和icodec的配置流程
选择主配置文件:x2600e_vast_v20_nand_5.10_factory_defconfig
选中 x2600_510 icodec(内部codec)创建一个声卡
勾选dmic(外接数字mic)
dmic 接口提供四个引脚,对应控制器8个通道,这里勾选使能dmic通道0,1,具体选那个通道,要看硬件连接情况而定。
本例使用PD_X2600E_VAST_V2.0开发板,相关硬件连接如下可以确定当前dmic使用的是通道0,1
最后保存这些设置到对应的配置文件中。依次点击:file ---》 save ---》yes
点击Yes进行配置保存。
2.2 编译和烧录
注意:因make x2600e_vast_v20_nand_5.10_factory_defconfig 会覆盖buildroot的后续配置,而全部使用buildroot的默认配置:buildroot_x2600_510_wifi_common_defconfig,所以此处应当先整体编译系统,后续再单独配置buildroot并重新编译。
cd build
make x2600e_vast_v20_nand_5.10_factory_defconfig
make
2.3 insmod 参数确认
kenny@kenny-computer:~/source/source_darwin_linux_x2000/build$ cat ../buildroot/buildroot/output/target/module_driver/soc_dmic.sh
insmod soc_dmic.ko dmic_int0=1 dmic_int1=0
参数:
dmic_int值:1--使能 0--失能
dmic_int0 #控制dmic通道0,1
dmic_int1 #控制dmic通道2,3
dmic_int2 #控制dmic通道4,5
dmic_int3 #控制dmic通道6,7
由上可见,上图中iConfigTool所选择的音频通道0已经编译生效。
2.4 buildroot 中测试工具的配置
cd buildroot/buildroot
make menuconfig
最后保存退出就好啦。
确定当前buildroot的配置:
kenny@kenny-computer:~/source/source_darwin_linux_x2000/build$ grep -nr "buildroot" configs/x2600e_vast_v20_nand_5.10_factory_defconfig
9:APP_br_dir=../buildroot/buildroot
10:APP_br_config_file=configs/buildroot/buildroot_x2600_510_wifi_common_defconfig
438:# APP_br_root_login_keep_buildroot is not set
所以当前的buildroot配置为: buildroot_x2600_510_wifi_common_defconfig
上面保存以后,执行如下操作保存buildroot配置
buildroot/buildroot$ cp .config ../../build/configs/buildroot_x2600_510_wifi_common_defconfig
2.5 编译buildroot
cd build
make buildroot
2.6 烧录build/output/rootfs.squashfs
烧录可以参考, 烧录方法
三 录音、播放测试录音和播放的使用方法
3.1 列出设备
# 进⼊串⼝调试界⾯后,切换到/usr/data⽬录,执⾏⾳频录制命令
arecord -l
# arecord -l
**** List of CAPTURE Hardware Devices ****
card 0: dmicsoundcard [dmic-sound-card], device 0: x2600 DMIC snd-soc-dummy-dai-0 []
Subdevices: 1/1
Subdevice #0: subdevice #0
card 1: icodecsoundcard [icodec-sound-card], device 0: x2600 icodec pcm ingenic-icodec-0 []
Subdevices: 1/1
Subdevice #0: subdevice #0
#
也可以用如下命令来看当前所有alsa设备列表:
# cat /proc/asound/cards
0 [dmicsoundcard ]: dmic-sound-card - dmic-sound-card
dmic-sound-card
1 [icodecsoundcard]: icodec-sound-ca - icodec-sound-card
icodec-sound-card
#
可知,当前card0为所配置的dmic设备节点名,device0 可作为录⾳设备。本开发板默认留了 dmic接⼝座⼦,也接了dmic外设,所以可以⽤dmic录⾳的。 card1为当前内部icodec设备节点名,device0 可作为⾳频播放设备。当然了,本开发板icodec 默认不接amic,只有播放时的amic回采,所以card1不可以作为录⾳设备,但是可以做为播放设备。
3.2 使用dmic录音
arecord -Dhw:0,0 -d 10 -f S16_LE -r 16000 -c 2 -t wav /usr/data/test.wav
参数解析
-D 指定了录⾳设备0,0 是card 0 device 0的意思,本例中是DMIC
-d 指定录⾳的时⻓,单位时秒 # 录⾳时⻓:10s
-f 指定录⾳格式 # ⾳频存储格式:S16_LE(有符号16位⼩端存储)
-r 指定了采样率,单位时Hz # 采样频率:16000hz
-c 指定channel 个数 # 通道数:2
-t 指定⽣成的⽂件格式 # ⽂件格式:wav
3.3 使用aplay播放这些录音文件
aplay -Dplughw:1,0 /usr/data/test.wav
此时如果板子接功放就会有声音输出。
3.4 出错时的定位
如果可以录音但是不能正常播放,则使⽤adb调试⼯具在本地环境中拉取刚刚⽣成的test.wav⽂件进⾏试听,检查硬件是否正常⼯作
adb pull /usr/data/test.wav ./
拉取成功后会如下显⽰:
/usr/data/test.wav: 1 file pulled. 5.0 MB/s (640044 bytes in 0.122s)
在电脑上建议使用audacity 工具播放看一下数据质量。
四 软件demo 接口程序
4.1 demo接口程序可以使用cmd_alsa 命令
cmd_alsa 是君正平台自主研发的用于调试音频的重要工具,客户可以参考其源码进行上层应用的开发。 具体位置如下:
libhardware2/src/cmds/alsa_main.c
4.1.1 DMIC 录音
cmd_alsa record device=hw:0,0 rate=48000 channels=1 time=10 > /tmp/test.wav
参数简单释义:
record :实现录⾳功能。
device=hw:0,0 :使⽤card0 的device 0设备,DMIC。
rate=48000 : 采样率为48k。
channels=1:单通道。
time=10 : 录⾳⽂件⻓度为10秒。
/tmp/test.wav : 指定最终⽣成的⾳频⽂件。
将在⽂件系统中⽣成:/tmp/test.wav。
4.1.2 ICODEC + SPK播放
cmd_alsa play device=plughw:1,0 rate=48000 channels=1 file=/tmp/test.wav
参数简单释义:
play :实现播放功能。
device=plughw:1,0 :使⽤card1 的device 0设备,对应icodecsoundcard。
rate=48000 : 采样率为48k。
channels=1:单通道。
file=/tmp/test.wav : 所要播放的⾳频⽂件。