LV15-09-音频应用-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)

image-20240917110241585

3. alsa基本框架与API

在应用层, ALSA 为我们提供了一套标准的 API,应用程序只需要调用这些 API 就可完成对底层音频硬件设备的控制, 如播放、录音等, 这一套 API 称为 alsa-lib。

image-20240917110427549

二、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)

image-20240917110821775

alsa-lib 库支持功能比较多, 提供了丰富的 API 接口供应用程序开发人员调用, 根据函数的功能、作用将这些 API 进行了分类, 可以点击上图中 Modules 按钮查看其模块划分, 如下所示:

image-20240917110920722

一个分类就是一个模块(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)) :

image-20240917141725576

点击模块名称可以查看到该模块提供的API接口有哪些以及相应的函数说明 。

3.2 Error handling

该模块提供了关于错误处理相关的接口,譬如函数调用发生错误时,可调用该模块下提供的函数打印错误描述信息。 (ALSA project - the C library reference: Error handling (alsa-project.org)

image-20240917170629440

3.3 Mixer Interface

提供了关于混音器相关的一系列操作接口,譬如音量、 声道控制、增益等等。 (ALSA project - the C library reference: Mixer Interface (alsa-project.org)

image-20240917170758907

三、alsa-utils

1. alsa-utils简介

alsa-utils是基于alsa-lib以及Kernel ALSA的一系列工具包,包含测试、配置声卡的工具,例如:

1
2
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 目录下有如下文件:

1
ls -alh /dev/snd
image-20240918074702600

从上图可以看到有如下设备文件:

  • 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
2
cd /proc/asound
ls -alh
image-20240918074945691

2.1 /proc/asound/cards

通过”cat /proc/asound/cards”命令,查看 cards 文件的内容,可列出系统中可用的、注册的声卡,如下所示:

1
cat /proc/asound/cards
image-20240918075059341

imx6ull板子上只有一个声卡(WM8960 音频编解码器),所以它的编号为 0,也就是 card0。系统中注册的所有声卡都会在 /proc/asound/ 目录下存在一个相应的目录,该目录的命名方式为 cardX(X 表示声卡的编号),如上面图中的 card0。 card0 目录下记录了声卡 0 相关的信息,如声卡的名字以及声卡注册的 PCM 设备,如下所示:

image-20240918075154802

2.2 /proc/asound/devices

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

1
cat /proc/asound/devices

如下所示:

image-20240918075252721

2.3 /proc/asound/pcm

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

1
cat /proc/asound/pcm

如下图所示:

image-20240918075327050