高级 Linux 声音架构

来自 ArchWiki
(重定向自 Hdajackretask

高级 Linux 声音架构 (ALSA) 提供了 内核 驱动的声音卡驱动程序。它取代了最初的 开放声音系统 (OSS)。

除了声音设备驱动程序,ALSA 还捆绑了一个用户空间驱动的库,供应用程序开发人员使用。他们可以使用这些 ALSA 驱动程序进行高级 API 开发。这使得可以通过 ALSA 库直接(内核)与声音设备进行交互。

提示: 关于 ALSA 相关术语的解释——接口声卡设备声卡 不是 设备)、子设备 以及更多——可以在 Wikipedia:高级 Linux 声音架构#概念 中找到。

安装

ALSA 驱动程序是 Linux 内核的一部分。ALSA 库 (alsa-lib) 通常作为 依赖项 安装。因此,手动安装不是必需的。

udev 将在启动时自动检测您的硬件并选择所需的驱动程序,因此,您的声音应该已经可以工作了。

但是,您的声音最初可能是静音的。如果是这样,请参阅 #取消通道静音

固件

声音开放固件 (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 硬件平台概述。另请参阅 #声卡和模块

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

ALSA 工具

安装 alsa-utils 软件包。这包含(以及其他实用程序)alsamixer(1)amixer(1) 实用程序。amixer 是一个用于更改音频设置的 shell 命令,而 alsamixer 提供了一个更直观的基于 ncurses 的界面,用于音频设备配置。

ALSA 和 systemd

alsa-utils 软件包默认带有 systemd 单元配置文件 alsa-restore.servicealsa-state.service

这些在安装期间自动安装和激活(通过软件包提供的到 sound.target 的符号链接)。选项如下

  • alsa-restore.service 在启动时读取 /var/lib/alsa/asound.state,并在关机时写入更新的值,前提是 /etc/alsa/state-daemon.conf 不存在。由于 /etc/alsa/state-daemon.conf 不是在用户有意识的操作下创建的,因此它是默认方法。
  • alsa-state.service (重新) 启动 alsactl 以守护进程模式持续跟踪和持久化音量更改,条件是用户已经有意识地创建了 /etc/alsa/state-daemon.conf

显然,这两种方法是互斥的。您可以根据您的需求决定采用哪种方法。要编辑这些单元,请参阅 systemd#编辑提供的单元。您可以使用 systemctl 检查其状态。

有关更多信息,请参阅 alsactl(1)

用户权限

本地用户有权播放音频和更改混音器音量。要允许远程用户使用 ALSA,您需要将这些用户 添加audio 组。

注意: 将用户添加到 audio 组允许直接访问设备。请记住,这允许应用程序独占地保留输出设备。这可能会破坏多席位系统上的软件混音或快速用户切换。因此,除非您明确 需要,否则默认情况下建议将用户添加到 audio 组。

OSS 模拟

OSS 模拟 是指拦截 OSS 调用并通过 ALSA 重新路由它们的能力。这种模拟层对于尝试打开 /dev/dsp 并直接向其写入声音数据的旧应用程序非常有用。如果没有 OSS 或模拟库,/dev/dsp 将会缺失,并且应用程序将不会产生任何声音。

如果您希望 OSS 应用程序与 dmix 一起工作,请同时安装 alsa-oss 软件包。

加载 snd_pcm_osssnd_seq_oss 内核模块。配置它们以在 启动时加载

取消通道静音

默认情况下,ALSA 的所有通道都是静音的。这些必须手动取消静音。

使用 amixer 取消静音

可以使用 amixer 取消声卡主音量静音

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

使用 alsamixer 取消静音

可以使用 alsamixer 取消声卡静音

$ alsamixer

通道下方的 MM 标签表示该通道已静音,而 OO 表示该通道已打开。

使用 键滚动到 MasterPCM 通道,然后按 m 键取消静音。

使用 键增加音量,并获得 0 dB 增益值。增益可以在左上方 Item: 字段旁边找到。

注意: 如果增益设置高于 0 dB,可能会出现可听见的失真。

取消 5.1/7.1 声道静音

要获得完整的 5.17.1 环绕声,您可能需要取消其他通道的静音,例如 FrontSurroundCenterLFE(低音炮)和 Side。(这些是带有 Intel HD Audio 的通道名称;它们可能因硬件而异)

注意: 请注意,这不会自动上混立体声源(如大多数音乐)。为了实现这一点,请参阅 #上混

启用麦克风

要启用麦克风,请使用 F4 切换到 Capture 选项卡,然后使用 Space 启用通道。如果麦克风不工作,请参阅 /故障排除#麦克风

测试您的更改

接下来,测试声音是否工作

$ 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' is the PCM channel name for -D
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,可能还需要取消 FrontHeadphone 通道的静音并进行调整。
  • 如果您的音量调整在重启后似乎丢失了,请尝试以 root 身份运行 alsamixer

驱动程序配置

有关更多信息,请参阅 高级 Linux 声音架构 - 驱动程序配置指南

要重新加载 ALSA 驱动程序配置,您必须重新加载相应的模块。在执行此操作之前,必须停止所有使用相应 ALSA 驱动程序的进程——例如 PipeWire。要识别使用声音 设备文件 的进程,请使用 fuser(1)

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

参见

声卡和模块

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

提示
  • ::0403 这里指的是 音频设备 子类,属于多媒体控制器 PCI 设备类。
  • lspci 输出中的 Kernel driver in use 已加载的模块。Kernel modules能够处理设备的,请参阅 lspci(8) § k

运行 lsusb --verbose --tree | grep --after-context=1 'Class=Audio' 以获取 USB 设备。

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

运行 cat /proc/asound/cards 以获取声卡列表及其对应的索引声卡编号)。

提示

运行 cat /proc/asound/modules 以获取带有对应模块名称的声卡索引。

声卡索引

如果您想更改声卡顺序(或者如果您的声卡顺序在启动时发生变化,并且您想使其永久化),请使用 snd 模块的 slots 选项为给定的驱动程序 保留 索引。另请参阅 内核模块#设置模块选项

提示: 名称 slot 来自 OSS,等同于 ALSA 术语 index

以下示例假设您希望您的 USB 声卡始终是第一个(即索引为 0),无论何时加载模块(例如,声卡可能在启动时被拔下)

/etc/modprobe.d/alsa-base.conf
options snd slots=snd_usb_audio

当模块名称前缀为感叹号 (!) 时,对应的索引将分配给除该名称之外的任何模块。例如,为除 snd_usb_audio 之外的任何模块保留第一个索引 (0),以避免 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=, 表示“不保留索引零”,因此例如,在启动后插入的某些 USB 声卡(未在 snd-usb-audio 选项中提及)可能是第一个。
  • snd_usb_audio 模块允许使用 vidpid 选项指定声卡,因此您不必依赖 udev 的顺序。

参见

禁用声卡

要禁用由给定内核模块控制的所有声卡,请使用 installmodule_blacklist 方法 阻止模块加载

注意: 使用 modprobe.d 配置文件中的 blacklist 关键字进行黑名单操作不起作用

要选择应禁用哪个声卡,请使用内核模块的 enable 选项。例如,禁用模块操作的第二个声卡

/etc/modprobe.d/alsa-base.conf
options module_name enable=1,0

另请参阅 /故障排除#Codec 探测,了解 HD Audio 声卡编解码器禁用。

库配置

系统配置文件是 /etc/asound.conf,每个用户的配置文件是 ~/.asoundrc

库配置的语法——即空格、行继续、注释、包含配置文件、标点符号(分隔符)、赋值、复合赋值、操作模式——在 配置文件 中进行了解释。

ALSA 库配置为库的每个实例加载,因此要重新加载它,您只需重新启动正在使用它的程序即可。

有关更多信息,请参阅

基本语法

操作模式

解析节点有不同的操作模式,默认模式是合并和创建。如果操作模式是合并/创建或合并,则会进行类型检查。只能合并相同类型的赋值,因此字符串不能与整数合并。尝试在默认操作模式下将简单赋值定义为复合(反之亦然)也行不通。

操作模式的前缀

  • + — 合并和创建
  • - — 合并
  • ? — 不要覆盖
  • ! — 覆盖
Operation modes
# Merge/create - If a node does not exist, it is created. If it does exist and types match,
# subkeyN is merged into key.
key.subkeyN valueN;

# Merge/create - Equivalent to above
key.+subkeyN valueN;

# Merge - Node key.subkeyN must already exist and must have same data type
key.-subkeyN valueN;

# No override - Ignore new assignment if key.subkeyN node already exists
key.?subkeyN valueN;

# Override - Removes subkeyN and all keys below it, then creates node key.subkeyN
key.!subkeyN valueN;

正确使用覆盖操作模式通常是安全的;但是,应该记住,节点中可能还有其他必要的键才能正常运行。

警告: 覆盖 pcm 节点本身肯定会使 alsa 无法使用,因为每个插件定义都将被删除。因此,除非您从头开始进行配置,否则不要使用 !pcm.key

嵌套

有时,在配置中使用嵌套可能很有用,甚至更容易阅读。

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

# is equivalent to

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

# which is also equivalent to

pcm.!default.type plug;
pcm.default.slave.pcm.type hw;
pcm.default.slave.pcm.card 0;

设置默认声卡

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

假设 "defaults" 节点在 /usr/share/alsa/alsa.conf 中设置,其中 "defaults.pcm.card" 及其 "ctl" 对应项的赋值值为 "0"(整数类型),用户想要将默认 pcm 和控制设备设置为(第三个)声卡 "2" 或 Azalia 声卡的 "SB"。

Defaults node
defaults.ctl.card 2; # Sets default device and control to third card (counting begins with 0).
defaults.pcm.card 2; # This does not change the data type.

defaults.ctl.+card 2; # Equivalent to above.
defaults.pcm.+card 2;

defaults.ctl.-card 2; # Same effect on a default setup, however if defaults node was removed or
defaults.pcm.-card 2; # type has been changed, merge operation mode will result in error.

defaults.pcm.?card 2; # This does nothing, since this assignment already exists.
defaults.ctl.?card 2;

defaults.pcm.!card "SB"; # The override operation mode is necessary here, because of
defaults.ctl.!card "SB"; # different value types.

在此处使用双引号会自动将值数据类型设置为字符串,因此在上面的示例中,将 defaults.pcm.!card "2" 设置为字符串将导致保留最后一个默认设备,在本例中为声卡 0。只要不使用特殊字符,使用双引号表示字符串不是强制性的,理想情况下永远不应该出现这种情况。这在其他赋值中可能无关紧要。

注意: 从配置的角度来看,这些与设置复合 "default" pcm 设备并不等效,因为大多数用户也在其中指定了寻址类型,这实际上可能相同,但赋值本身仍然不同。此外,defaults.pcm.card 在 alsa 配置文件中被多次引用,通常作为回退赋值,其中不同的环境变量优先。

通过 defaults 节点设置默认声卡

将关于 defaults.pcm.carddefaults.pcm.device先前示例 应用于实践,假设我们有 2 个索引分别为 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 获取名称,也可以使用 PCM,如 surround51。但是,如果您需要使用麦克风,最好选择全双工 PCM 作为默认值。

现在,您可以通过仅更改环境变量 ALSAPCM 在启动程序时选择声卡。它适用于所有不允许选择声卡的程序;对于其他程序,请确保您保留默认声卡。例如,假设您编写了一个名为 mix51to20 的下混 PCM,您可以使用命令行 ALSAPCM=mix51to20 mplayer example_6_channel.wav 将其与 mplayer 一起使用

注意: 注意默认寻址类型。

其他方法

提示: 可以使用 asoundconfAUR 部分自动化此过程。

首先,您必须找出要设置为默认值的声卡和设备 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
警告: 简单地将 type hw 设置为默认声卡等同于直接寻址硬件,这会使设备对其他应用程序不可用。仅当它是更复杂的设置 ~/.asoundrc 的一部分,或者用户有意直接寻址声卡(通过 IEC958 的数字输出或专用音乐服务器,例如)时,才建议使用此方法。

例如,此列表中的最后一个条目具有声卡索引(声卡编号)2 和设备 ID 0。要将此声卡设置为默认声卡,您可以使用系统范围的文件 /etc/asound.conf 或用户特定的文件 ~/.asoundrc。如果文件不存在,您可能需要创建它。然后插入以下选项以及相应的声卡。

pcm.!default {
   type hw
   card 2
}

ctl.!default {
   type hw
   card 2
}

在大多数情况下,建议使用声卡 ID 字符串而不是数字引用。声卡 ID 更容易理解,并且还可以克服启动顺序问题。因此,以下内容对于上述示例是正确的

pcm.!default {
   type hw
   card Audio
}

ctl.!default {
   type hw
   card Audio
}

要获取有效的 ALSA 声卡 ID,请使用 aplay

$ aplay -l | awk -F \: '/,/{print $2}' | awk '{print $1}' | uniq
PCH

或者,使用 cat,它可能会返回未使用的设备

$ cat /proc/asound/card*/id
PCH
ThinkPadEC
注意: 如果您的系统有多个具有相同 ID 字符串的声卡(带有 _1_2、… 后缀),则此方法可能存在问题。有关更多信息,请参阅 识别两个相同的音频设备

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 声道系统,您需要使用升混。在过去,这曾经很棘手且容易出错,但如今,已经有插件可以轻松完成此任务。我们将使用 upmix 插件,该插件包含在 alsa-plugins 软件包中。

然后将以下内容添加到您选择的 ALSA 配置文件中 (/etc/asound.conf~/.asoundrc)

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

您可以轻松地将此 7.1 升混示例更改为 5.1 或 4.0。

以下示例添加了一个新的 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 声道的电影,请使用 vdownmix 插件,该插件包含在 alsa-plugins 软件包中。

同样,在您的配置文件中,添加以下内容

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 而不是上面的配置。一个很好的例子,其中包含使 vdownmixdmix 都工作的配置,可以在 [2] 中找到。

多频段均衡器

多频段均衡器 (mbeq)

是一个相当典型的多频段图形均衡器。它使用 快速傅里叶变换 (FFT) 实现,因此它会占用相当多的 CPU 功率,但应该比等效的滤波器实现具有更少的相位效应。如果输入信号的采样率太低,则顶部频段将被忽略——最高有用的频段将始终是高搁架式。

mbeq 是 Steve Harris 的 LADSPA 插件套件 的一部分。

如果您尚未安装,请安装 alsa-pluginsladspaswh-plugins 软件包。

如果您尚未创建 ~/.asoundrc/etc/asound.conf 文件,请创建一个并插入以下内容

/etc/asound.conf
pcm.eq {
    type ladspa

    # The output from the EQ can either go direct to a hardware device
    # (if you have a hardware mixer, e.g. SBLive/Audigy) or it can go
    # to the software mixer shown here.
    #slave.pcm "plughw:0,0"
    slave.pcm "plug:dmix"

    # Sometimes, you may need to specify the path to the plugins,
    # especially if you have just installed them.  Once you have logged
    # out/restarted, this should not be necessary, but if you get errors
    # about being unable to find plugins, try uncommenting this.
    #path "/usr/lib/ladspa"

    plugins [
    {
        label mbeq
        id 1197
        input {
            # The following setting is just an example, edit to your own taste:
            # bands:
            #   50 Hz,  100 Hz,  156 Hz,  220 Hz,  311 Hz,   440 Hz,   622 Hz,  880 Hz,
            # 1250 Hz, 1750 Hz, 2500 Hz, 3500 Hz, 5000 Hz, 10000 Hz, 20000 Hz
            controls [ -5 -5 -5 -5 -5 -10 -20 -15 -10 -10 -10 -10 -10 -3 -2 ]
            }
        }
    ]
}

# Redirect the default device to go via the EQ - you may want to do
# this last, once you are sure everything is working.  Otherwise, all
# your audio programs will break/crash if something has gone wrong.
pcm.!default {
    type plug
    slave.pcm "eq"
}

# Redirect the OSS emulation through the EQ too (when programs are running through "aoss")
pcm.dsp0 {
    type plug
    slave.pcm "eq"
}

ALSAEqual

系统范围

安装 alsaequalAUR 软件包。

安装软件包后,将以下内容添加到您的 ALSA 配置文件中

/etc/asound.conf
ctl.equal {
    type equal;
}

pcm.plugequal {
    type equal;
    # Normally, the equalizer feeds into dmix so that audio
    # from multiple applications can be played simultaneously:
    slave.pcm "plug:dmix";
    # If you want to feed directly into a device, specify it instead of dmix:
    #slave.pcm "plughw:0,0";
}

# Configuring pcm.!default will make the equalizer your default sink
pcm.!default {
# If you do not want the equalizer to be your default,
# give it a different name, like pcm.equal commented below
# Then you can choose it as the output device by addressing
# it in individual apps, for example 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 输出的扬声器,而不是连接到耳机插孔的耳机),但又希望能够从多个应用程序输出并同时输出到两个输出设备,您需要创建两个 dmix 设备,它们直接馈送到各自的设备 (slave.pcm)。以下配置适用于立体声输出并保持常规立体声输入,仅对 S/PDIF 输出应用均衡器。

/etc/asound.conf
#
#  (capture.pcm)  <-- dnsoop
#        |
# !default                               --> dmixa
#        |                               |
#  (playback.pcm) --> stereo2quad ==> quad
#                                        |
#                                        --> softvol --> plugequal --> dmixd
#

# dmix for analog output
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 for digital output
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
  }
}

# equalizer with controls
pcm.plugequal {
  type equal
  slave {
    pcm "plug:dmixd"
  }
}
ctl.equal {
 type equal
}

# Volume control for S/PDIF
pcm.softvol {
    type softvol
    slave.pcm "plug:plugequal"
    control {
        name "S/PDIF"
    }
}

# multi:
# "a" (analog)  -> dmix,
# "d" (digital) -> softvol -> plugequal -> dmix
pcm.quad {
    type multi
    slaves {
      a.pcm "dmixa"
      a.channels 2
      d.pcm "plug:softvol" # detour via softvol and equalizer
      d.channels 2
    }
    bindings {
      0 { slave a; channel 0; }
      1 { slave a; channel 1; }
      2 { slave d; channel 0; }
      3 { slave d; channel 1; }
    }
}

# stereo to quad
pcm.stereo2quad {
  type route
  slave.pcm "quad"
  ttable [
    [ 1 0 1 0 ]
    [ 0 1 0 1 ]
  ]
}

# playback to stereo to quad, capture as usual
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 转换器来执行此操作,如果不可用,则回退到低质量的线性插值。因此,如果您因不良重采样而获得较差的音质,只需安装 alsa-plugins 软件包即可解决问题。

为了获得更高质量的重采样,您可以将默认速率转换器更改为 speexrate_mediumspeexrate_best。 两者的性能都足够好,以至于在实践中选择哪个都无关紧要,因此使用最佳转换器通常不值得它需要的额外 CPU 周期。

要更改默认转换器,请将以下内容放入您的 ~/.asoundrc/etc/asound.conf

defaults.pcm.rate_converter "speexrate_medium"
注意
  • 也可以使用 libsamplerate 转换器,它们的速度只有 speexrate 转换器的一半左右,但并没有实现更高的质量。
  • 也可以使用 使用 libavresample 的速率转换器插件,它使用 FFmpeglavcrate_highlavcrate_higher 分别等同于 Kodi质量重采样器。
  • 某些应用程序(如 MPlayer 及其分支)默认情况下会执行自己的重采样,因为某些 ALSA 驱动程序在启用重采样时具有不正确的延迟报告(因此导致音视频不同步),因此除非您将它们配置为使用 ALSA 重采样,否则更改此设置不会有任何效果。

启动时禁用自动静音

自动静音模式 可以在启动时使用 amixer 进行配置。例如,要禁用它

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

或者,可以通过 alsamixer 使用基于 ncurses 的界面。为了保存任何修改,请使用

# alsactl store

# alsactl daemon

另请参阅 #ALSA 和 systemd

热插拔 USB 声卡

请参阅 为 ALSA 编写 Udev 规则

同时输出

您可能希望同时通过迷你插孔连接的外部扬声器和内部扬声器播放音乐。这可以通过使用 alsamixeramixer 取消 自动静音 项来实现

$ amixer sset "Auto-Mute" unmute

然后取消静音其他需要的项目,例如 耳机扬声器低音扬声器...

注意: 如果之后通过耳机连接器(迷你插孔)发出噼啪声,请参阅 /Troubleshooting#通过迷你插孔(耳机连接器)发出噼啪声

键盘音量控制

映射 以下命令到您的音量键:XF86AudioRaiseVolumeXF86AudioLowerVolumeXF86AudioMute

提高音量

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,对于播放设备应设置为 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 的替代部分实现PulseAudio 它允许您为仅支持 PulseAudio 音频的应用程序使用 ALSA。用法很简单

$ apulse application

参见