Linux 音频子系统分析1(基于Linux6.6)---硬件介绍
一、概述
1. Linux 音频子系统概览
Linux 音频子系统分为多个层次和模块,它们各自负责不同的任务。最常见的音频子系统框架包括:
- ALSA (Advanced Linux Sound Architecture): ALSA 是 Linux 系统中处理音频输入、输出的主要框架,提供了硬件抽象、驱动程序、音频接口、混音等功能。
- OSS (Open Sound System): 早期的音频接口框架,已被 ALSA 替代,但仍可在某些系统中找到并提供兼容支持。
- PulseAudio 和 PipeWire: 这两个是音频服务器,提供更高层次的音频管理,负责音频流的路由、混音、音量控制等功能,通常运行在 ALSA 或其他底层音频框架之上。
2. ALSA (Advanced Linux Sound Architecture)
ALSA 是 Linux 音频子系统的核心,提供对音频硬件的支持。它提供了以下几个关键功能:
- 音频设备驱动:ALSA 为各类音频硬件提供设备驱动,这些驱动负责与硬件进行通信。每个支持的硬件都有一个对应的 ALSA 驱动。
- 硬件抽象层:ALSA 提供硬件抽象层,使得应用程序和中间件(如 PulseAudio、Jack 等)不必直接与硬件交互。这样可以使不同的音频硬件设备具有一致的接口。
- 多声道支持和混音:ALSA 支持多声道音频输出,并具有硬件和软件混音的能力,允许不同音频源的混合输出。
ALSA 主要通过 snd
(Sound)子系统在 Linux 内核中实现。音频设备通过 /dev/snd/
目录下的设备节点与用户空间进行交互。
ALSA 关键组件
-
音频设备驱动:每个音频设备(如声卡、内建音频芯片等)都有一个 ALSA 驱动,它负责与硬件通信。常见的 ALSA 驱动有:
- snd_hda_intel:用于支持 Intel 高定义音频 (HD Audio) 硬件。
- snd_usb_audio:用于支持 USB 音频设备。
- snd_pcm:提供 PCM(脉冲编码调制)音频流的处理功能。
-
控制接口:ALSA 提供了控制接口来调整音量、输入/输出源选择、声道配置等。应用程序可以通过
alsamixer
等工具访问这些控制接口。 -
PCM(Pulse Code Modulation)接口:ALSA 提供了对 PCM 流的支持,这是一种无损音频编码格式,通常用于音频数据的传输。
3. PulseAudio 和 PipeWire
尽管 ALSA 是 Linux 音频子系统的核心,但许多现代 Linux 系统使用 PulseAudio 或 PipeWire 作为音频服务器来处理音频流和设备管理。
-
PulseAudio:PulseAudio 是 Linux 上广泛使用的音频服务器,负责将不同的音频流路由到正确的设备。它支持多通道音频、网络音频流、应用程序之间的音频共享、混音和音量控制。PulseAudio 居于 ALSA 和用户应用之间,充当音频数据流的中介。
-
PipeWire:PipeWire 是一个相对较新的音频和视频流处理框架,旨在替代 PulseAudio 和 JACK。它不仅支持音频流的路由,还支持视频流的传输,特别适合处理多媒体应用。PipeWire 提供与 ALSA 和 PulseAudio 的兼容性,并且更现代化,具有更高的性能和灵活性。
4. 音频硬件接口
Linux 支持多种音频硬件接口,包括内建音频芯片、外部声卡、USB 音频设备等。常见的音频硬件接口包括:
-
HD-Audio (High Definition Audio):现代的计算机主板通常配备了 HD-Audio 设备,采用 Intel/Realtek 等厂商的音频芯片。这些硬件通常支持高品质的多声道音频。
-
USB 音频设备:USB 音频设备(如 USB 声卡、耳机等)通过 USB 总线连接到计算机,ALSA 提供了
snd_usb_audio
驱动来支持这些设备。 -
PCI/PCIe 声卡:传统的 PCI 或 PCIe 声卡(如 Creative SoundBlaster 等)通过 ALSA 驱动进行管理。
-
蓝牙音频设备:蓝牙耳机、音响等设备也通过 ALSA 和 PulseAudio 支持。
5. 音频数据流
在 Linux 音频系统中,音频流数据通常以 PCM 数据流的形式传输。这些数据流可以是:
- 输入音频流:通常来自麦克风或其他音频采集设备。
- 输出音频流:通常传输到扬声器、耳机或其他音频输出设备。
- 环回音频流:在一些系统中,音频可以在不同的应用程序之间进行环回传输,用于音频录制或实时处理。
ALSA 提供了对这些音频流的低延迟支持,并且可以通过 pcm
接口进行配置。
6. 硬件接口图
二、数字音频信号的传输标准
- I2S
- PCM(Pulse Code Modulation)
- PDM(Pulse Density Modulation)
- S/PDIF和Ethernet AVB主要用于板间长距离及需要电缆连接的场合
2.1、I2S
I2S全称Inter-IC Sond Bus,是飞利浦在1986年定义(1996年修订)的数字音频传输标准,用于数字音频数据在系统内部器件之间传输,例如编解码器Codec、DSP、数字输入/输出接口、ADC、DAC和数字滤波器等。
1.I2S特点
- 支持全双工/半双工
- 支持主/从模式
- 和PCM相比,I2S更适合立体声系统。当然,I2S的变体也支持多通道的时分复用,因此可以支持多声道。
2.主要有三个信号
- 串行始终SCLK,也叫位始终(BCLK),对应数字音频的每一位数据,SCLK都有一个脉冲。SCLK的频率=2 * 采样频率 * 采样位深。
- 帧时钟LRCK(也称WS),用于切换左右声道的数据。LRCK为‘1’表示传输右声道数据,为“0”则是左声道。LRCK的频率 = 采样频率
- 串行数据(SDATA),就是用二进制补码表示的音频数据,(MSB —> LSB:数据由高位到低位依次传输)
- 一般还有MCLK,主时钟
对于I2S的数字接口定义也比较简单,没有从地址或者从设备的概念,在I2S总线上,只能同时存在一个主设备和发送设备。在I2S系统中,提供时钟(SCK)的设备为主设备,其常见的系统框图如下:
在I2S传输协议中,数据信号、时钟信号以及控制信号是分开传输的。I2S协议只定义三根信号线:时钟信号SCK、数据信号SD和左右声道选择信号WS。
信号线 | 说明 | 功能 |
---|---|---|
SCK (Serial Clock) | 时钟信号 | 提供同步时钟信号,控制数据位的传输速率。每个时钟周期传输一个数据位。 |
SD (Serial Data) | 数据信号 | 用于传输音频数据。数据按照一定的位宽和顺序通过该线传输。 |
WS (Word Select) | 左右声道选择信号 | 用于指示数据是左声道还是右声道。在一个音频帧中,WS信号通常用于区分左右声道的数据。 |
信号线的具体功能:
-
SCK(时钟信号):时钟信号用于同步音频数据的传输。在一个I2S协议中,SCK通常由主设备提供,其频率与音频数据的传输速率相关。每个SCK周期传输一位数据。
-
SD(数据信号):传输音频数据的线。数据位在每个SCK周期内传输。根据音频格式的不同,数据的位宽和格式可能有所不同(例如,16位、24位、32位等)。
-
WS(左右声道选择信号):WS信号用于区分左右声道。通常,WS信号的一个周期内传输左声道和右声道的数据。在一个时钟周期内,WS信号会从低电平(代表左声道)切换到高电平(代表右声道)。
I2S数据传输基本操作:
- 左声道数据:当WS为低电平时,SD线上传输左声道的数据。
- 右声道数据:当WS为高电平时,SD线上传输右声道的数据。
3.典型I2S信号时序图
三、PCM/TDM
PCM(Pulse Code Modulation)是通过等时间间隔(采样速率)将采样模拟信号数字化的方法。
PCM接口常用于板级音频数字信号的传输,与I2S类似,其实I2S也是PCM的一种特例接口,只不过,I2S的速率会更高,比较适用于传音乐。而PCM通常用于AP处理器与通信MODEM之间的语言数据传输(就是双向打电话数据),对于I2S只能传2个声道的数据,而PCM可以传多达16路数据,采用时分复用的方式,也就是TDM。其接口与I2S类似,电路信号为
- PCM_CLK 数据时钟信号
- PCM_SYNC 帧同步时钟信号
- PCM_IN 接收数据信号
- PCM_OUT 发送数据信号
四、PDM
PDM(Pulse Density Modulation)是一种数字信号表示模拟信号的调制方法,声音通过传感器获得模拟信号,经过AD,得到音频数字信号,然后经过PDM脉冲转换成数字信号。PDM使用远高于PCM采样率的时钟采用调制模拟分量,只有1位输出,要么是0,要么是1。
PDM方式的逻辑相对复杂,但只需要两根线,时钟和数据。对于下图,主设备为两个从设备提供时钟,分别在时钟的上升沿和下降沿触发选择Source 1/2作为数据输入。
PDM在诸如手机和平板等对于空间限制严格的场合有着广泛的应用前景。在数字麦克风领域,应用最广的就是PDM接口,其次为I2S接口。