Advanced Linux Sound Architecture (简体中文)
高级 Linux 声音体系(Advanced Linux Sound Architecture,ALSA)提供声卡的内核驱动,代替了原来的开放声音系统(Open Sound System,OSS)。
除了声音设备驱动,ALSA还捆绑了一个用户空间驱动的库用于应用开发。开发者可以使用这些 ALSA 驱动进行高级 API 开发,可以通过 ALSA 库达成与声音设备的内核(直接)交互。
安装
ALSA是一组内置的Linux内核模块,故无需手动安装。
udev会在系统启动时自动检测硬件并选择所需的驱动,并加载相应的声音设备驱动模块。所以你的声卡应当已经可以工作了,然而在一开始声音可能被静音了。这种情况下见#解除各声道的静音。
ALSA 实用程序
安装 软件包 。其包含 、 等实用程序。amixer是一个用于更改音频设置的shell命令,而alsamixer则提供了一个较为直观的,基于ncurses的界面,用于配置声音设备。
如果需要高质量重采样,请安装 alsa-plugins 软件包,即可启用#上混和缩混和其他高级特性。
OSS 兼容性
OSS 是一个可选的声音架构。
ALSA有能力截获Open Sound System (简体中文)调用,并转而将之发往ALSA。例如,对于试图打开并向里面直接写入声音数据的传统应用,这个模拟层很有用。没有OSS或者该模拟库,就会缺少,应用就不会产生任何声音。
如果希望Open Sound System (简体中文)应用和dmix共同工作,请一并安装。然后加载snd-seq-oss、 和 内核模块 来激活OSS模拟。
PulseAudio 兼容性
可以为只提供PulseAudio声音支持的应用使用 ALSA。用法为 。
ALSA 和 Systemd
软件包默认包含了 systemd 单元配置文件 和 alsa-state.service。
在安装时它们会自动安装并激活(通过软件包提供的指向sound.target的符号链接)。二者都不会默认运行,因为要确定该使用哪种方法需要由用户专门决定。两个选项如下所述:
- 在引导时读取 ,并在关机时写入更新后的值,前提是已经运行 生成了配置文件;
alsa-state.service以守护进程方式(重新)启动alsactl,以持续跟踪并保持音量变化。同样,前提是用户已经专门启动过了 。
两种方法是互斥的,根据需要可以选择其中一种。更多信息请查看 。
可以通过 检查其状态。
ALSA 固件
alsa-firmware 软件包包含了某些声卡(如创新SB0400 Audigy2)可能需要的固件。
一些较新型号的笔记本电脑(2019年底/2020)需要 和 ,它们使用 Sound Open Firmware 提供的固件实现驱动程序。
解除各声道的静音
ALSA 默认静音所有声道,必须手动解除。
使用amixer解除静音
可以使用 解除声卡的主音量静音:
$ amixer sset Master unmute $ amixer sset Speaker unmute $ amixer sset Headphone unmute
使用alsamixer解除静音
使用 可以解除声卡的静音:
$ alsamixer
声道下方标有 表示其已经静音,而标有 表示已经启用。
使用 和 → 键滚动到 和 声道,按下 键解除静音。
使用 键增加音量,获得dB的增益。增益值可在左上方 字段旁边看到。
解除5.1/7.1声音的静音
要想得到完整的 5.1 或 7.1 环绕声,可能需要解除 、 Surround、 、 (低音炮)以及 Side 等其他声道的静音(这些声道名称是 Intel HD Audio 声卡使用的,可能因设备不同而有所差异)。
启用麦克风
要启用麦克风,按 切换至 Capture (捕获)选项卡,然后按 启用一个声道即可。如果麦克风不工作,参考Advanced Linux Sound Architecture (简体中文)/Troubleshooting (简体中文)#没有麦克风输入。
按下 键退出 alsamixer。
测试你的更改
接下来,测试声卡是否工作:
$ speaker-test -c 2
根据扬声器的配置,调整 。对于 7.1 声道,使用 -c 8:
$ speaker-test -c 8
如果声音输出到了错误的设备,可以试试用 参数手动指定。
$ speaker-test -D default:PCH -c 8
的值是 PCM 通道的名字,运行以下命令即可获取:
若声音工作异常,而通过参数指定获得了正确的声音输出,尝试#设置默认声卡。
如果没有正常工作,请继续阅读 #配置 部分和 Advanced Linux Sound Architecture/Troubleshooting 页面。
附加注释
- 如果你的系统有多个声卡,则可以按切换声卡。
- 有些声卡需要静音或禁用数字输出,才能听到模拟声音。Soundblaster Audigy LS应当静音标有 的声道。
- 有些机器(如Thinkpad T61)有声道,也需要解除静音并调整。
- 有些机器(如Dell E6400)可能也需要解除 和 通道的静音并调整它们。
- 如果重启以后,你的声音调整似乎丢失了,尝试以root运行alsamixer。
配置
系统配置文件是 /etc/asound.conf, 分用户配置文件是 .
赋值与分隔符
赋值能够定义一个键值的具体值,可以使用不同的赋值类型和风格。
分隔符被用作指示赋值的开始和结束,不过逗号或是空白字符也是可以使用的。
复合赋值使用大括号作为分隔符。
出于可读性考虑,在定义三种以上的参数时,推荐使用第一种方式。
序列定义使用中括号当作分隔符。
key [ "value0"; "valueN"; ] key.0 "value0"; # 与上述语句意义相同 key.N "valueN";
操作模式
解析节点有不同的操作模式,默认模式为“合并/创建”(merge/create)。如果操作模式为“合并/创建”或“合并”(merge),会进行类型检查。只有同样类型的赋值能够被合并,因此字符串不能与整形数合并。在默认操作模式中尝试对复合键值定义一个简单赋值是没有作用的,反之亦然。
操作模式前缀符号:
- "+" -- 合并/创建
- "-" -- 合并
- "?" -- 不覆盖(do not override)
- "!" -- 覆盖(override)
在操作正确的情况下,使用覆盖操作模式通常来说是安全的。但是切记,在一个节点中可能会有其他对于正确动作来说必要的键值。
使用“默认”节点的默认设备设定示例
假设“默认”(default)节点在 设定,其中“defaults.pcm.card”及其对应的“ctl”(控制)项都赋值为整型数“0”, 而用户想要将默认PCM与控制设备设定为声卡“2”(第三个声卡),或对于Azalia声卡设定为“SB”。
这里使用双引号会自动将值的数据类型设为字符串,因此在上例中设置 的结果就是保持之前的默认设备不变,此例中为声卡0。只要不使用特殊字符(理想状态下也不应该会使用),双引号就不是强制性的。This may be irrelevant in other assignments.
嵌套
有时在配置中使用嵌套有用而且更易读。
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;
设置默认声卡
通过默认节点设置默认声卡
关于 和 ,要实际运用上面的例子,假定有2块声卡分别编号为0和1,想要默认使用编号1的声卡,在 /etc/asound.conf 或用户对应的 使用以下配置即可更改回放与混音控制声卡。
通过内核模块选项配置编号
如果发现开机时声卡次序会发生变化,可以在 中的任何名字以 结尾的文件(以下假设为 )中指定次序。
比如,要让 mia 声卡成为 #0:
使用 $ cat /proc/asound/modules 来获得当前已经载入的声音模块及其次序。这个列表通常对于载入次序来说就是全部所需的了。使用 来获得设备和模块的列表。这个配置假设你有一个使用 的mia声卡和一个使用 的(板载)声卡。
也可以指定index为 ,让ALSA不要将对应的设备作为主声卡。Linux Mint 和 Ubuntu 等发行版使用了以下配置,避免 USB 声卡和其他“非正常”设备获得序号 :
以上配置会在系统重启后生效。
当载入被多个卡(比如,snd-hda-intel)使用的模块时,推荐您加入供应商和设备认证信息到选项中。为了获得 和 信息,使用以下命令:
$ lspci -nn | grep -i audio
00:14.2 Audio device [0403]: Advanced Micro Devices, Inc. [AMD/ATI] SBx00 Azalia (Intel HDA) [1002:4383] (rev 40) 01:00.1 Audio device [0403]: Advanced Micro Devices, Inc. [AMD/ATI] RV770 HDMI Audio [Radeon HD 4850/4870] [1002:aa30] 07:05.0 Multimedia audio controller [0401]: VIA Technologies Inc. VT1720/24 [Envy24PT/HT] PCI Multi-Channel Audio Controller [1412:1724] (rev 01)
Last numbers in square brackets are , so for the above example, for setting Azalia as default card following is correct:
使用环境变量选择默认PCM设备
把ALSA_CARD设为设备的名字也许就可以了。首先用 获取名称,然后将ALSA_CARD设为冒号之后、方括号之前的名称:例如,如果有
card 1: HDMI [HDA ATI HDMI], device 3: HDMI 0 [HDMI 0]
那就设置。
其他变量见默认全局配置:
或者也可以在你自己的配置文件(最好是全局的/etc/asound.conf)中对行为进行覆盖。添加:
同样把本例中的 替换成你的设备名字。你可以使用获取名字,或者也可以使用surround51等PCM。不过,如果你需要使用麦克风的话,选择全双工PCM声卡为默认设备是个不错的选择。
现在只需改变环境变量 ,就可以在启动程序时选择声卡。对于所有不允许选择声卡的程序此法效果良好,而对于其他的程序请确保保持默认声卡选择。
举例来说,假设你写了一个缩混PCM命名为 ,用以下命令即可将之用于:
ALSAPCM=mix51to20 mplayer example_6_channel.wav
替代方式
首先确认你想设为默认的声卡和设备ID:
例如,该列表中的最后一项的声卡ID为2,设备ID为0。要把这块声卡设为默认,可以使用系统级的 /etc/asound.conf 或用户级的 文件。如果文件不存在,需要手动创建。然后针对相应的声卡加入以下内容:
pcm.!default {
type hw
card 2
}
ctl.!default {
type hw
card 2
}
多数情况下建议使用声卡名代替数字引用。声卡名称容易理解,同时克服了启动顺序问题。因此以下配置对于上面的示例应当是正确的。
使用aplay获取有效的ALSA声卡名称:
或者用cat,但可能会返回没用的设备:
“pcm”选项影响哪个声卡和设备用于音频回放,“ctl”选项则影响alsamixer等控制工具使用哪个声卡。
一旦(重新)启动MPlayer等应用程序,更改应当就会生效。也可以用aplay等命令进行测试。
$ aplay -D default:PCH your_favourite_sound.wav
如果你收到关于asound配置的报错,阅读上游文档查看对于配置文件格式的可能更改。
确认已经加载正确的声音模块
可以假定 udev 会正确地自动探测出声卡。使用以下命令确认:
如果你的输出和上面类似,那就说明声卡已经被正确识别。
还可以检查一下 目录,看看是否有正确的设备文件:
如果你的输出跟上面类似,或至少有 controlC0 和 pcmC0D0p,那么声卡模块就已经正常检测并加载了。
如果不是,则声卡模块没有被正确检测。要解决问题,可以尝试手动加载模块:
- 确定声卡对应的驱动模块:ALSA Soundcard Matrix。这些模块都会有一个“snd-”前缀(例如:)。
- 加载模块。
- 检查 目录中的设备文件(参见上文);或者,检查 或 的输出是否正确。
- 修改配置,使 和 模块开机自动加载。
启用 SPDIF 输出
S/PDIF 是一种数字音频介面,常用来连接电脑与数字功放(如有5.1/7.1环绕声的家庭影院)。
- 在 或shell的配置文件中加入下面一行:
amixer -c 0 cset name='IEC958 Playback Switch' on
使用以下命令,获取你的声卡的数字输出的名称:
$ amixer scontrols
使用 AlsaEqual(包含界面)
安装 。同时安装 [损坏的链接:package not found] 以支持32位应用。
安装后,把下列内容添加到 ALSA 配置文件(/etc/asound.conf):
ctl.equal {
type equal;
}
pcm.plugequal {
type equal;
# Modify the line below if you do not
#slave.pcm "plughw:0,0";
#by default we want to play from more sources at time:
slave.pcm "plug:dmix";
}
#pcm.equal {
# If you do not want the equalizer to be your
# default soundcard comment the following
# line and uncomment the above line. (You can
# choose it as the output device by addressing
# it with specific apps,eg mpg123 -a equal 06.Back_In_Black.mp3)
pcm.!default {
type plug;
slave.pcm plugequal;
}
之后就可以用该命令调整均衡器了:
$ alsamixer -D equal
需要注意,每个用户的 alsaequal 配置文件都是不同的,位于 。因此,如果想在 mpd 之类的以独立用户身份运行的程序中使用 AlsaEqual,就得像下面这样:
# su mpd -c 'alsamixer -D equal'
或者,在那个用户的主目录下创建符号链接,指向你的 。
管理 AlsaEqual 配置
从 Xyne 的软件仓库 或 安装 alsaequal-mgr。
同上,配置均衡器:
$alsamixer -D equal
如果对效果感到满意,将其命名(如“foo”)并保存该配置:
$alsaequal-mgr save foo
之后可以重新加载“foo”中的配置:
$alsaequal-mgr load foo
不过这样只会恢复。之后还需要用更新均衡器设置。
这样,就可以为游戏、电影、不同音乐流派、网络电话等等创建不同的均衡器配置,以便按需切换。
参见项目主页和程序的帮助信息,了解更多设置。
高质量重采样
启用软件混音时,ALSA 会强制把所有音频重采样到相同的频率(如果系统支持,默认是 48000)。默认会尝试使用speexrate转换器进行,如果它不可用的话就会回退到低质量的线性插值。
因此如果由于糟糕的重采样导致音质差,只需安装 就可能解决问题。
如果想要更高质量的重采样,可将默认采样率转换器改为 或 。二者的效果都足够好,实际上选哪个并不重要,所以一般来说不值得花费更多CPU资源去使用“best”转换器。
要更改默认转换器,将以下内容加入你的 或 /etc/asound.conf:
上混和缩混
上混(upmixing)
播放双声道立体声音源(如音乐)时,需要利用上混才能充分利用 5.1 或 7.1 环绕立体声系统。以前,上混很麻烦,还经常出错;但如今有了插件可以轻松地打理好这一任务。我们使用由 alsa-plugins 软件包提供的 插件。
然后在ALSA配置文件(/etc/asound.conf 或 )中添加如下内容:
pcm.upmix71 {
type upmix
slave.pcm "surround71"
delay 15
channels 8
}
该范例适用于7.1声道上混。类比该范例,同样能设置5.1或4.0声道上混。
该设置添加了一个新的用于上混的pcm通道。如果希望所有音频源都通过该 pcm 输出,在上述设置后添加如下配置即可:
pcm.!default "plug:upmix71"
插件自动允许多个音频源同时通过它输出,所以将其设为默认实际上是个安全的选择。如果不行,就得像下面这样为上混配置 dmixer:
pcm.dmix6 {
type asym
playback.pcm {
type dmix
ipc_key 567829
slave {
pcm "hw:0,0"
channels 6
}
}
}
并使用 dmix6 而非 surround71。
如果遇到声音卡顿或混乱,考虑增加 buffer_size(比如增加到 32768),或使用高质量重采样。
缩混(downmixing)
有时也会用到缩混,比如在只支持双声道立体声的电脑上观看5.1声道的电影时。这一功能由 ALSA 插件 vdownmix 实现(同样在 alsa-plugins 软件包里)。
在配置文件中添加如下内容:
pcm.!surround51 {
type vdownmix
slave.pcm "default"
}
pcm.!surround40 {
type vdownmix
slave.pcm "default"
}
Dmix
混音使得多个应用可以同时发出声音。多数独立声卡支持硬件混音,在允许的情况下会默认启用。板载集成声卡(如Intel HD Audio)通常不支持硬件混音。在这种声卡上,软件混音由一个称作dmix的ALSA插件完成。若硬件混音不可用,将自动启用该功能。
要手动启用dmix,可以将以下内容加入你的ALSA配置文件:
pcm.dsp {
type plug
slave.pcm "dmix"
}
提示和技巧
禁止启动时自动静音
启动时自动静音模式可以通过配置。例如,要禁用它:
# amixer -c 0 sset "Auto-Mute Mode" Disabled
或者可以通过使用图形界面。要保存更改,请使用:
# alsactl store
或
# alsactl daemon
USB声卡热插拔
同时输出
你可能会希望使用一个用小型插头连接的外置扬声器与内置扬声器同时播放音乐。使用 或 解除静音Auto-Mute即可实现:
$ amixer sset "Auto-Mute" unmute
然后解除静音其他需要的项目, 比如 Headphones, Speaker, Bass Speaker...
键盘控制音量
将下列命令映射到你的音量键: 、、
增加音量:
amixer set Master 5%+
减小音量:
amixer set Master 5%-
静音/解静音:
amixer set Master toggle
使用snd-aloop的虚拟声音设备
You might want a jack alternative to create a virtual recording or play device in order to mix different sources, using the snd-aloop module:
modprobe snd-aloop
List your new virtual devices using:
aplay -l
now you can for example using ffmpeg:
ffmpeg -f alsa -i hw:1,1,0 -f alsa -i hw:1,1,1 -filter_complex amerge output.mp3
In the hw:R,W,N format R is your virtual card device number, W 1 recording devices 0 for writing, R is your sub device you can use all the virtual devices available and play/stop using applications like mplayer:
mplayer -ao alsa:device=hw=1,0,0 fileA mplayer -ao alsa:device=hw=1,0,1 fileB
Another thing you could do with this approach, is using festival to generate a voice into a recording stream using an script like this:
#!/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";
重新配置输入输出端口
软件包包含有hdajackretask工具,(在英特尔HDA声卡上)可用于重新配置声卡输入输出端口;例如,将麦克风插孔转为耳机插孔。
复位编解码器
ALSA驱动程序能够完全重新配置所连接的编解码器(声音系统中实际处理音频流的组件),用法如下:
# echo 1 > /sys/class/sound/card/reconfig
在此之前,必须停止所有使用ALSA驱动程序的进程(如Pulseaudio 或 JACK)。
正确检测插入四极3.5毫米(TRRS)插孔的麦克风
在一些现代笔记本上,可能会有一个3.5毫米组合耳机插孔,而不是两个分开的插孔,在默认情况下可能不能被正确检测到。要想让ALSA正确检测到你的3.5毫米插孔的插入状态,可以在中加入下面一行:
options snd_hda_intel index=0 model=your_model_setting
对于写在处的完整选项列表,见HD-Audio Codec-Specific Models或其位于(由软件包提供)的源。
在搭载有ALC255的技嘉Aero15 2017 (P65 Model)上经过测试,model设为。