ALSA
高级 Linux 音频架构(Advanced Linux Sound Architecture, (ALSA))提供由内核驱动的声卡驱动程序,代替了原来的开放声音系统 (OSS)。
除了音频设备驱动程序外,ALSA 还为应用程序开发者捆绑了一个用户空间驱动的库。开发者可以使用这些 ALSA 驱动进行高级 API 开发。这使得应用程序能够通过 ALSA 库直接与(内核中的)音频设备进行交互。
安装
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包软件包包含了某些声卡可能需要的固件。
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键解除静音。
使用↑方向键增加音量,直到增益达到0dB。增益数值可在左上角Item:字段旁边找到。
解除 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/*
另请参见:
声卡和模块
运行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/asoundprocfs 树的通用信息,参见ALSA 驱动程序的 Proc 文件。
运行cat /proc/asound/modules可以获取声卡序号及其相应的模块名称。
声卡序号
如果要更改声卡顺序(或者你的声卡顺序在启动时发生变动,想要将其固定),可以使用snd模块的slots选项来预留指定驱动的序号,参见内核模块#S配置模块参数。
以下示例假设无论模块何时加载(例如声卡可能在开始时未插上),都希望 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 的识别顺序。
另请参见:
禁用声卡
若要禁用由指定内核模块控制的所有声卡,使用安装或模块黑名单方法来阻止模块加载。
若要选择应禁用特定的声卡,请使用内核模块的enable选项。例如,禁用某个模块驱动的第二块声卡:
/etc/modprobe.d/alsa-base.conf
options module_name enable=1,0
有关禁用 HD Audio 声卡解码器 (codec) 的方法,另请参见/疑难解答#编解码器探测。
库配置
系统级配置文件为/etc/asound.conf,用户级配置文件为~/.asoundrc。
配置文件中解释了库配置的语法,例如空格、行延续、注释,包括配置文件、标点符号(分隔符)、赋值、复合赋值、操作模式等。
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;
在操作正确的前提下,使用覆盖操作模式通常是安全的;然而必须注意,节点中可能还包含维持正常功能所必须的其它键。
!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)。在不含特殊字符的前提下,字符串并不强制使用双引号(理想状态下也应避免使用特殊字符)。此规则在其它赋值选项中可能不适用。
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 字符串来代替数字编号引用。
pcm.dmixer和pcm.dsnooper用于为不支持无软件混音环境的应用程序提供备用通道。
例如,运行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"
}
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 声卡
同时输出
你可能希望通过通过连接到迷你插孔 (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