本文移植alsa-lib和alsa-utils用来播放音频,参考正点原子教程,并做实验验证
软件包:https://download.csdn.net/download/qq_32605451/12510469
文件包含mplayer,zlib,alsa-lib和alsa-utils的源码
1、获取alsa-lib和alsa-utils的源码(当前最新版本为 1.2.2)
2、在ubuntu中新建目录alsa,并将下载后的文件复制到该附录并解压,在alsa目录下新建arm-alsalib和arm-alsa-utils目录,用来保存编译结果。最终目录中内容如下:
注意 alsa-lib 编译过程中会生成一些配置文件,而这些配置信息的路径都是绝对路径,因此
为了保证 ubuntu 和开发板根文件系统中的路径一致!我们需要在 ubuntu 和开发板中各创建一个路径和名字完全一样的目录,这里我们都创建一个/usr/share/arm-alsa 目录, ubuntu 中创建命令如下:
cd /usr/share
sudo mkdir arm-alsa
结果如下:
最后在开发板根文件系统中也创建一个/usr/share/arm-alsa 目录,命令如下:
mkdir /usr/share/arm-alsa -p
结果如下:
3、编译 alsa-lib
由于 alsa-utils 要用到 alsa-lib 库,因此要先编译 alsa-lib 库。
进入 alsa-lib-1.2.2目录,输入以下内容:
./configure --host=arm-linux-gnueabihf --prefix=/home/han/linux/tool/alsa/arm-alsalib --with-configdir=/usr/share/arm-alsa
“–with-configdir”用于设置 alsa-lib 编译出来的配置文件存放位置,这里设置为前
面创建的“/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
make install
su han //编译完成以后回原来的用户
4、移植alsalib
安装完成后打开arm-alsalib文件夹内容如下:
进入上图中lib 目录,将里边的所有文件拷贝到开发板根文件系统的/usr/lib 目录下,命令
如下:
cd lib
sudo cp * /home/han/linux/nfs/buildrootfs_qt/lib/ -arf
我的文件系统是通过网络挂载的,我的开发板文件系统路径为/home/han/linux/nfs/buildrootfs_qt
打开/usr/share/arm-alsa文件夹,内容如下:
将上图中的所有文件拷贝到开发板的/usr/share/arm-alsa 目录下,命令
如下:
sudo cp * /home/han/linux/nfs/buildrootfs_qt/usr/share/arm-alsa/ -raf
5、编译alsa-utils
进入alsa-utils-1.2.2目录,打开终端,输入以下内容:
./configure --host=arm-linux-gnueabihf --prefix=/home/han/linux/tool/alsa/arm-alsa-utils --with-alsa-inc-prefix=/home/han/linux/tool/alsa/arm-alsalib/include/ --with-alsaprefix=/home/han/linux/tool/alsa/arm-alsalib/lib/ --disable-alsamixer --disable-xmlto
make //编译
sudo make install //安装
–prefix表示安装路径,即为arm-alsa-utils的路径
/home/han/linux/tool/alsa/arm-alsa-utils
–with-alsa-inc-prefix表示alsalib的include文件夹路径,即为上文编译安装的得到的alsalib的头文件路径
/home/han/linux/tool/alsa/arm-alsalib/include/
–with-alsaprefix表示alsalib的lib文件夹路径,即为上文编译安装的得到的alsalib的库文件路径
/home/han/linux/tool/alsa/arm-alsalib/lib/
上面在配置 alsa-utils 的时候使用了“–disable-alsamixer”来禁止编译 alsamixer 这个工具,但是这个工具确非常重要,它是一个图形化的声卡控制工具,不禁止的话,编译会出错,未找到解决方法,所以禁止掉了。
安装完成后,打开arm-alsa-utils文件夹如下所示:
将上图的bin、 sbin 和 share 这三个目录中的所有文件分别拷贝到开发板根目录下的/bin、 /sbin 和/usr/share 目录下,命令如下:
sudo cp bin/* /home/han/linux/nfs/buildrootfs_qt/bin/ -rfa
sudo cp sbin/* /home/han/linux/nfs/buildrootfs_qt/sbin/ -rfa
sudo cp share/* /home/han/linux/nfs/buildrootfs_qt/usr/share/ -rfa
打开开发板根文件系统中的/etc/profile 文件,在里面加入如下所示内容:
export ALSA_CONFIG_PATH=/usr/share/arm-alsa/alsa.conf
添加完成如下图所示:
ALSA_CONFIG_PATH 用于指定 alsa 的配置文件,这个配置文件是 alsa-lib 编译出来的。
6、播放音乐测试
第一次使用声卡之前一定要先使用 amixer 设置声卡,打开耳机和喇叭,并且设置喇叭和耳
机音量,输入如下命令:
amixer sset Headphone 100,100
amixer sset Speaker 120,120
amixer sset 'Right Output Mixer PCM' on
amixer sset 'Left Output Mixer PCM' on
只能播放wav格式,输入以下命令测试
aplay 文件名.wav //播放歌曲
7、开机自动配置声卡
声卡设置的保存通过 alsactl 工具来完成,此工具也是 alsa-utils 编译出来的。因为 alsactl 默认将声卡配置文件保存在/var/lib/alsa 目录下,因此首先在开发板根文件系统下创建/var/lib/alsa目录,命令如下:
mkdir /var/lib/alsa -p
首先使用 amixer 设置声卡,然后输入如下命令保存声卡设置
alsactl -f /var/lib/alsa/asound.state store //保存声卡设置
-f 指定声卡配置文件, store 表示保存。关于 alsactl 的详细使用方法,输入“alsactl -h”即
可。保存成功以后就会生成/var/lib/alsa/asound.state 这个文件, asound.state 里面就是关于声卡的
各种设置信息,大家可以打开此文件查看一下里面的内容,
如果要使用 asound.state 中的配置信息来配置声卡,执行如下命令即可:
alsactl -f /var/lib/alsa/asound.state restore
最后面的参数改为 restore 即可,也就是恢复的意思。
打开/etc/init.d/rcS 文件,在最后面追加如下内容:
if [ -f "/var/lib/alsa/asound.state" ]; then
echo "ALSA: Restoring mixer setting......"
/sbin/alsactl -f /var/lib/alsa/asound.state restore &
fi
完成后如下所示:
第 1 行判断/var/lib/alsa/asound.state 这个文件是否存在, 存在的话就执行下面的。首先输出一行提示符:“ALSA: Restoring mixer setting…”,表示设置声卡,最后调用/sbin/alsactl 来执行声卡设置工作。
设置完成以后重启开发板,开发板开机就会自动设置声卡,会输入如下图所示内容: