高级 Linux Sound Architecture/故障排除
alsa-utils 软件包包含 alsa-info.sh 脚本,可用于收集 ALSA 状态的详细数据。
alsa-info.sh,并在寻求帮助时分享其输出。另请参阅 SoundcardTesting。
音量
重启后输出静音
运行以下命令
# alsactl restore
如果问题仍然存在,请验证 alsamixer(1) 中的 Auto-Mute 选项是否设置为 Disabled。
音量太低
运行 alsamixer 并尝试提高滑块的值,必要时取消静音通道。请注意,如果您有很多滑块,您可能需要向右滚动才能看到任何缺失的滑块。
如果所有滑块都已调到最大,但音量仍然太低,您可以尝试运行以下脚本来重置您的编解码器设置
$ wget -O hda-analyzer.py https://git.alsa-project.org/?p=alsa.git;a=blob_plain;f=hda-analyzer/run.py
关闭分析器,当被问及是否要重置编解码器时,回答“yes”。
如果音量仍然太低,请再次运行 alsamixer:重置编解码器可能会启用新的滑块,其中一些滑块可能被设置为较低的值。
音量仍然太低
如果您在将扬声器/耳机音量调至最大后仍然面临音量低的问题,可以尝试使用 softvol 插件。将以下内容添加到 /etc/asound.conf
/etc/asound.conf
pcm.!default {
type plug
slave.pcm "softvol"
}
pcm.softvol {
type softvol
slave {
pcm "dmix"
}
control {
name "Pre-Amp"
card 0
}
min_dB -5.0
max_dB 20.0
resolution 6
}
type plug 更改为 type hw。更改加载成功后,您将在 alsamixer 中看到一个 Pre-Amp 部分。您可以在此处调整级别。
- 为
Pre-Amp设置高值可能会导致声音失真,因此请根据适合您的级别进行调整。 - 某些音频编解码器可能需要在 HDA Analyzer 中调整设置(请参阅 #音量太低)以在不失真的情况下获得适当的音量。有时,检查 ALC892 编解码器的播放开关(例如,Node[0x14] PIN)下的 HP 选项可以显著提高音频质量和音量。
启动时随机无声
您可以通过运行 speaker-test 快速测试声音。如果没有声音,您可能会看到类似以下内容:
ALSA lib pcm_dmix.c:1022:(snd_pcm_dmix_open) unable to open slave Playback open error: -16 Device or resource busy
如果在启动时没有声音,可能是因为您的系统有多个声卡,并且它们的顺序有时会在启动时发生变化。如果是这种情况,请尝试 设置默认声卡。
如果您使用 MPD 且上述配置提示无效,请尝试遵循 https://mpd.wikia.com/wiki/Configuration#ALSA_MPD_software_volume_control。
麦克风
无麦克风输入
在 alsamixer(1) 中,确保在录音下的所有音量级别都已调高,并且麦克风(例如 Mic、Internal Mic)和/或 Capture(在 alsamixer 中,选择这些项目并按 Space)已切换为激活状态。尝试提高 Mic Boost 和 Capture 及 Digital 的级别;这可能会导致静电或失真,但一旦您在录音时听到声音,就可以将其调低。
由于 PulseAudio 包装器在 alsamixer 中显示为“default”,您可能需要先按 F6 选择您的实际声卡。您可能还需要在 Playback 部分启用并提高 Line-in 的音量。
要测试麦克风,请运行以下命令(有关更多信息,请参阅 arecord(1))
$ arecord --duration=5 --format=dat test-mic.wav $ aplay test-mic.wav
或者,您可以运行此命令
$ arecord -vv --format=dat /dev/null
与 alsamixer 一起,轻松识别您应该选择和取消静音的通道。
要测试特定设备,请使用 --device 参数,后跟硬件 PCM 名称,格式为 hw:C,D(表示声卡 C 设备 D),或 plughw:C,D(表示插入的硬件)。例如
$ arecord -vvv --format=dat --device=plughw:0,0 /dev/null
如果所有方法都失败了,您可能想通过在不同的设备上测试麦克风来排除硬件故障。
对于至少一些计算机来说,静音麦克风 (MM) 仅仅意味着它的输入不会立即发送到扬声器。它仍然接收输入。
一些程序尝试使用 OSS 作为主要的输入软件。如果您之前启用了 snd_pcm_oss、snd_mixer_oss 或 snd_seq_oss 内核模块(它们默认不加载),请尝试卸载它们。
参见
设置默认麦克风/录音设备
某些应用程序(Pidgin、Adobe Flash)不提供更改录音设备的选项。如果您的麦克风位于与内置声卡不同的设备上(例如 USB 网络摄像头或麦克风),这会成为一个问题。要仅更改默认录音设备,同时保持默认播放设备不变,您可以修改 ~/.asoundrc 文件,添加以下内容:
~/.asoundrc
pcm.usb
{
type hw
card U0x46d0x81d
}
pcm.!default
{
type asym
playback.pcm
{
type plug
slave.pcm "dmix"
}
capture.pcm
{
type plug
slave.pcm "usb"
}
}
将 U0x46d0x81d 替换为 ALSA 中的录音设备声卡名称。您可以使用 arecord -L 列出 ALSA 检测到的所有录音设备。
内置麦克风无法工作
首先,请确保在 alsamixer 的 Capture 视图下启用了音量。在某些情况下,“Internal Microphone”在按 F4 时出现的录音列表中不显示。如果这样,指定 aplay -l 给出的声卡编号来启动 alsamixer(例如 alsamixer -c 0)可以使其出现。
音质
通过耳机插孔(3.5mm接口)发出噼啪声
遵循 Advanced Linux Sound Architecture#Simultaneous output 可能会导致通过耳机或外接扬声器发出噼啪声。这可以通过静音或将 Mic 的音量设置为 0% 来修复。使用 alsamixer(1) 或 amixer(1)
$ amixer sset "Mic" 0% $ amixer sset "Mic" mute
从挂起状态恢复后发出咔嗒声
从挂起状态恢复计算机后,您可能会听到咔嗒声。这可以通过编辑 /etc/pm/sleep.d/90alsa 并删除行 aplay -d 1 /dev/zero 来修复。
播放时声音跳过
运行 alsamixer,如果存在不存在的输出设备的通道,则禁用它们(例如,alsamixer 显示中心扬声器但您没有)。
音质差或削波
如果您遇到音质差的问题,请尝试将 PCM 音量(在 alsamixer 中)设置到增益为 0 的级别。
如果加载了 snd_usb_audio 驱动程序,您可以尝试启用 softvol
/etc/asound.conf
pcm.!default {
type plug
slave.pcm "softvol"
}
pcm.dmixer {
type dmix
ipc_key 1024
slave {
pcm "hw:0"
period_size 4096
buffer_size 131072
rate 50000
}
bindings {
0 0
1 1
}
}
pcm.dsnooper {
type dsnoop
ipc_key 1024
slave {
pcm "hw:0"
channels 2
period_size 4096
buffer_size 131072
rate 50000
}
bindings {
0 0
1 1
}
}
pcm.softvol {
type softvol
slave { pcm "dmixer" }
control {
name "Master"
card 0
}
}
ctl.!default {
type hw
card 0
}
ctl.softvol {
type hw
card 0
}
ctl.dmixer {
type hw
card 0
}
开始和停止播放时发出咔嗒声
某些模块(例如 snd_hda_intel)会在不使用声卡时将其关闭。这可能会导致声音咔嗒声—如噼啪/咔嗒/刮擦声—每次断电/上电时,具体取决于设备(在某些桌面环境中,即使移动音量滑块或打开/关闭窗口也可能如此)。
有关更多信息,请参阅 Power management#Audio 和 #省电。
硬件和声卡
HD Audio
有关更多信息,请参阅 Module snd-hda-intel 以及 modinfo --field=parm snd_hda_intel | column --separator=':' --table 的输出。
参见
电源管理
默认启用省电模式,这可能会导致以下问题
- #开始和停止播放时发出咔嗒声
- PC speaker#HD Audio 省电模式静音 PC speaker
- VirtualBox/Install Arch Linux as a guest#Linux guests have slow/laggy audio
要完全禁用 snd_hda_intel 模块的省电模式,请使用以下内核模块参数
/etc/modprobe.d/alsa-base.conf
options snd_hda_intel power_save=0 power_save_controller=N
编解码器探测
编解码器 (Codec) 是 HD Audio 声卡的一个硬件组件。一张声卡可能包含多个编解码器,一个编解码器可能对应多个 ALSA 设备。
编解码器插槽 (codec slot) 是一个数字(从零开始),用于标识声卡上的编解码器。您可以在 /proc/asound/cardi/codec#s 文件和 /sys/class/sound/hwCiDs/ 目录名中找到编解码器插槽号—这里 i 是声卡索引,s 是编解码器插槽。
要禁用某个编解码器—及其所有相关的 ALSA 设备—请使用 snd_hda_intel 模块的 probe_mask 选项。
错误的型号自动检测
错误的型号自动检测可能导致以下问题
- 无耳机输出
有关特定声卡芯片可能的 model 字符串,请参阅 HD-Audio Codec-Specific Models。
声卡芯片可以在以下位置找到:
- alsamixer(1)—查看左上角的 Chip:,
grep 'Codec:' /proc/asound/card*/codec#*的输出,grep . /sys/class/sound/hwC?D?/chip_name的输出,/proc/asound/pcm文件。
要强制指定,请使用 snd_hda_intel 模块的 model 选项。
消息信号中断 (MSI)
是否启用消息信号中断 (MSI) 很大程度上取决于硬件。在自动检测错误的情况下,可能会发生各种问题:
- 错误的禁用可能导致声卡未被检测到;
- 错误的启用可能导致音频质量差(卡顿),甚至内核锁定。
要检查 MSI 功能状态,请以 root 用户 权限运行 lspci -vv -nn -d ::0403。
::0403 指的是 Multimedia controller PCI 设备类的 Audio device 子类。HD Audio 声卡上的 MSI 由 snd_hda_intel 模块的 enable_msi 选项控制。
DMA 指针
HD Audio 声卡输入和/或输出时的点击噪声(噼啪声、咔嗒声)可能由 DMA 位置问题 引起。尝试更改 snd_hda_intel 模块的 position_fix 选项。
修复错误的音频引脚映射
如果到音频引脚(插头)的映射不正确但 ALSA 工作正常,您可以尝试 HDA Analyzer — 一个用于 HD-audio 控制的 pyGTK2 GUI,可以在 ALSA wiki 上找到。尝试调整 PIN 节点的 Widget Control 部分,使麦克风成为 IN(输入)而耳机插孔成为 OUT(输出)。参考 Config Defaults 部分是一个好主意。
run.py 文件中的所有 python 替换为 python2 以将脚本指向 Python 2 版本。然后使脚本可执行并运行它。验证输出参数
检查 /proc/asound/cardC/pcmPp/subS/hw_params 的内容,其中 C、P 和 S 取决于系统。为了找到这个文件,在通过 ALSA 输出内容时执行以下命令链:
$ find /proc/asound/ -name hw_params \ | xargs -I FILE grep -v -l "closed" FILE \ | grep '/proc/asound/card./pcm.p/sub./hw_params'
以下是一个具有 24 位位深度和 44.1 千赫兹采样频率的音频示例输出:
$ cat /proc/asound/card1/pcm0p/sub0/hw_params
access: RW_INTERLEAVED format: S24_3LE subformat: STD channels: 2 rate: 44100 (44100/1) period_size: 5513 buffer_size: 22050
有关更多信息,请参阅 Proc asound documentation。
S/PDIF 输出不工作
S/PDIF (IEC958) 使用两种模式:
- Audio 模式是数字 PCM 信号,因此接收器只需通过数模转换器 (DAC) 进行转换。
- Non-audio 模式是编码的比特流,因此接收器必须首先解码数据,然后将其输出到 DAC。Dolby Digital 和 DTS Digital Surround 是编码比特流格式的示例。
ALSA 应该会自动检测到合适的模式,但如果失败,您可以使用 iecset(1) 来强制模式(on—audio,off—non-audio)。
# iecset audio on # iecset audio off
有关更多信息,请参阅 DigitalOut。
HDMI
HDMI 输出不工作
下面描述的过程可用于测试 HDMI 音频。在继续之前,请确保您已使用 alsamixer 启用了输出并取消了静音。
通过 HDMI 线缆将您的 PC 连接到显示器,并使用 xrandr 启用显示器。
使用 aplay -l 发现声卡和设备编号。例如:
$ aplay -l
**** List of PLAYBACK Hardware Devices **** card 0: SB [HDA ATI SB], device 0: ALC892 Analog [ALC892 Analog] Subdevices: 1/1 Subdevice #0: subdevice #0 card 0: SB [HDA ATI SB], device 1: ALC892 Digital [ALC892 Digital] Subdevices: 1/1 Subdevice #0: subdevice #0 card 1: Generic [HD-Audio Generic], device 3: HDMI 0 [HDMI 0] Subdevices: 1/1 Subdevice #0: subdevice #0
将声音发送到设备。遵循上一步的示例,您将声音发送到 card 1, device 3
$ aplay -D plughw:1,3 /usr/share/sounds/alsa/Front_Center.wav
如果 aplay 没有输出任何错误,但仍然没有声音,“重启”接收器、显示器或电视。由于 HDMI 接口在连接时执行握手,它可能之前已经注意到没有嵌入音频流,并禁用了音频解码。如果您使用的是独立的窗口管理器,在插入 HDMI 线缆时可能需要播放声音。
mplay 和其他应用程序可以配置为使用特殊的 HDMI 设备作为音频输出。但 flashplugin 只能使用默认设备。以下方法用于覆盖默认设备。但断开电视与 HDMI 端口连接时需要将其改回。
如果测试成功,请创建或编辑您的 ~/.asoundrc 文件,将 HDMI 设置为默认音频设备。
~/.asoundrc
pcm.!default {
type hw
card 1
device 3
}
或者,如果上述配置不起作用,请尝试:
~/.asoundrc
defaults.pcm.card 1 defaults.pcm.device 3 defaults.ctl.card 1
或者,如果您另外成功地使用
$ speaker-test -Dplug:hdmi
对于您的 HDMI 或 DisplayPort,以下配置将起作用(在 Lenovo ThinkPad T430s 上成功测试):
~/.asoundrc
pcm.!default {
type plug
slave.pcm "hdmi"
}
HDMI 5.1 声道被发送到错误的扬声器
可以使用 ALSA 的 remap 函数将声音重定向到预期的扬声器。
/etc/asound.conf
pcm.!hdmi-remap {
type asym
playback.pcm {
type plug
slave.pcm "remap-surround51"
}
}
pcm.!remap-surround51 {
type route
slave.pcm "hw:0,3"
ttable {
0.0= 1
1.1= 1
2.4= 1
3.5= 1
4.2= 1
5.3= 1
}
}
应用程序
SDL:SDL 应用程序无声
如果您在使用基于 SDL 的应用程序时没有声音,请尝试将 环境变量 SDL_AUDIODRIVER 设置为 alsa。
OpenAL:使用 OpenAL 的应用程序无声
OpenAL 默认使用 PulseAudio。要指示它首先尝试 ALSA:
/etc/openal/alsoft.conf
drivers=alsa,pulse
其他:通用应用程序问题
对于坚持使用自己音频设置的其他应用程序,例如 XMMS 或 MPlayer,您需要设置它们的特定选项。
对于 MPlayer 或 mpv,请将以下行添加到相应的配置文件中:
ao=alsa
例如,对于 XMMS2,请进入其选项并确保声音驱动程序设置为 ALSA,而不是 oss。
要在 XMMS 中执行此操作:
- 打开 XMMS
- Options > Preferences.
- 选择 ALSA 输出插件。
对于不提供 ALSA 输出的应用程序,您可以使用 alsa-oss 包中的 aoss。要使用 aoss,在运行程序时,在其前面加上 aoss,例如:
aoss realplay
pcm.!default{ ... } 对我来说不再起作用了。但是这个可以:
pcm.default pcm.dmixer
其他问题
同时播放问题
如果您遇到同时播放问题,并且已安装 PulseAudio,则其默认配置设置为“劫持”声卡。一些 ALSA 用户可能不想使用 PulseAudio,并且对他们当前的 ALSA 设置感到满意。一种解决方法是编辑 /etc/asound.conf 并注释掉以下行:
# Use PulseAudio by default
pcm.!default {
type pulse
fallback "sysdefault"
hint {
show on
description "Default ALSA Output (currently PulseAudio Sound Server)"
}
}
注释掉以下内容也可能有所帮助:
ctl.!default {
type pulse
fallback "sysdefault"
}
这可能比完全卸载 PulseAudio 更简单的解决方案。
实际上,下面是一个有效的 /etc/asound.conf 示例:
pcm.dmixer {
type dmix
ipc_key 1024
ipc_key_add_uid 0
ipc_perm 0660
}
pcm.dsp {
type plug
slave.pcm "dmix"
}
dmix 与 vanilla ALSA 一起工作,请参阅 上游文档。特别是,您可能希望在上面的配置中将 dsp 替换为 !default。此外,如果您发现这导致某些应用程序在播放时跳过(即声音“闪烁”)并抱怨欠载发生,您可能需要调整 pcm.dmixer 中的 slave.buffer_size。移除旧的 ALSA 状态文件 (asound.state)
alsa-utils 软件包提供了 alsa-store.service,它会在系统关闭时自动将当前的 ALSA 状态存储到 /var/lib/alsa/asound.state。这可能对试图重置当前 ALSA 状态的用户造成问题,因为 asound.state 文件会在每次关闭时使用当前状态重新创建(例如,尝试从混音器中移除用户定义的通道)。可以通过创建以下空文件来临时禁用 alsa-store.service 服务:
# mkdir -p /etc/alsa # touch /etc/alsa/state-daemon.conf
state-daemon.conf 文件的存在会阻止 alsa-store.service 在关闭时保存 asound.state。禁用此服务后,可以像这样移除 asound.state 文件:
# rm /var/lib/alsa/asound.state
重新启动后,之前的 ALSA 状态应被丢弃,当前状态应重置为默认值。通过删除我们创建的条件文件来重新启用 alsa-store.service:
# rm /etc/alsa/state-daemon.conf
下次关闭时,asound.state 文件应使用 ALSA 默认值重新创建。也可以立即生成该文件,使用:
# alsactl store
如果您想在不重启的情况下清理 ALSA 状态,可以使用 rmmod 卸载声音驱动程序模块,然后手动删除 asound.state 中不需要的条目,然后使用 modprobe 重新安装声音驱动程序模块。
一次只能供一个用户使用的问题
您可能会发现一次只有一个用户可以使用 dmixer。这对于大多数人来说可能没问题,但对于那些将 mpd 作为单独用户运行的人来说,会带来问题。当 mpd 在正常用户登录帐户下运行时,普通用户无法通过 dmixer 播放声音。虽然将 mpd 在用户的登录帐户下运行是完全可能的,但已经找到了另一个解决方案。将 ipc_key_add_uid 0 行添加到 pcm.dmixer 块可以禁用此锁定。以下是 asound.conf 的一个片段,其余部分与上面相同。
...
pcm.dmixer {
type dmix
ipc_key 1024
ipc_key_add_uid 0
ipc_perm 0660
slave {
...
Dell 笔记本电脑上的噼啪/咔嗒声
检查您是否安装了 i8kutilsAUR,以及是否有任何程序(例如 i8kmon.service)正在读取或写入模块暴露的接口,因为 i8kutils 的 BIOS 系统调用会在某些系统上短暂阻塞内核。有关更多详细信息,请参阅 Fan speed control#Dell laptops 中的警告。