ALSA简介
ALSA全称Advanced Linux Sound Architecture。是Linux 内核关于音频的驱动程序架构。
ALSA官网为:https://www.alsa-project.org/
在内核设备驱动层,ALSA提供了alsa-driver,同时在应用层,ALSA为我们提供了alsa-lib,应用程序只要调用alsa-lib提供的API,即可以完成对底层音频硬件的控制。
嵌入式ALSA
嵌入式音频子系统架主要是ALSA 片上系统 (ASoC),其中包括 codec driver、 platform driver、 machine driver 等
- codec driver只关心 codec 本身;
- platform driver 主要包括平台 cpu dai( 如 i2s) , dma 等部分;
- machine driver 主要将 platform driver 和 codec driver 连接起来。
platform 和 dai driver 一般修改较少, 主要修改machine 和 codec driver,这也将是我们后续分析的重点。
ALSA扣扑结构
ALSA历史
开发 ALSA 的项目由 Jaroslav Kysela 领导,基于Gravis Ultrasound声卡的 Linux 设备驱动程序。它始于 1998 年,与 Linux 内核分开开发,直到 2002 年在 2.5 开发系列中引入(2.5.4–2.5.5)。
在 2.6 版本中,它默认替换了之前的系统Open Sound System (OSS)(尽管确实存在向后兼容层)。
ALSA 具有比 OSS 更大、更复杂的 API,因此开发使用 ALSA 作为其声音技术的应用程序可能会更加困难。虽然 ALSA 可以配置为提供 OSS 仿真层,但在许多 Linux 发行版中,此类功能不再可用或默认未安装。
ALSA特点
ALSA 在设计时具有一些功能,在其构思时,OSS 不支持:
- 基于硬件的MIDI合成。
- 多通道的硬件混合。
- 全双工操作。
- 多处理器友好、线程安全的设备驱动程序。
除了声音设备驱动程序之外,ALSA 还为希望通过比提供用于与内核驱动程序直接交互的接口更高级别的接口来使用驱动程序功能的应用程序开发人员捆绑了一个用户空间 库。与试图直接反映硬件功能的内核 API 不同,ALSA 的用户空间库提供了一种抽象,该抽象在不同的底层硬件元素之间保持尽可能标准化。这个目标部分是通过使用软件插件来实现的;例如,许多现代声卡或内置声音芯片没有“主音量”控件。相反,对于这些设备,用户空间库使用“ softvol ”提供软件音量控制” 插件,普通的应用软件不需要关心这样的控制是通过底层硬件实现的,还是通过底层硬件的软件仿真实现的。
ALSA的应用
除了 Linux 内核内部的软件框架,ALSA 项目还提供了命令行工具和实用程序 alsactl、 amixer、arecord/aplay和alsamixer以及ncurses基于TUI。
还有由第三方开发人员编写的 GUI ,例如 GNOME-ALSAmixer (使用GTK)、Kmix、 XFCE4-mixer、LXpanel、QasHctl、QasMixer、Pavucontrol、AconnectGUI、tapiir polarbear、ALSAmixerGUI(使用FLTK)、ZynAddSubFX、Yoshimi等等。
ALSA概念
一般情况,ALSA 最多支持8张卡,编号为 0 到 7;每张卡都是能够输入和输出的物理或逻辑内核设备。此外,每张卡还可以通过其id来寻址,这是一个解释性字符串,例如“ Headset ”或“ ICH 9 ”。
一张卡有devices,从 0 开始编号;设备可能是播放类型的,这意味着它从计算机输出声音,或其他类型,例如捕获、控制、定时器或音序器;未指定特定设备时,默认使用设备编号 0。
一个设备可能有子设备,从 0 开始编号;子设备代表设备的一些相关声音端点,例如扬声器对。如果未指定子设备或者指定了子设备号-1,则使用任何可用的子设备。
卡接口是用于访问卡的 ALSA 协议的描述;可能的接口包括:hw、plughw、default和plug : dmix 。hw接口提供对内核设备的直接访问,但不支持软件混合或流适配。plughw和default在硬件接口会产生错误 的情况下启用声音输出。
应用程序通常通过将所有上述规范组合在一个设备字符串[ citation required ]中来描述声音输出,该设备字符串具有以下形式之一(区分大小写):
- interface:card,device,subdevice
- interface:CARD=1,DEV=3,SUBDEV=2.
ALSA流是表示声音的数据流;最常见的流格式是PCM,它必须以匹配硬件特性或参数的方式生成,包括:
- 采样率:家庭立体声音响通常为 44.1 kHz,家庭影院为 48 kHz,而高保真音频制作或再现则高达 88.2 kHz、96 kHz 甚至 192 kHz。
- 样本宽度:以每个样本的某些位数衡量(例如 8、16、24 或 32 位/样本)
- 样本编码:如字节序
- 通道数:1 个单声道,2 个立体声,或 6 个AC-3 / IEC958