ALSA - Arch Linux 中文维基

跳转到内容

# ALSA

来自 Arch Linux 中文维基
翻译状态：

- 本文（或部分内容）译自 Advanced_Linux_Sound_Architecture，最近一次同步于 2026-07-10，若英文版本有所更改，则您可以帮助同步与翻译更改的内容。
- 您可以在 ArchWiki 的对应页面找到本文翻译的原始修订历史。
- 本文可能与英文原文存在出入。

相关文章

- /配置范例
- /疑难解答
- PC 扬声器
- PipeWire
- PulseAudio
- 音频系统
- 应用程序列表/多媒体#音量控制

高级 Linux 音频架构（Advanced Linux Sound Architecture, (ALSA)）提供由内核驱动的声卡驱动程序，代替了原来的开放声音系统 (OSS)。

除了音频设备驱动程序外，ALSA 还为应用程序开发者捆绑了一个用户空间驱动的库。开发者可以使用这些 ALSA 驱动进行高级 API 开发。这使得应用程序能够通过 ALSA 库直接与（内核中的）音频设备进行交互。

提示：有关 ALSA 相关术语的（接口/interface、声卡/card、设备/device (注意：声卡不是一个设备)、子设备/subdevice）等的解释，请参见Wikipedia:Advanced Linux Sound Architecture#Concepts。

## 安装

ALSA 驱动是内核的一部分，ALSA 库 (alsa-lib包)通常作为依赖安装，故无需手动安装。

udev会在系统启动时自动检测硬件并选择所需的驱动，并加载相应的声音设备驱动模块。所以你的声卡应当已经可以工作了。

然而，在初始状态下声音可能会被静音。参见#解除通道静音。

### 固件

笔记本电脑通常需要Sound Open Firmware (SOF) (sof-firmware包)——因为这类设备往往采用 Cadence Tensilica Xtensa 架构的数字信号处理器 (DSP)，参见受支持的平台列表。如果缺少固件，日志中会输出类似以下的信息：

    error: sof firmware file is missing
    error: failed to load DSP firmware -2
    error: sof_probe_work failed err: -2

有关更多 SOF 故障排除信息，参见Intel硬件平台概述.

装有Cirrus Logic智能放大器的笔记本电脑需要linux-firmware-cirrus包软件包。另请参见：

- Audio drivers for Cirrus Logic CS35L54/56/57/63 智能增强型放大器的音频驱动，
- archlinux/packaging/packages/linux-firmware#19。

部分 Intel 音频设备需要安装linux-firmware-intel包软件包。

alsa-firmware包软件包包含了某些声卡可能需要的固件。

另请参见#声卡与模块和Linux固件。

### ALSA 实用程序

安装alsa-utils包软件包。该包包含了alsamixer(1)和amixer(1) 等实用程序。amixer是用于修改音频设置的命令行工具，而alsamixer则为配置音频设备提供了更直观的、基于ncurses的文本界面。

### ALSA 和 Systemd

alsa-utils包 软件包默认包含了 systemd 单元配置文件`alsa-restore.service`和`alsa-state.service`。

在安装时它们会自动安装并激活（通过软件包提供的指向sound.target的符号链接）。选项如下所述：

- `alsa-restore.service`默认在启动时读取`/var/lib/alsa/asound.state`，并在关机时写入更新值。前提是`/etc/alsa/state-daemon.conf`文件不存在，除非用户主动创建。

- `alsa-state.service`以守护进程模式（重新）启动alsactl 以便持续跟踪并持久化保存音量更改，前提是已主动创建了`/etc/alsa/state-daemon.conf`文件。

显然，这两种方法是互斥的，可以根据需求选择两种方法之一。如需编辑这些单元，参考systemd#修改现存单元文件. 你可以用systemctl查看其运行状态。

有关更多信息，参见alsactl(1)。

### 用户权限

本地用户默认拥有播放音频和更改混音器音量的权限。若要允许远程用户使用 ALSA，需要将这些用户添加到`audio`组。

注意：将用户添加到`audio`组会赋予其直接访问设备的权限。请注意，这会导致应用程序能够独占音频输出设备。从而可能破坏多席位 (multi-seat) 系统中的软件或用户快速切换功能。因此，除非有特殊需求，否则默认“不”建议将用户添加至`audio`组。

### OSS 模拟

OSS 模拟是指拦截OSS调用并将其重定向至 ALSA 的功能。该模拟层对于打开老旧的遗留应用程序非常有用，例如，某些尝试直接打开`/dev/dsp`并向其写入音频数据的程序，如果没有 OSS 或模拟库，系统中将不存在`/dev/dsp`设备文件，此类应用程序也就无法发出任何声音。

如果需要让 OSS 应用程序与dmix（软件混音插件）协同工作，还请安装alsa-oss包软件包。

加载 `snd_pcm_oss`和`snd_seq_oss`内核模块。并将其配置为在启动时加载。

## 解除通道静音

ALSA 默认静音所有通道，必须手动解除。

### 使用amixer解除静音

可以使用`amixer`解除声卡的主音量静音状态：

    $ amixer sset Master unmute
    $ amixer sset Speaker unmute
    $ amixer sset Headphone unmute

### 使用alsamixer解除静音

使用`alsamixer`可以解除声卡的静音：

    $ alsamixer

通道下方标有`MM`表示其已经静音，而标有`OO`表示已经启用。

使用`←`和`→`方向键移动到`Master`和`PCM`通道，然后按下`m`键解除静音。

使用`↑`方向键增加音量，直到增益达到`0`dB。增益数值可在左上角`Item:`字段旁边找到。

注意：如果增益设置超过0 dB，音频可能会出现明显的失真。

### 解除 5.1/7.1 声道的静音

若要获得完整的 5.1 或7.1 环绕声，可能还需要解除其它通道的静音，例如`Front`（前置）、`Surround`（环绕）、`Center`（中置）、`LFE`（低音炮）以及`Side`（侧置）等。（这些是Intel HD Audio的通道名称；不同的硬件可能有所差异）。

注意：请注意，这并不会自动将双声道立体声音源（如大多数音乐）混合扩充为多声道。若要实现该功能，参见#声道扩充。

### 启用麦克风

若要启用麦克风，请按下`F4`键切换至 Capture（录音）选项卡，然后按下`Space`键启用对应的通道即可。如果麦克风无法正常工作，参见Advanced Linux Sound Architecture/Troubleshooting#没有麦克风输入。

按下`Esc`键退出 alsamixer。

### 测试配置更改

接下来，测试音频是否正常工作：

    $ speaker-test -c 2

根据扬声器布局修改`-c`参数。例如，对于 7.1 声道，使用`-c 8`：

    $ speaker-test -c 8

如果音频输出到了错误的设备，尝试使用`-D`参数手动指定设备。

    $ speaker-test -D default:PCH -c 8

`-D`参数接受 PCM 通道名称作为值，可以通过运行以下命令获取该名称：

    $ aplay -L | grep :CARD

    default:CARD=PCH  # 'default:PCH' 是传递给 -D 的 PCM 通道名称
    sysdefault:CARD=PCH
    front:CARD=PCH,DEV=0
    surround21:CARD=PCH,DEV=0
    surround40:CARD=PCH,DEV=0
    surround41:CARD=PCH,DEV=0
    surround50:CARD=PCH,DEV=0
    surround51:CARD=PCH,DEV=0
    surround71:CARD=PCH,DEV=0

### 补充说明

- 如果系统中有多个声卡，可以按下`F6`键进行切换。

- 某些声卡需要将数字输出静音或禁用才能听到模拟音频，反之亦然。

- 某些机器，如（Thinkpad T61）拥有`Speaker`声道，该通道同样需要解除静音并进行调整。

- 某些机器（如Dell E6400）可能还需要对`Front`和`Headphone`通道取消静音并进行调整。

- 如果重启以后声音调整似乎失效了，尝试以root权限运行alsamixer。

## 驱动配置

更多信息，参见高级Linux音频架构-驱动程序配置指南.

若要重新加载 ALSA 驱动程序配置，必须重新加载相应的模块。在此之前，必须停止所有正在使用该 ALSA 驱动的进程（例如PipeWire）。请使用fuser(1)要使用声音设备文件：

    # fuser --all --verbose /dev/snd/*

另请参见：

- ALSA声卡矩阵 (ALSA SoundCard Matrix)

- alsactl(1)

- 内核模块#手动加载模块

### 声卡和模块

运行`lspci -k -nn -d ::0403`可以识别 PCI 设备正在使用的模块。

提示：

- `::0403`表示多媒体音频控制器 (Multimedia audio controller)，是 多媒体控制器 (Multimedia controller) PCI 设备类下的子类。
- `::0403` 表示 音频设备 (Audio device) 子类
- lspci 输出中的 Kernel driver in use（正在使用的内核驱动）即为已加载的模块。

对于USB设备，运行`lsusb --verbose --tree | grep --after-context=1 'Class=Audio'`进行查看。

运行`lsmod | grep '^snd'`可以获取已加载声音模块的完整列表。

运行`cat /proc/asound/cards`可以获取声卡列表及其相应的序号 （声卡编号 ）。

提示：

- 有关`/proc/asound/cards`的格式，请参见 ALSA 库 API 控制接口 (Control Interface)中的概述 (General Overview) 章节。
- 有关 `/proc/asound` procfs 树的通用信息，参见ALSA 驱动程序的 Proc 文件。

运行`cat /proc/asound/modules`可以获取声卡序号及其相应的模块名称。

### 声卡序号

如果要更改声卡顺序（或者你的声卡顺序在启动时发生变动，想要将其固定），可以使用`snd`模块的`slots`选项来预留指定驱动的序号，参见内核模块#S配置模块参数。

提示：slot（插槽） 这一名称源自 OSS，相当于 ALSA 中的术语index（序号）。

以下示例假设无论模块何时加载（例如声卡可能在开始时未插上），都希望 USB声卡始终作为第一块声卡（即序号为`0`）：

    /etc/modprobe.d/alsa-base.conf

    options snd slots=snd_usb_audio

当模块名称前面带有感叹号（`!`）时，对应的序号将分配给除该模块以外的任何模块。例如，将第一个序号（`0`）分配给除`snd_usb_audio`之外的任何模块，以防止 USB 声卡占用该序号：

    options snd slots=!snd_usb_audio

还可以指定序号为`-2`，以指示 ALSA 绝不要将某块声卡用作主声卡：负值会被解析为允许使用序号的位掩码。针对特定模块使用`index`选项来替代前述示例的写法如下：

    options snd_usb_audio index=-2

如果多块声卡使用相同的模块，且它们的顺序始终固定，则只需使用`index`选项即可改变顺序。以下示例假设有两个使用 HD Audio 模块的声卡（例如，板载声卡和独立显卡的 HDMI 输出），并且想要对调它们的序号：

    options snd_hda_intel index=1,0

提示：

- 上述示例应理解为“使用`snd_hda_intel`的第一块声卡分配序号 `1`，第二个分配序号`0`”。哪块声卡排在第一或第二由udev决定。

- ALSA 模块选项通常不仅接受单个值，还接受一个值数组每个值分别用于设置该模块所管理的其中一块声卡的选项。可以通过检查以下命令的输出来确认是否存在值数组（array of） 概念：

      $ modinfo --field=parm module_name | column --separator=':' --table --table-columns-limit=2

只要不发生冲突，`slots`选项可以与`index`选项结合使用：

    options snd slots=,snd_hda_intel,snd_hda_intel,snd_usb_audio,snd_usb_audio,snd_usb_audio
    options snd_hda_intel index=2,1
    options snd_usb_audio index=3,4,5 vid=0xVID_3,0xVID_4,0xVID_5 pid=0xPID_3,0xPID_4,0xPID_5

提示：

- `slots=,`表示“不预留序号0”，这样在系统启动后插入的、未在`snd_usb_audio`选项中列出的某些 USB 声卡就可以成为第一块声卡。
- `snd_usb_audio`模块允许通过`vid`和`pid`选项来指定特定声卡，从而无需依赖来自udev 的识别顺序。

另请参见：

- 多声卡管理 (MultipleCards)

- 多 USB 音频设备 (MultipleUSBAudioDevices)

### 禁用声卡

若要禁用由指定内核模块控制的所有声卡，使用安装或模块黑名单方法来阻止模块加载。

注意：在modprobe.d配置文件中使用blacklist关键字进行黑名单拦截是无法生效的。

若要选择应禁用特定的声卡，请使用内核模块的`enable`选项。例如，禁用某个模块驱动的第二块声卡：

    /etc/modprobe.d/alsa-base.conf

    options module_name enable=1,0

有关禁用 HD Audio 声卡解码器 (codec) 的方法，另请参见/疑难解答#编解码器探测。

## 库配置

系统级配置文件为`/etc/asound.conf`，用户级配置文件为`~/.asoundrc`。

配置文件中解释了库配置的语法，例如空格、行延续、注释，包括配置文件、标点符号（分隔符）、赋值、复合赋值、操作模式等。

ALSA 库配置会在库的每个实例中加载，因此若要重新加载配置，只需重启正在使用该库的程序即可。

有关更多信息，参见:

- 配置 ALSA

- ALSA 非官方wiki上的.asoundrc 文章。

- ALSA项目wiki上的.asoundrc文章。

### 基本语法

#### 操作模式

解析节点时存在不同的操作模式，默认模式为“合并并创建 (merge and create)”。若操作模式为“合并/创建”或“合并”，系统将进行类型检查。由于只有相同类型的赋值才能合并，因此字符串不能与整形数合并。在默认操作模式下，尝试简单赋值定义为复合赋值（或反之）同样无法奏效。

操作模式前缀：

- `+` -- 合并并创建
- `-` -- 合并
- `?` -- 不覆盖 (do not override)
- `!` -- 覆盖 (override)

    操作模式

    # 合并/创建 - 若节点不存在节点则创建。若节点已存在且类型匹配，则将 subkeyN 合并到键值中。
    key.subkeyN valueN;

    # 合并/创建 - 与上述写法等价
    key.+subkeyN valueN;

    # 合并 - 节点 key.subkeyN 必须已经存在，且必须具有相同的物理数据类型
    key.-subkeyN valueN;

    # 不覆盖 - 若 key.subkeyN 节点已存在，则忽略新赋值
    key.?subkeyN valueN;

    # 覆盖 - 删除 subkeyN 及其下方的所有键, 然后创建节点 key.subkeyN
    key.!subkeyN valueN;

在操作正确的前提下，使用覆盖操作模式通常是安全的；然而必须注意，节点中可能还包含维持正常功能所必须的其它键。

警告：由于覆盖操作会删除所有插件定义，导致 ALSA 彻底无法使用因此除非是从零开始构建配置，否则切勿使用`!pcm.key`来覆盖`pcm`节点本身。

#### 嵌套

在配置文件中使用嵌套结构，有时不仅非常实用，且更易于阅读。

    嵌套 PCM 插件

    pcm.azalia {    type hw; card 0	   }
    pcm.!default {    type plug; slave.pcm "azalia"    }

    # 等价于
    pcm.!default {    type plug; slave.pcm {    type hw; card 0;    }    }

    # 同样等价于
    pcm.!default.type plug;
    pcm.default.slave.pcm.type hw;
    pcm.default.slave.pcm.card 0;

### 设置默认声卡

#### 使用"defaults"节点设置默认设备的示例

假设`/usr/share/alsa/alsa.conf`中已配置"defaults"节点，且"defaults.pcm.card"及其对应的"ctl"项赋值均为零（整数类型）。若需要将默认的 PCM 和控制设备设置为（第三块）声卡"2"，或设置为 Azalia 声卡对应的"SB"：

    Defaults 节点

    defaults.ctl.card 2; # 将默认设备与控制端设值为第三块声卡（计数从0开始）。
    defaults.pcm.card 2; # 此操作不会改变数据类型

    defaults.ctl.+card 2; # 与上述写法等价。
    defaults.pcm.+card 2;

    defaults.ctl.-card 2; # 在默认配置下效果相同。但如果 defaults 节点已被删除或
    defaults.pcm.-card 2; # 数据类型已改变，合并 (merge) 操作模式将会报错。

    defaults.pcm.?card 2; # 由于该赋值已存在，此操作不执行任何更改。
    defaults.ctl.?card 2;

    defaults.pcm.!card "SB" # 由于数据类型不同，此处必须使用覆盖（override）操作模式。
    defaults.ctl.!card "SB";

由于使用双引号会自动将值的数据类型设置为字符串，因此在上述示例中，若设置`defaults.pcm.!card "2`，将导致系统保留上一次的默认设备即声卡0）。在不含特殊字符的前提下，字符串并不强制使用双引号（理想状态下也应避免使用特殊字符）。此规则在其它赋值选项中可能不适用。

注意：从配置角度来看，这些设置并不等同于配置一个复合的 "default" PCM 设备。因为大多数用户还会在复合设备中指定寻址类型，虽然最终指向可能相同，但赋值本身仍有区别。此外，`defaults.pcm.card`在 ALSA 配置文件中被多次引用，通常作为各类环境变量优先之后的后备 (fallback) 赋值。

#### 通过默认节点设置默认声卡

#### 通过 defaults 节点设置默认声卡

将前述示例中关于`defaults.pcm.card`和`defaults.pcm.device`的方法投入实际应用：假设系统中存在序号分别为 0 和 1 的两块声卡，若仅需将默认声卡切换为序号 1，可在`/etc/asound.conf`或用户级的`~/.asoundrc`中加入以下配置，以同时修改播放和混音器控制声卡。

    defaults.pcm.card 1
    defaults.ctl.card 1

#### 通过环境变量选择默认 PCM

通常情况下，只需将`ALSA_CARD`设置为设备名称即可。首先通过`aplay -l`获取名称，然后将`ALSA_CARD`设置为冒号之后、括号之前的名称；例如：

`card 1: HDMI [HDA ATI HDMI], device 3: HDMI 0 [HDMI 0]`

此时应设置`ALSA_CARD=HDMI`。

默认的全局配置文件`/usr/share/alsa/alsa.conf`同样会检查其他变量。通过查找该文件中类似`vars [ ... ]`的结构，可归纳出如下映射表：

| 变量名 | 使用方法
--- | --- | ---
1 | ALSA_CARD | pcm.default , pcm.hw , pcm.plughw , ctl.sysdefault , ctl.hw , rawmidi.default , rawmidi.hw , hwdep.hw
2 | ALSA_CTL_CARD | ctl.sysdefault , ctl.hw
3 | ALSA_HWDEP_CARD | hwdep.default , hwdep.hw
4 | ALSA_HWDEP_DEVICE | hwdep.default , hwdep.hw
5 | ALSA_PCM_CARD | pcm.default , pcm.hw , pcm.plughw
6 | ALSA_PCM_DEVICE | pcm.hw , pcm.plughw
7 | ALSA_RAWMIDI_CARD | rawmidi.default , rawmidi.hw
8 | ALSA_RAWMIDI_DEVICE | rawmidi.default , rawmidi.hw

或者，也可以在自己的配置文件中覆盖此行为，建议在全局文件（`/etc/asound.conf`）中操作。添加以下内容：

    pcm.!default {
        type plug
        slave.pcm {
            @func getenv
            vars [ ALSAPCM ]
            default "hw:Audigy2"
        }
    }

在此配置中，同样需要将`Audigy2`替换为实际的设备名称。名称可以通过`aplay -l`获取，也可以使用诸如 surround51 的 PCM。不过在需要使用麦克风的前提下，建议选择全双工（full-duplex）PCM 作为默认值。

配置完成后，只需在启动程序时更改环境变量`ALSAPCM`，即可选择声卡。此方法适用于所有无法在程序内选择声卡的程序；对于其他程序，请确保保留默认声卡。 例如，假设编写了一个名为`mix51to20`的声道折叠 (downmix) PCM，则可以通过以下命令行在mplayer包中调用它：`ALSAPCM=mix51to20 mplayer example_6_channel.wav` mplayer example_6_channel.wav}}

注意：请注意默认的寻址类型。

#### 直接寻址硬件

警告：此设置会导致该设备无法被其他应用程序使用。仅在构建更复杂的`~/.asoundrc`配置时，或者明确需要直接寻址声卡（例如通过`IEC958`进行数字输出，或配置专用的音乐服务器）的前提下，才推荐使用此方法。在没有声音服务器或软件混音支持的前提下，诸如 Chromium 等部分应用程序将无法支持此设置。

首先，必须找出需要设为默认的声卡和设备 ID：

    $ aplay -l

    **** List of PLAYBACK Hardware Devices ****
    card 0: Intel [HDA Intel], device 0: CONEXANT Analog [CONEXANT Analog]
      Subdevices: 1/1
      Subdevice #0: subdevice #0
    card 0: Intel [HDA Intel], device 1: Conexant Digital [Conexant Digital]
      Subdevices: 1/1
      Subdevice #0: subdevice #0
    card 1: JamLab [JamLab], device 0: USB Audio [USB Audio]
      Subdevices: 1/1
      Subdevice #0: subdevice #0
    card 2: Audio [Altec Lansing XT1 - USB Audio], device 0: USB Audio [USB Audio]
      Subdevices: 1/1
      Subdevice #0: subdevice #0

例如，该列表中的最后一项对应的声卡序号（声卡编号）为`2`，声卡 ID 字符串为 `Audio`，设备 ID 为`0`。若要将该声卡设为默认值，可以使用系统级文件`/etc/asound.conf`或用户级文件`~/.asoundrc`。如果文件不存在，则需要手动创建。随后插入对应声卡的以下选项：

    pcm.!default {
        type hw
        card Audio #or card 2
        hint {
            show on # for some applications
        }
    }

    ctl.!default {
        type hw
            card Audio
    }

    pcm.dmixer {
        type dmix
        ipc_key 2048
        slave {
            pcm "hw:Audio" #or "hw:2"
        }
    }

    pcm.dsnooper {
        type dsnoop
        ipc_key 2048
        slave {
            pcm "hw:Audio"
        }
    }

为了解决开机加载顺序不固定的问题，建议使用声卡 ID 字符串来代替数字编号引用。

注意：如果系统内有多块具有相同 ID 字符串的声卡（例如被自动追加了 `_1`、`_2`……等后缀），此方法可能会产生问题。有关更多信息，请参见 识别两个完全相同的音频设备。

`pcm.dmixer`和`pcm.dsnooper`用于为不支持无软件混音环境的应用程序提供备用通道。

本文或本章节的事实准确性存在争议。

原因： 此处应引入通过环境变量等选择 ALSA 设备的通用方法。（在 Talk:ALSA 中讨论）

例如，运行`chromium -alsa-output-device=pcm.dmixer -alsa-input-device=pcm.dsnooper`可以临时为 Chromium 启用混音功能。

`pcm`选项决定了音频播放使用哪块声卡及设备，而`ctl`选项则决定了诸如alsamixer等控制工具使用哪块声卡。

在（重新）启动应用程序（如 MPlayer）后，配置更改应立即生效。也可以使用 aplay 等命令进行测试：

    $ aplay -D default:PCH your_favourite_sound.wav

如果收到有关 asound 配置的错误提示，请检查上游官方文档以获取配置文件格式可能发生的变化。

## 插件

如果需要启用#声道扩充，#声道折叠，#高质量重采样和其它高级功能，请安装插件alsa-plugins包，

有关更多信息，参见PCM（数字音频）插件。

### 软件混音

混音技术允许来自多个应用程序的音频同时输出。大多数独立声卡支持硬件混音，如果硬件支持，此功能默认开启。而主板集成声卡（如 Intel HD Audio）通常不支持硬件混音。在此类集成声卡上，软件混音由名为`dmix`的 ALSA 插件完成。如果硬件混音不可用，此功能会自动激活。

注意：对于不支持硬件混音的声卡，软件混音默认会开启。但`dmix`默认不会对数字输出 (如 S/PDIF 接口) 生效，需要使用以下配置片段进行手动设置。

若要手动启用`dmix`，请将以下内容添加到 ALSA 配置文件中：

    /etc/asound.conf

    pcm.dsp {

        type plug

        slave.pcm "dmix"

    }

### 声道扩充

播放双声道立体声音源（如音乐）时，需要利用声道扩充（又称上混）才能充分利用 5.1 或 7.1 环绕立体声系统。以前，声道扩充很麻烦，且容易出错；但如今已有现成的插件可以轻松搞定。借由 alsa-plugins包 软件包提供的 `upmix` 插件。

接着，在 ALSA 配置文件（`/etc/asound.conf` 或 `~/.asoundrc`）中添加如下内容：

    pcm.upmix71 {
        type upmix
        slave.pcm "surround71"
        delay 15
        channels 8
    }

该范例适用于 7.1 声道的声道扩充。类比该范例，同样能设置 5.1 或 4.0 声道声道扩充。

该设置添加了一个新的用于声道扩充的 pcm 通道。如果希望所有音频源都通过该 pcm 输出，在上述设置后添加如下配置即可：

    pcm.!default "plug:upmix71"

该插件会自动且无缝支持多个音频源同时播放，所以将其设为默认输出是个非常安全的选择。如果该设置没有生效，则需要为声道扩充的 PCM 独立配置一个混音器 (dmixer)：

    pcm.dmix6 {
        type asym
        playback.pcm {
            type dmix
            ipc_key 567829
            slave {
                pcm "hw:0,0"
                channels 6
            }
        }
    }

并使用 dmix6 而非 surround71。如果在播放时遇到声音卡顿、跳音或失真，考虑调大缓冲区大小（buffer_size，；例如调整至 32768），或使用高质量重采样。

### 声道折叠

如需将多声道音源声道折叠（又称下混）为双声道立体声（例如在立体声音响系统上观看带 5.1 声道的电影），请使用alsa-plugins包软件包中包含的 vdownmix 插件。

在配置文件中添加如下内容：

    pcm.!surround51 {
        type vdownmix
        slave.pcm "default"
    }
    pcm.!surround40 {
        type vdownmix
        slave.pcm "default"
    }

注意：仅靠上述配置可能不足以使声道折叠正常工作，参见 [1] 。因此可能需要添加 `pcm.!default "plug:surround51"` 或 `pcm.!default "plug:surround40"`。注意，同时只能使用一个 `vdownmix` 插件；如果你的声音系统是 7.1 声道，则需使用 `surround71` 代替上述配置。一个让 `vdownmix` 和 `dmix` 同时工作的配置文件的示例见 [2] 。

### 多段均衡器

多段均衡器 (Multiband EQ, mbeq) 是一款相当典型的多段图示均衡器。基于快速傅里叶变换（FFT）实现，因此会消耗较多的 CPU 算力，但相位效应（相位失真）比同等的等效滤波器实现更少。如果输入信号的采样率太低，则最高的一些频段将被忽略——此时起作用的最高可用频段将始终是一个高架滤波器 (high shelf)。

mbeq是 Steve Harris 编写的LADSPA 插件集的一部分。

需先安装 alsa-plugins包、ladspa包 和 swh-plugins包 软件包。

- 在 `~/.asoundrc` 或 `/etc/asound.conf` 中添加如下内容：

    /etc/asound.conf

    pcm.eq {
      type ladspa

      # 均衡器 (EQ) 的输出可以直接发送到硬件设备
      # （如果你的声卡支持硬件混音，例如 SBLive/Audigy），
      # 也可以发送到如下所示的软件混音器。
      #slave.pcm "plughw:0,0"
      slave.pcm "plug:dmix"

      # 若需指定插件的存放路径，
      # 尤其是在刚安装完这些插件时，一旦注销或重启，
      # 通常就不需要再指定路径了，但如遇“找不到插件”的错误提示，
      # 可尝试下面这行配置。
      #path "/usr/lib/ladspa"

      plugins [
        {
          label mbeq
          id 1197
          input {
            # 以下设置仅为示例，可根据喜好自行调整
            # 对应频段分别为：
            # 50hz, 100hz, 156hz, 220hz, 311hz, 440hz, 622hz, 880hz
            # 1250hz, 1750hz, 25000hz, #50000hz, 10000hz, 20000hz
            controls [ -5 -5 -5 -5 -5 -10 -20 -15 -10 -10 -10 -10 -10 -3 -2 ]
          }
        }
      ]
     }

     # 将所有默认音频设备重定向至通过此均衡器输出，
     # 建议在确认所有所有配置项均正常工作后再执行此步骤，否则若在中途出现配置错误，
     # 所有的音频程序都可能会报错或崩溃。

     pcm.!default {
      type plug
      slave.pcm "eq"
     }

     # 同时将 OSS 模拟层重定向至均衡器（适用于通过 "aoss" 命令运行的程序）

     pcm.dsp0 {
      type plug
      slave.pcm "eq"
     }

### ALSAEqual

#### 全局设置

安装 alsaequalAUR 软件包。

安装该软件包后，将以下内容添加到 ALSA 配置文件中：

    /etc/asound.conf

    ctl.equal {

        type equal;

    }

    pcm.plugequal {

        type equal;

        # 通常，均衡器会馈入 dmix，以便可以同时播放

        # 来自多个应用程序的音频：

        slave.pcm "plug:dmix";

        # 如需直接馈入某个设备，指定该设备以替换 dmix：

        #slave.pcm "plughw:0,0";

    }

    # 配置 pcm.!default 将使该均衡器成为默认音频输出目的地 (sink)

    pcm.!default {

    # 如果不希望将此均衡器作为默认设备，

    # 可以给它起一个不同的名字，例如下方 pcm.equal

    # 然后可通过在单个应用程序中选定该设备作为输出设备

    # 例如：mpg123 -a equal 06.Back_In_Black.mp3

    # pcm.equal {

        type plug;

        slave.pcm plugequal;

    }

若要更改均衡器设置，请运行：

    $ alsamixer -D equal

请注意，每个用户的均衡器配置都不同（除非另有指定）。 保存在 `~/.alsaequal.bin`中。

因此，若想将 ALSAEqual 与 mpd 或在不同用户下运行的其它软件一起使用，可以使用以下命令进行配置。

    $ su mpd -c 'alsamixer -D equal'

或者，例如，也可以在他们的家目录中创建指向你的`.alsaequal.bin`的符号链接。

#### 仅特定输出

若只想将均衡器应用于特定的输出设备（例如连接到 S/PDIF 输出 domestic 的扬声器，但不包括连接到耳机插孔的耳机），同时又希望能够从多个应用程序输出，并同时输出到这两个输出设备，则需要创建两个直接馈入到其各自设备（`slave.pcm`）的 {ic|dmix}} 设备。以下内容适用于立体声输出并保持常规立体声输入，且仅将均衡器应用于 S/PDIF 输出。

    /etc/asound.conf

    #

    #  (capture.pcm)  <-- dnsoop

    #        |

    # !default                               --> dmixa

    #        |                               |

    #  (playback.pcm) --> stereo2quad ==> quad

    #                                        |

    #                                        --> softvol --> plugequal --> dmixd

    #

    # dmix 用于模拟输出

    pcm.dmixa {

      type dmix

      ipc_key 1024

      ipc_perm 0666

      slave.pcm "hw:PCH,0"

      slave {

         period_time 0

        period_size 1024

        buffer_size 4096

         channels 2

      }

      bindings {

        0 0

        1 1

      }

    }

    # dmix 用于数字输出

    pcm.dmixd {

      type dmix

      ipc_key 2048

      ipc_perm 0666

      slave.pcm "hw:PCH,1"

      slave {

        period_time 0

        period_size 1024

        buffer_size 4096

        channels 2

      }

      bindings {

        0 0

        1 1

      }

    }

    # 带控制功能的均衡器

    pcm.plugequal {

      type equal

      slave {

        pcm "plug:dmixd"

      }

    }

    ctl.equal {

     type equal

    }

    # 用于 S/PDIF 的音量控制

    pcm.softvol {

        type softvol

        slave.pcm "plug:plugequal"

        control {

            name "S/PDIF"

        }

    }

    # 组合：

    # "a" （模拟）  -> dmix,

    # "d" （数字） -> softvol -> plugequal -> dmix

    pcm.quad {

         type multi

         slaves {

          a.pcm "dmixa"

          a.channels 2

          d.pcm "plug:softvol" # 绕道经过 softvol 和均衡器

          d.channels 2

        }

        bindings {

          0 { slave a; channel 0; }

          1 { slave a; channel 1; }

          2 { slave d; channel 0; }

          3 { slave d; channel 1; }

         }

    }

    # 立体声转四声道

    pcm.stereo2quad {

      type route

      slave.pcm "quad"

      ttable [

        [ 1 0 1 0 ]

        [ 0 1 0 1 ]

      ]

    }

    # 播放重定向至立体声转四声道，录音（抓取）按常规处理

    pcm.!default {

      type asym

      playback.pcm "plug:stereo2quad"

      capture.pcm "plug:dnsoop"

    }

#### 状态管理

安装 alsaequal-mgrAUR 软件包。

配置均衡器：

    $ alsamixer -D equal

若对状态感到满意时，可以给它起一个名字（在本例中为 foo）并保存它：

    $ alsaequal-mgr save foo

之后，可以通过以下命令在稍后重新加载名为 "foo" 的状态：

    $ alsaequal-mgr load foo

但是，这只能恢复 `~/.alsaequal.bin` 文件，然后，必须通过 `alsamixer -D equal` 更新均衡器。

因此，你可以为游戏、电影、音乐流派、VoIP 应用程序等创建不同的均衡器状态，并根据需要重新加载它们。

有关更多选项，参阅项目页面和帮助消息。

## 提示与技巧

### 高质量重采样

启用#软件混音混音后，ALSA 会强制将所有音频重采样到相同的频率（在支持的情况下默认为 48 kHz）。默认情况下，它将尝试使用 speexrate 转换器来进行重采样，如果不可用，则回退到低质量的线性插值 (linear interpolation)。因此，如果由于糟糕的重采样导致音质不佳，只需安装alsa-plugins包包即可解决问题。

若要获得更高质量的重采样，则可以将默认速率转换器更改为 `speexrate_medium` 或 `speexrate_best`。这两者在实际使用中表现都足够优秀，以至于选择哪一个并没有太大实际区别，因此通常不值得为使用最好的转换器而消耗额外的 CPU 周期。

要更改默认转换器，请将以下内容加入 `~/.asoundrc` 或 `/etc/asound.conf` 中：

    defaults.pcm.rate_converter "speexrate_medium"

注意：

- 也可以使用 libsamplerate包 转换器，其速度仅为 speexrate 转换器的一半左右，但音质并无显著提升。

- 也可以使用 基于 libavresample 的速率转换器插件 ，此插件使用FFmpeg。`lavcrate_high` 和 `lavcrate_higher` 分别等同于 Kodi 的低质量和中质量重采样器。

- 某些应用程序（如 MPlayer 及其衍生分支）默认执行自己的重采样，因为某些 ALSA 驱动程序在启用重采样时存在延迟报告不准确问题（从而导致音画不同步），因此除非将它们配置为使用 ALSA 重采样，否则更改此设置不会产生任何影响。

### 在启动时禁用自动静音

自动静音模式 (Auto-Mute Mode) 可以在启动时通过 amixer 进行配置。例如，若要禁用它：

     # amixer -c 0 sset "Auto-Mute Mode" Disabled

或者，也可以通过 alsamixer 使用基于 ncurses 的图形化界面。为了保存任何修改，使用：

     # alsactl store

或

     # alsactl daemon

另请参阅 #ALSA 和 systemd.

### 热插拔 USB 声卡

参阅为 ALSA 编写 Udev 规则。

### 同时输出

你可能希望通过通过连接到迷你插孔 (mini jack) 的外置扬声器和内部扬声器同时播放音乐。这可以通过使用`alsamixer`或{ic|amixer}}取消 Auto-Mute（自动静音）项的静音来实现：

    $ amixer sset "Auto-Mute" unmute

然后再取消其它所需项的静音，例如耳机、扬声器、重低音扬声器……

注意：如果耳机连接器（迷你插孔）中出现噼啪声，参阅 /疑难解答#通过耳机插孔有爆裂声。

### 键盘控制音量

将以下命令映射到音量键： `XF86AudioRaiseVolume`、`XF86AudioLowerVolume`、`XF86AudioMute`。

提高音量：

    amixer set Master 5%+

降低音量：

    amixer set Master 5%-

切换静音/取消静音状态：

    amixer set Master toggle

### 使用 snd_aloop 的虚拟音频设备

为了混音不同的音源，你可能希望有一个类似 Jack 的替代方案，来创建一个虚拟的录音或播放设备，这可以通过使用 `snd_aloop` 模块来实现：

    modprobe snd_aloop

使用以下命令列出你的新虚拟设备

    aplay -l

现在你可以使用 ffmpeg 进行操作，例如：

    ffmpeg -f alsa -i hw:1,1,0 -f alsa -i hw:1,1,1 -filter_complex amerge output.mp3

在 hw：R，W，N 这段字段中，R 是你的虚拟声卡设备号。对于录音设备，W 应设置为 1，对于播放设备，W 应设置为 0。N 是你的子设备号。你可以使用所有可用的虚拟设备并使用诸如 mplayer 等应用程序进行播放/停止：

    mplayer -ao alsa:device=hw=1,0,0 fileA
    mplayer -ao alsa:device=hw=1,0,1 fileB

还可以利用这种方法利用如下脚本，使用 festival 将语音生成到录音流中。

    #!/bin/sh
    echo "$1" | iconv -f utf-8 -t iso-8859-1 | text2wave  > "_tmp_.wav"
    mplayer -ao alsa:device=hw=2,0,0 "_tmp.wav"
    rm "_tmp.wav"

### 重新配置输入/输出端口

alsa-tools包 软件包包含 hdajackretask 工具，该工具可用于（在 Intel HDA 声卡上）重新配置声卡的输入/输出端口；例如，将麦克风插孔变成耳机插孔。

### apulse

apulseAUR 提供了对 PulseAudio API 的替代性部分实现。它允许你将 ALSA 用于仅支持 PulseAudio 音频的应用程序。用法很简单：

    $ apulse application

## 参见

- ALSA 项目维基

- ALSA 非官方 wiki

- ALSA 的近距离观察

- Linux ALSA 声音笔记

- Pulse-code 调制 (PCM)

分类：​

- 声音

隐藏分类：​

- 使用“模板:准确性”标记的页面或章节

ALSA
添加话题