输入 make menuconfig,打开 buildroot 配置界面,配置路径如下:
Target packages
-> Libraries
-> Audio/Sound
-> -*- alsa-lib —> 此配置项下的文件全部选中
Target packages
-> Audio and video applications
-> alsa-utils 此目录下的软件全部选中
配置好之后保存退出,编译,下载到开发板。
查看只有
少了好多东西,不知道怎么回事(测试了好久,百度也没搜到解决方法,只能直接编译了)
可能需要make clean 之后再重新编译一下,但重新编译花费时间很长
注意 alsa-lib 编译过程中会生成一些配置文件,而这些配置信息的路径都是绝对路径,因此为了保证 ubuntu 和开发板根文件系统中的路径一致!我们需要在 ubuntu 和开发板中各创建一个路径和名字完全一样的目录,这里我们都创建一个/usr/share/arm-alsa 目录,ubuntu 中创建命令如下
cd /usr/share //进入 ubuntu 的/usr/share 目录
sudo mkdir arm-alsa //创建 arm-alsa 目录
最后在开发板根文件系统中也创建一个/usr/share/arm-alsa 目录,命令如下:
mkdir /usr/share/arm-alsa -p //开发板根文件系统创建 arm-alsa 目录
这样 ubuntu 和开发板根文件系统都有一个“/usr/share/arm-alsa”目录,我们交叉编译的时候就不怕存在引用绝对路径了,因为 ubuntu 和开发板中的配置文件路径都是一模一样的。
由于 alsa-utils 要用到 alsa-lib 库,因此要先编译 alsa-lib 库。alsa-lib 就是 ALSA 相关库文件,应用程序通过调用 ALSA 库来对 ALSA 框架下的声卡进行操作。先创建一个名为“alsa-lib”的目录用来保存 alsa-lib 的编译结果
然后将 alsa-lib-1.2.2.tar.bz2 拷贝到 ubuntu 中并解压,命令如下:
tar -vxjf alsa-lib-1.2.2.tar.bz2
解压完成以后就会得到一个名为“alsa-lib-1.2.2”的文件夹,这个就是 alsa-lib 的源码。进入alsa-lib-1.2.2 目录,然后配置并编译,命令如下:
cd alsa-lib-1.2.2/ //进入 alsa-lib 源码目录
./configure --host=arm-linux-gnueabihf --prefix=/home/luatao/linux/tool/alsa-lib --with-configdir=/usr/share/arm-alsa
make //编译
sudo make install //安装
可能会出现如图所示的错误提示:
图中提示 libatopology.la 编译失败,这是因为 sudo 会切换到 root 用户下,但是此时 root用户下的环境变量中没有交叉编译器路径,因此会提示找不到“arm-linux-gnueabihf-gcc”,从而导致 libatopology.la 编译失败。
解决方法就是先切换到 root 用户,重新执行一下/etc/profile
文件,然后直接 make install 即可,命令如下:
sudo -s //切换到 root 用户
source /etc/profile //执行/etc/profile
make install //安装,此时已经工作在 root 下,因此不需要加“sudo”
su luatao//编译完成以后回原来的用户
编译完成以后前面创建的“alsa-lib”目录就会保存相应的编译结果,如图所示:
ubuntu 中/usr/share/arm-alsa 目录下的内容如图所示:
将图中 lib 目录下的所有文件拷贝到开发板根文件系统的/usr/lib 目录下,
cd - // 返回上次的目录 进入 alsa-lib
sudo cp lib/* /home/luatao/linux/nfs/rootfs/lib/ -af
将图中/usr/share/arm-alsa 目录下的所有文件拷贝到开发板的/usr/share/arm-alsa 目录下,命令如下:
cd /usr/share/arm-alsa //进入 arm-alsa 目录,拷贝配置文件
sudo cp * /home/luatao/linux/nfs/rootfs/usr/share/arm-alsa/ -raf
alsa-utils 是 ALSA 的一些小工具集合,我们可以通过这些小工具还测试我们的声卡。将 alsa-utils-1.2.2.tar.bz2 复制到 ubuntu 中并解压,命令如下:
tar -vxjf alsa-utils-1.2.2.tar.bz2 //解压
解压成功以后会得到一个名为“alsa-utils-1.2.2”的文件夹,此文件夹就是 alsa-utils 源码。重新创建一个名为“alsa-utils”的目录用于存放 alsa-utils-1.2.2 的编译结果。按照如下命令编译alsa-utils:
cd alsa-utils-1.2.2/ //进入
./configure --host=arm-linux-gnueabihf --prefix=/home/luatao/linux/tool/alsa-utils --with-alsa-inc-prefix=/home/luatao/linux/tool/alsa-lib/include/ --with-alsa-prefix=/home/luatao/linux/tool/alsa-lib/lib/ --disable-alsamixer --disable-xmlto
sudo -s //切换到 root 用户
source /etc/profile //执行/etc/profile
./configure --host=arm-linux-gnueabihf --prefix=/home/luatao/linux/tool/alsa-utils --with-alsa-inc-prefix=/home/luatao/linux/tool/alsa-lib/include/ --with-alsa-prefix=/home/luatao/linux/tool/alsa-lib/lib/ --disable-alsamixer --disable-xmlto
然后成功了
make //编译
sudo make install
译完成以后就会在前面创建的“alsa-utils”目录下生成 bin、sbin 和 share 三个文件夹,如图所示:
将图中 bin、sbin 和 share 这三个目录中的所有文件分别拷贝到开发板根目录下的/bin、/sbin 和/usr/share/alsa 目录下,命令如下:
cd alsa-utils
sudo cp bin/* /home/luatao/linux/nfs/rootfs/bin/ -rfa
sudo cp sbin/* /home/luatao/linux/nfs/rootfs/sbin/ -rfa
sudo cp share/* /home/luatao/linux/nfs/rootfs/usr/share/ -rfa
打开开发板根文件系统中的/etc/profile 文件,在里面加入如下所示内容:
export ALSA_CONFIG_PATH=/usr/share/arm-alsa/alsa.conf
LSA_CONFIG_PATH 用于指定 alsa 的配置文件,这个配置文件是 alsa-lib 编译出来的。
声卡相关选型默认都是关闭的,比如耳机和喇叭的左右声道输出等。因此我们在使用之前一定要先设置好声卡,alsa-utils 自带了 amixer 这个声卡设置工具。输入如下命令即可查看 amixer的帮助信息:
amixer --help //查看 amixer 帮助信息
从图可以看出,amixer 软件命令分为两组,scontrols、scontents、sset 和 sget 为一组。controls、contents、cset 和 cget 为另一组。这两组的基本功能都是一样的,只不过“s”开头的是 simple(简单)组,这一组命令是简化版,本教程最终使用“s”开头的命令设置声卡,因为少输入很多字符。
amixer
ls /dev/snd
controlC0表示控制器
pcmC0D0c 表示capture
pcmC0D0p 表示play
timer 表示定时器
出现了该设备说明codec驱动被正确加载。
arecord -l
alsamixer是图形化的amixer工具,如下图所示
从左到右是:耳机音量,耳机输出源,Mic增益,mic1 boost, DAC增益。
可以很方便地调整音频输出设置
00表示当前音量正常,MM表示此声道是静音.可以通过键盘上的M键来切换静音和正常状态.
[root@buildroot]:/$:amixer contents
numid=13,iface=MIXER,name='Headphone Source Playback Route'
; type=ENUMERATED,access=rw------,values=2,items=2
; Item #0 'DAC'
; Item #1 'Mixer'
: values=0,0
numid=3,iface=MIXER,name='Headphone Playback Switch'
; type=BOOLEAN,access=rw------,values=2
: values=on,on
numid=2,iface=MIXER,name='Headphone Playback Volume'
; type=INTEGER,access=rw---R--,values=1,min=0,max=63,step=0
: values=63
| dBscale-min=-63.00dB,step=1.00dB,mute=1
numid=5,iface=MIXER,name='Mic1 Boost Volume'
; type=INTEGER,access=rw---R--,values=1,min=0,max=7,step=0
: values=4
| dBrange-
rangemin=0,,rangemax=0
| dBscale-min=0.00dB,step=0.00dB,mute=0
rangemin=1,,rangemax=7
| dBscale-min=24.00dB,step=3.00dB,mute=0
numid=12,iface=MIXER,name='Mic1 Capture Switch'
; type=BOOLEAN,access=rw------,values=2
: values=off,off
numid=9,iface=MIXER,name='Mic1 Playback Switch'
; type=BOOLEAN,access=rw------,values=2
: values=off,off
numid=4,iface=MIXER,name='Mic1 Playback Volume'
; type=INTEGER,access=rw---R--,values=1,min=0,max=7,step=0
: values=3
| dBscale-min=-4.50dB,step=1.50dB,mute=0
numid=6,iface=MIXER,name='ADC Gain Capture Volume'
; type=INTEGER,access=rw---R--,values=1,min=0,max=7,step=0
: values=3
| dBscale-min=-4.50dB,step=1.50dB,mute=0
numid=7,iface=MIXER,name='DAC Playback Switch'
; type=BOOLEAN,access=rw------,values=2
: values=off,off
numid=1,iface=MIXER,name='DAC Playback Volume'
; type=INTEGER,access=rw---R--,values=1,min=0,max=63,step=0
: values=63
| dBscale-min=-73.08dB,step=1.16dB,mute=0
numid=8,iface=MIXER,name='DAC Reversed Playback Switch'
; type=BOOLEAN,access=rw------,values=2
: values=off,off
numid=10,iface=MIXER,name='Mixer Capture Switch'
; type=BOOLEAN,access=rw------,values=2
: values=on,on
numid=11,iface=MIXER,name='Mixer Reversed Capture Switch'
; type=BOOLEAN,access=rw------,values=2
: values=off,off
[root@buildroot]:/$:
板子上没有功放,但是留出了接口,我们需要外接一个功放。
我这里使用的是8002B功放芯片,用的是之前打的JQ8900的板子,然后我只焊接了功放部分,测试能用。
开机后默认状态是静音状态,需要取消掉静音状态
执行下面取消静音
amixer -c 0 sset 'Headphone',0 100% unmute
找一个音乐
我们可以播放liudehua.wav
然后就可以听到美妙的音乐了。
耳机输入内置了放大器。
耳机,linein,同时只能使用1种。
使用输入端口前需要设置mixer控制器,ADC input Mux
ADC Input Mux 和对应的输入端口
0 linein
1 fmin
2 mic1
3 mic2
4 mic1,mic2
5 mic1+mic2
6 output mixer
7 linein,mic1
使用amixer来设置通道
具体参数如下:
amixer -c <"card"> cset numid=<"control#"> <"input_port">
where:
<"card"> is the card, 0 for the sunxi-codec and 1 for the hdmi audio output
<"input_port"> is the input port from the table
<"control#"> is the control # showed using: aximer contents
card, device的确定方法
card, device必须对应hdmi的声卡号和设备号,可以使用aplay -l查看对应的hdmi设备,可能会有出现多个hdmi设备,确定当前可以使用的hdmi设备的方法如下:
#. cat /proc/asound/cards 查看nvidia设备对应的ID号(根据下面的查看就是为0)
#. alsamixer -c 0 打开声音设置,其中<S/PDIF>即为HDMI输出,“MM”代表静音,alsa在每次重启声音设备时都会默认为静音,所以必须首先打开音量再进行后续的操作。
#. alsactl store 保存上述配置
使用下面命令使能耳机并录音
amixer -c 0 cset numid=12 2 使能mic1
录音3s
arecord -D hw:0,0 -d 3 -f S16_LE -r 16000 tmp.wav 录音测试
arecord -f cd -d 10 record.wav
-f 是设置录音质量,“-f cd”表示录音质量为 cd 级别。-d 是指定录音时间,单位是 s,这条指令就是录制一段 cd 级别 10s 的 wav 音频,音频名字为 record.wav。录制的时候大家就可以对着开发板上的 MIC 说话,直到录制完成。
可以自行播放测试