Skip to content

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。

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)

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

image-20260106203533581

一个分类就是一个模块(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 的一系列工具包,包含测试、配置声卡的工具,例如:

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

shell
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 目录下,有很多的文件,这些文件记录了系统中声卡相关的信息,如下所示:

shell
cd /proc/asound
ls -alh
image-20240918074945691

2.1 /proc/asound/cards

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

shell
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 等等。

shell
cat /proc/asound/devices

如下所示:

image-20240918075252721

2.3 /proc/asound/pcm

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

shell
cat /proc/asound/pcm

如下图所示:

image-20240918075327050