携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第32天,点击查看活动详情
1、ALSA架构
ALSA是Linux系统中为声卡提供驱动的内核组件。它提供了专门的库函数来简化相应应用程序的编写。
从上图可以看出
ALSA系统包括7个子项目:
- 驱动包
alsa-driver - 开发包
alsa-libs - 开发包插件
alsa-libplugins - 设置管理工具包
alsa-utils - OSS接口兼容模拟层工具
alsa-oss - 特殊音频固件支持包
alsa-finnware - 其他声音相关处理小程序包
alsa-tools
2、移植ALSA库及工具
移植ALSA主要是移植alsa-Ub和alsa-utils。
alsa-lib:用户空间函数库, 封装驱动提供的抽象接口, 通过文件libasound.so提供API给应用程序使用。alsa-utils:实用工具包,通过调用alsa-lib实现播放音频(aplay)、录音(arecord) 等工具。ALSA Util是纯应用层的软件,相当于ALSA设备的测试程序,ALSA-Lib则是支持应用API的中间层程序,ALSA-Util中的应用程序中会调用到ALSA-Lib中的接口来操作到我们的音频编解码芯片的寄存器,而lib中接口就是依赖于最底层驱动代码,因此移植ALSA程序的顺序就是先后移植Driver,Lib,Util。
ALSA库下载
ALSA首先需要在ALSA的官网上下载官网www.alsa-project.org下载alsa-lib和alsa-utils。
如上图所示我们下载的版本为:
- alsa-lib-1.2.2.tar.bz2
- alsa-utils-1.2.2.tar.bz2
2.1、ALSA Lib编译
ALSA Lib移植不需要修改源码,只需要重新编译库代码以支持自己的平台。
tar -xvf alsa-lib-1.0.27.2.tar.bz2
cd alsa-lib-1.0.27.2
CC=arm-none-linux-gnueabi-gcc
./configure --host=arm-linux --prefix=/home/m/3rd/alsa/install/
make
make install
在上述命令中./configure配置的几个重要的配置选项解释如下:
host指定编译器,这里指定为交叉编译器,运行本配置命令前务必保证编译器已经可以在Shell下可以直接执行了。prefix指定编译后文件的安装路径,这样安装命令就还会指定的这个目录中创建lib和include两个目录。
2.2、ALSA Util编译
tar -xvf alsa-utils-1.0.27.2.tar.bz2
cd alsa-utils-1.0.27.2
CC=arm-none-linux-gnueabi-gcc
./configure --prefix=/home/m/3rd/alsa/install/ --host=arm-linux --with-alsa-inc-prefix=/home/m/3rd/alsa/install/include --with-alsa-prefix=/home/m/3rd/alsa/install/lib --disable-alsamixer --disable-xmlto --disable-nls
make
2.3、ALSA库和工具移植入嵌入式平台
ALSA库和测试工具的移植就是将相应库文件和可执行文件放在目标板上,以下文件 必须被拷贝至对应位置 :
ALSA Lib文件,放在/lib/中。- 配置文件放在
/usr/local/share中,与编译时指定的目录相同。 - 测试应用文件,
ALSA Util能产生aplay、amixer、arecord,我们可以把这些可执行文件放在/usr/sbin中。 - 内核目录中保证有
/dev/snd/目录,这个目录下存放controlC0,pcmC0D0,/usr/sbintimer,timer这些设备文件,如果这些设备文件已经在/dev目录下,可手动拷贝到/snd目录中。
在LINUX系统中,每个设备文件都是文件。音频设备也是一样,它的设备文件被放在/dev/snd目录下,我们来看下这些设备文件:
ls /dev/snd -l
crw-rw----+ 1 root audio 116, 2 5月 19 21:24 controlC0 用于声卡的
crw-rw----+ 1 root audio 116, 4 6月 6 19:31 pcmC0D0c
crw-rw----+ 1 root audio 116, 3 6月 11 11:53 pcmC0D0p
crw-rw----+ 1 root audio 116, 33 5月 19 21:24 timer
controlC0:音频控制设备文件,例如通道选择,混音,麦克风的控制等pcmC0D0c:声卡0设备0的录音设备,c表示capter;pcmC0D0p:声卡0设备0的播音设备,p表示play;timer:定时器设置。