LV19-01-音频应用-01-ALSA基础知识
本文主要是音频应用——ALSA基础知识的相关笔记,若笔记中有错误或者不合适的地方,欢迎批评指正😃。
点击查看使用工具及版本
PC端开发环境 | Windows | Windows11 |
Ubuntu | Ubuntu20.04.6的64位版本(一开始使用的是16.04版本,后来进行了升级) | |
VMware® Workstation 17 Pro | 17.0.0 build-20800274 | |
终端软件 | MobaXterm(Professional Edition v23.0 Build 5042 (license)) | |
Win32DiskImager | Win32DiskImager v1.0 | |
Linux开发板环境 | Linux开发板 | 正点原子 i.MX6ULL Linux 阿尔法开发板 |
uboot | NXP官方提供的uboot,NXP提供的版本为uboot-imx-rel_imx_4.1.15_2.1.0_ga(使用的uboot版本为U-Boot 2016.03) | |
linux内核 | linux-4.15(NXP官方提供) |
点击查看本文参考资料
分类 | 网址 | 说明 |
官方网站 | https://www.arm.com/ | ARM官方网站,在这里我们可以找到Cotex-Mx以及ARMVx的一些文档 |
https://www.nxp.com.cn/ | NXP官方网站 | |
https://www.nxpic.org.cn/ | NXP 官方社区 | |
https://u-boot.readthedocs.io/en/latest/ | u-boot官网 | |
https://www.kernel.org/ | linux内核官网 |
点击查看相关文件下载
分类 | 网址 | 说明 |
NXP | https://github.com/nxp-imx | NXP imx开发资源GitHub组织,里边会有u-boot和linux内核的仓库 |
https://elixir.bootlin.com/linux/latest/source | 在线阅读linux kernel源码 | |
nxp-imx/linux-imx/releases/tag/rel_imx_4.1.15_2.1.0_ga | NXP linux内核仓库tags中的rel_imx_4.1.15_2.1.0_ga | |
nxp-imx/uboot-imx/releases/tag/rel_imx_4.1.15_2.1.0_ga | NXP u-boot仓库tags中的rel_imx_4.1.15_2.1.0_ga | |
I.MX6ULL | i.MX 6ULL Applications Processors for Industrial Products | I.MX6ULL 芯片手册(datasheet,可以在线查看) |
i.MX 6ULL Applications ProcessorReference Manual | I.MX6ULL 参考手册(下载后才能查看,需要登录NXP官网) |
一、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 进行了分类, 可以点击上图中 Modules 按钮查看其模块划分, 如下所示:
一个分类就是一个模块(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的一系列工具包,包含测试、配置声卡的工具,例如:
1 | alsactl, aconnect, alsamixer, amidi, amixer, aplay, aplaymidi, arecord, arecordmidi, |
四、alsa相关节点
1. /dev/snd 目录中的文件
在 Linux 内核设备驱动层、基于 ALSA 音频驱动框架注册的 sound 设备会在/dev/snd 目录下生成相应的设备节点文件,如 ALPHA I.MX6U 开发板出厂系统/dev/snd 目录下有如下文件:
1 | 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 目录下,有很多的文件,这些文件记录了系统中声卡相关的信息,如下所示:
1 | cd /proc/asound |
2.1 /proc/asound/cards
通过”cat /proc/asound/cards”命令,查看 cards 文件的内容,可列出系统中可用的、注册的声卡,如下所示:
1 | cat /proc/asound/cards |
imx6ull板子上只有一个声卡(WM8960 音频编解码器),所以它的编号为 0,也就是 card0。系统中注册的所有声卡都会在 /proc/asound/ 目录下存在一个相应的目录,该目录的命名方式为 cardX(X 表示声卡的编号),如上面图中的 card0。 card0 目录下记录了声卡 0 相关的信息,如声卡的名字以及声卡注册的 PCM 设备,如下所示:
2.2 /proc/asound/devices
通过查看 /proc/asound/devices 节点,可以列出系统中所有声卡注册的设备,包括 control、 pcm、 timer、 seq 等等。
1 | cat /proc/asound/devices |
如下所示:
2.3 /proc/asound/pcm
查看/proc/asound/pcm节点可以列出系统中的所有 PCM 设备,包括 playback 和 capture:
1 | cat /proc/asound/pcm |
如下图所示: