高级 Linux 音频架构
高级 Linux 音频架构 (ALSA) 提供了内核驱动的声卡驱动程序。它取代了最初的开放声音系统 (OSS)。
除了声卡驱动程序之外,ALSA 还为应用程序开发人员捆绑了一个用户空间驱动的库。他们可以使用这些 ALSA 驱动程序进行高级 API 开发。这使得可以通过 ALSA 库直接(内核)与声卡设备进行交互。
安装
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.service
和 alsa-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_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:
字段旁边找到。
取消 5.1/7.1 声道静音
要获得完整的 5.1 或 7.1 环绕声,您可能需要取消其他通道的静音,例如 Front
、Surround
、Center
、LFE
(低音炮)和 Side
。(这些是带有 Intel HD Audio 的通道名称;它们可能因不同的硬件而异)
启用麦克风
要启用麦克风,请按 F4
切换到 Capture 选项卡,然后按 Space
键启用一个通道。如果麦克风不工作,请参阅 /Troubleshooting#麦克风。
测试您的更改
接下来,测试声音是否工作
$ 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,可能还需要取消
Front
和Headphone
通道的静音并进行调整。
- 如果您的音量调整在重启后似乎丢失了,请尝试以 root 身份运行 alsamixer。
驱动配置
更多信息,请参阅 Advanced Linux Sound Architecture - 驱动配置指南。
要重新加载 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。
对于 USB 设备,运行 lsusb --verbose --tree | grep --after-context=1 'Class=Audio'
。
运行 lsmod | grep '^snd'
以获取已加载的声音模块的完整列表。
运行 cat /proc/asound/cards
以获取您的声卡列表及其对应的索引(卡号)。
- 有关
/proc/asound/cards
的格式,请参阅 ALSA 库 API 控制接口的通用概述部分。 - 有关
/proc/asound
procfs 树的常规信息,请参阅 ALSA 驱动程序的 Proc 文件。
运行 cat /proc/asound/modules
以获取卡索引及其对应的模块名称。
声卡索引
如果您想更改声卡顺序(或者如果您的声卡顺序在启动时发生变化,并且您想使其永久化),请使用 snd
模块的 slots
选项为给定的驱动程序保留索引。另请参阅 内核模块#设置模块选项。
以下示例假设您希望您的 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
模块允许使用vid
和pid
选项指定声卡,因此您不必依赖 udev 的顺序。
参见
禁用声卡
要禁用由给定内核模块控制的所有声卡,请使用 install 或 module_blacklist 方法阻止模块加载。
要选择应禁用哪个声卡,请使用内核模块的 enable
选项。例如,禁用模块操作的第二个声卡
/etc/modprobe.d/alsa-base.conf
options module_name enable=1,0
另请参阅 /Troubleshooting#Codec probing 以了解 HD Audio 声卡编解码器禁用。
库配置
系统配置文件是 /etc/asound.conf
,用户配置文件是 ~/.asoundrc
。
库配置的语法——即空格、行连续符、注释、包含配置文件、标点符号(分隔符)、赋值、复合赋值、操作模式——在 配置文件 中进行了解释。
ALSA 库配置为库的每个实例加载,因此要重新加载它,您只需重新启动正在使用它的程序。
更多信息,请参阅
- 配置 ALSA
- .asoundrc 文章 在 ALSA 非官方 Wiki 上
- .asoundrc 文章 在 ALSA 项目 Wiki 上
基本语法
操作模式
解析节点有不同的操作模式,默认模式是合并和创建。如果操作模式是合并/创建或合并,则会进行类型检查。只有相同类型的赋值才能合并,因此字符串不能与整数合并。尝试在默认操作模式下将简单赋值定义为复合赋值(反之亦然)也行不通。
操作模式的前缀
+
— 合并和创建-
— 合并?
— 不要覆盖!
— 覆盖
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;
正确使用覆盖操作模式通常是安全的;但是,应该记住,节点中可能存在其他必要的键以实现正常功能。
嵌套
有时,在配置中使用嵌套可能很有用,甚至更易于阅读。
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。只要不使用特殊字符,使用双引号表示字符串不是强制性的,理想情况下永远不应该出现这种情况。这在其他赋值中可能无关紧要。
通过 defaults 节点设置默认声卡
将关于 defaults.pcm.card 和 defaults.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
获取名称,也可以使用 surround51 等 PCM。但是,如果您需要使用麦克风,最好选择全双工 PCM 作为默认值。
现在,您可以在启动程序时通过更改环境变量 ALSAPCM
来选择声卡。它适用于所有不允许选择声卡的程序;对于其他程序,请确保保留默认声卡。例如,假设您编写了一个名为 mix51to20
的下混 PCM,您可以使用命令行 ALSAPCM=mix51to20 mplayer example_6_channel.wav
与 mplayer 一起使用它
替代方法
首先,您必须找出要设置为默认值的声卡和设备 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
pcm
选项影响将哪个声卡和设备用于音频播放,而 ctl
选项影响控制实用程序(如 alsamixer)使用哪个声卡。
更改应在您(重新)启动应用程序(例如 MPlayer)后立即生效。您也可以使用 aplay 等命令进行测试
$ aplay -D default:PCH your_favourite_sound.wav
如果您收到有关 asound 配置的错误,请查看上游文档以了解配置文件格式的可能更改。
插件
安装 alsa-plugins 软件包,如果您需要启用 #上混、#下混、#高质量重采样和其他高级功能。
更多信息,请参阅 PCM(数字音频)插件。
软件混音
混音使多个应用程序能够同时输出声音。大多数独立声卡都支持硬件混音,如果可用,则默认启用硬件混音。集成主板声卡(如 Intel HD Audio)通常不支持硬件混音。在这些声卡上,软件混音由名为 dmix
的 ALSA 插件完成。如果硬件混音不可用,则会自动启用此功能。
dmix
,并且需要以下配置代码段。要手动启用 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" }
pcm.!default "plug:surround51"
或 pcm.!default "plug:surround40"
。只能使用一个 vdownmix
插件;如果你有 7.1 声道,你将需要使用 surround71
而不是上面的配置。一个好的例子,其中包含使 vdownmix
和 dmix
都工作的配置,可以在 [2] 中找到。多频段均衡器
多频段均衡器 (mbeq)
- 是一个相当典型的多频段图形均衡器。它使用 快速傅里叶变换 (FFT) 实现,因此它需要相当多的 CPU 功率,但应该比等效的滤波器实现具有更少的相位效应。如果输入信号的采样率太低,那么顶部频段将被忽略——最高的有用频段将始终是高频搁架式滤波器。
mbeq 是 Steve Harris' LADSPA 插件套件 的一部分。
如果你还没有安装,请安装 alsa-plugins、ladspa 和 swh-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_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 驱动程序在启用重采样时具有不正确的延迟报告(因此导致 AV 不同步),因此除非你配置它们使用 ALSA 重采样,否则更改此设置将没有任何效果。
启动时禁用自动静音
自动静音模式 可以在启动时使用 amixer 进行配置。例如,要禁用它
# amixer -c 0 sset "Auto-Mute Mode" Disabled
或者,可以通过 alsamixer 使用基于 ncurses 的界面。为了保存任何修改,请使用
# alsactl store
或者
# alsactl daemon
另请参阅 #ALSA 和 systemd。
热插拔 USB 声卡
请参阅 为 ALSA 编写 Udev 规则。
同时输出
你可能想通过迷你插孔连接的外部扬声器和内部扬声器同时播放音乐。这可以通过使用 `alsamixer` 或 `amixer` 取消静音 自动静音 项来完成
$ 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,对于播放设备应设置为 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 用于声音的应用程序使用 ALSA。用法很简单
$ apulse application