一、ALSA 架构
ALSA 是 Linux 系统中为声卡提供驱动的内核组件。它提供了专门的库函数来简化相应应用程序的编写。

ALSA 系统包括 7 个主要部分:
- 驱动包:alsa-driver
- 开发包:alsa-libs
- 开发包插件:alsa-libplugins
- 设置管理工具:alsa-utils
- OSS 接口兼容工具:alsa-oss
- 特殊音频固件支持:alsa-firmware
- 其他声音相关处理小程序包 alsa-tools
二、移植 ALSA 库及工具
移植 ALSA 主要是要移植 alsa-driver(现在通常指的是内核中的 sound 子系统)、alsa-lib 和 alsa-utils 这三个部分。
alsa-lib:这是一个用户空间的函数库,它封装了底层驱动提供的功能,通过libasound.so这个文件提供 API 给应用程序使用。alsa-utils:这是一套实用工具集合,比如播放音频的aplay、录音用的arecord等工具。这些工具都是基于alsa-lib来实现其功能的。
简单来说,alsa-utils 就像是用来测试音频设备是否正常工作的软件;而 alsa-lib 则是位于应用层与硬件驱动之间的一个中间层,它提供了访问音频硬件所需的接口。当你运行 alsa-utils 里的程序时,实际上是通过调用 alsa-lib 提供的 API 来控制音频编解码芯片的。由于 alsa-lib 本身还需要依赖于底层的驱动程序才能工作,所以在移植过程中,正确的步骤应该是先移植驱动程序,然后是 alsa-lib,最后才是 alsa-utils。
1、ALSA 库下载
ALSA 首先需要在 ALSA 的官网上下载官网 http://www.alsa-project.org 下载 alsa-lib 和 alsa-utils。

如上图所示我们下载的版本为:
alsa-lib-1.2.2.tar.bz2alsa-utils-1.2.2.tar.bz2
2、ALSA Lib 编译
ALSA Lib 移植不需要修改源码,只需要重新编译库代码以支持自己的平台。
bash
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 install1
2
3
4
5
6
2
3
4
5
6
在上述命令中 ./configure 配置的几个重要的配置选项解释如下:
host指定编译器,这里指定为交叉编译器,运行本配置命令前务必保证编译器已经可以在 Shell 下可以直接执行了。prefix指定编译后文件的安装路径,这样安装命令就还会指定的这个目录中创建 lib 和include两个目录。
3、ALSA Util 编译
bash
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
make1
2
3
4
5
2
3
4
5
4、ALSA 库和工具移植入嵌入式平台
ALSA 库和测试工具的移植就是将相应库文件和可执行文件放在目标板上,以下文件 必须被拷贝至对应位置 :
ALSA Lib文件,放在/lib/中。
So --- /lib
- 配置文件放在
/usr/local/share中,与编译时指定的目录相同。
Etc --- /usr/local/share
- 测试应用文件,
ALSA Util能产生aplay、amixer、arecord,我们可以把这些可执行文件放在/usr/sbin中。
Bin --- /usr/sbin

- 内核目录中保证有
/dev/snd/目录,这个目录下存放controlC0,pcmC0D0,/usr/sbintimer,timer这些设备文件,如果这些设备文件已经在/dev目录下,可手动拷贝到/snd目录中。