LV005-alsa简介
一、alsa 简介
1. alsa 是什么?
ALSA 是 Advanced Linux Sound Architecture(高级的 Linux 声音体系) 的缩写,目前已经成为了 linux 下的主流音频体系架构, 提供了音频和 MIDI 的支持,替代了原先旧版本中的 OSS(开发声音系统)。
ALSA 是 Linux 系统下一套标准的、先进的音频驱动框架, 那么这套框架的设计本身是比较复杂的, 采用分离、分层思想设计而成,具体的在应用编程这部分就不需太深入去了解了。
2. 官网在哪?
官网这里:AlsaProject (alsa-project.org)。
3. alsa 基本框架与 API
在应用层, ALSA 为我们提供了一套标准的 API,应用程序只需要调用这些 API 就可完成对底层音频硬件设备的控制, 如播放、录音等, 这一套 API 称为 alsa-lib。

二、alsa-lib
1. alsa-lib 库简介
alsa-lib 是一套 Linux 应用层的 C 语言函数库, 为音频应用程序开发提供了一套统一、标准的接口,应用程序只需调用这一套 API 即可完成对底层声卡设备的操控,如播放与录音。
用户空间的 alsa-lib 对应用程序提供了统一的 API 接口,这样可以隐藏驱动层的实现细节,简化了应用程序的实现难度、无需应用程序开发人员直接去读写音频设备节点。学习 ALSA 音频应用编程其实就是学习 alsa-lib 库函数的使用、如何基于 alsa-lib 库函数开发音频应用程序。
2. 相关文档
ALSA 提供了关于 alsa-lib 的使用说明文档,其链接地址为:ALSA project - the C library reference: Index, Preamble and License (alsa-project.org)。
alsa-lib 库支持功能比较多, 提供了丰富的 API 接口供应用程序开发人员调用, 根据函数的功能、作用将这些 API 进行了分类, 可以点击 Topics 按钮查看其模块划分, 如下所示:

一个分类就是一个模块(module),有些模块下可能该包含了子模块,例如上图中,模块名称前面有三角箭头的表示该模块包含有子模块。
- Global defines and functions: 包括一些全局的定义,如函数、宏等;
- Constants for Digital Audio Interfaces: 数字音频接口相关的常量;
- Input Interface: 输入接口;
- Output Interface: 输出接口;
- Error handling: 错误处理相关接口;
- Configuration Interface: 配置接口;
- Control Interface: 控制接口;
- PCM Interface: PCM 设备接口;
- RawMidi Interface: RawMidi 接口;
- Timer Interface: 定时器接口;
- Hardware Dependant Interface: 硬件相关接口;
- MIDI Sequencer: MIDI 音序器;
- External PCM plugin SDK: 外部 PCM 插件 SDK;
- External Control Plugin SDK: 外部控制插件 SDK;
- Mixer Interface: 混音器接口;
- Use Case Interface: 用例接口;
- Topology Interface: 拓扑接口。
可以看到, alsa-lib 提供的接口确实非常多、 模块很多,但是这里我们仅涉及到三个模块下的 API 函数,包括: PCM Interface、Error Interface 以及 Mixer Interface。
3. 重要模块
3.1 PCM Interface
PCM Interface,提供了 PCM 设备相关的操作接口,譬如打开/关闭 PCM 设备、配置 PCM 设备硬件或软件参数、控制 PCM 设备(启动、暂停、恢复、写入/读取数据) ,该模块下还包含了一些子模块(ALSA project - the C library reference: PCM Interface (alsa-project.org))。点击模块名称可以查看到该模块提供的 API 接口有哪些以及相应的函数说明 。
3.2 Error handling
该模块提供了关于错误处理相关的接口,譬如函数调用发生错误时,可调用该模块下提供的函数打印错误描述信息。 (ALSA project - the C library reference: Error handling (alsa-project.org))。
3.3 Mixer Interface
提供了关于混音器相关的一系列操作接口,譬如音量、 声道控制、增益等等。 (ALSA project - the C library reference: Mixer Interface (alsa-project.org))。
三、alsa-utils
1. alsa-utils 简介
alsa-utils 是基于 alsa-lib 以及 Kernel ALSA 的一系列工具包,包含测试、配置声卡的工具,例如:
alsactl, aconnect, alsamixer, amidi, amixer, aplay, aplaymidi, arecord, arecordmidi,
aseqnet, iecset, speaker-test四、alsa 相关节点
1. /dev/snd 目录中的文件
在 Linux 内核设备驱动层、基于 ALSA 音频驱动框架注册的 sound 设备会在/dev/snd 目录下生成相应的设备节点文件,如 ALPHA I.MX6U 开发板出厂系统/dev/snd 目录下有如下文件:
ls -alh /dev/snd
从上图可以看到有如下设备文件:
- controlC0: 用于声卡控制的设备节点, 譬如通道选择、 混音器、 麦克风的控制等, C0 表示声卡 0(card0);
- pcmC0D0c: 用于录音的 PCM 设备节点。其中 C0 表示 card0,也就是声卡 0;而 D0 表示 device0,也就是设备 0;最后一个字母 c 是 capture 的缩写,表示录音;所以 pcmC0D0c 便是系统的声卡 0 中的录音设备 0;
- pcmC0D0p: 用于播放(或叫放音、回放)的 PCM 设备节点。其中 C0 表示 card0,也就是声卡 0;而 D0 表示 device 0,也就是设备 0;最后一个字母 p 是 playback 的缩写,表示播放; 所以 pcmC0D0p 便是系统的声卡 0 中的播放设备 0;
- pcmC0D1c: 用于录音的 PCM 设备节点。对应系统的声卡 0 中的录音设备 1;
- pcmC0D1p: 用于播放的 PCM 设备节点。对应系统的声卡 0 中的播放设备 1。
- timer: 定时器。
2. /proc/asound 目录下的文件
编写的应用程序,虽然是调用 alsa-lib 库函数去控制底层音频硬件,但最终也是落实到对 sound 设备节点的 I/O 操作,只不过 alsa-lib 已经帮我们封装好了。在 Linux 系统的/proc/asound 目录下,有很多的文件,这些文件记录了系统中声卡相关的信息,如下所示:
cd /proc/asound
ls -alh
2.1 /proc/asound/cards
通过 "cat /proc/asound/cards" 命令, 查看 cards 文件的内容,可列出系统中可用的、注册的声卡,如下所示:
cat /proc/asound/cardsimx6ull 板子上只有一个声卡(WM8960 音频编解码器),所以它的编号为 0,也就是 card0。系统中注册的所有声卡都会在 /proc/asound/ 目录下存在一个相应的目录,该目录的命名方式为 cardX(X 表示声卡的编号),如上面图中的 card0。 card0 目录下记录了声卡 0 相关的信息,如声卡的名字以及声卡注册的 PCM 设备,如下所示:

2.2 /proc/asound/devices
通过查看 /proc/asound/devices 节点,可以列出系统中所有声卡注册的设备,包括 control、 pcm、 timer、 seq 等等。
cat /proc/asound/devices如下所示:

2.3 /proc/asound/pcm
查看/proc/asound/pcm 节点可以列出系统中的所有 PCM 设备,包括 playback 和 capture:
cat /proc/asound/pcm如下图所示: