如何保存 AlsaMixer 的设置?

你好,我尝试了一个名为"EarCandy"的程序,现在我遇到了很多问题。 起初我没有听到任何声音,现在音量非常低。附注:我已经从我的硬盘中删除了EarCandy。
当我打开Alsamixer时:
alsamixer

我看到扬声器音量是零。现在我把它调到最大音量。但是每次重新启动后,我都要再次打开alsamixer并将音量设置为最大。我能保存alsamixer的设置吗?还是有其他方法可以解决这个问题吗? enter image description here

我做了一个解决方案,可以监听alsamixer监视器,并在任何应用程序尝试更改时自动恢复。你可以在这里查看:链接 - Kafels
12个回答

执行:
sudo alsactl store

这将把 alsamixer 的配置保存到 /etc/asound.state,在每次启动时加载。


17我的笔记本电脑在运行上述命令后仍然不断重置我的配置。它声称将其存储到/var/lib/alsa/asound.state。还有其他原因导致它无法正常工作吗? - Azmisov
2我有完全相同的问题,而且当我尝试使用sudo alsactl store时,行为也完全一样。 - JeanSibelius
1@Azmisov:你可以进一步尝试以下操作来测试系统:(1)保存配置文件(2)启动alsamixer并更改主音量(3)恢复配置文件(4)检查主音量是否已恢复。如果以上操作符合预期,还需检查系统启动时是否实际触发了恢复操作(chkconfig alsa-utils应显示alsa-utils on)。 - dma_k
这个答案解决了我的SPDIF问题:http://askubuntu.com/questions/541847/is-there-any-way-to-save-alsamixer-settings-other-than-alsactl-store - neves
1当我运行sudo alsactl store时,它给我返回以下错误信息:alsactl: get_controls:567: snd_ctl_open error: Invalid argument - user2513149
由于alsamixer不保存其状态,因此alsactl store没有要存储的内容。无论在alsamixer中选择了什么,声卡始终保持在“默认”状态。 - Chris Jenks
我遇到了这个错误:“XDG_RUNTIME_DIR (/run/user/1000) 不是我们(uid 0)拥有的,而是由 uid 1000 拥有!(这可能发生在您尝试以 root 用户身份通过本机协议连接到非 root PulseAudio 时。请不要这样做。)”,该怎么办?我已经检查过:/run/user/1000 是由我当前的非 root 用户拥有的。 - Vitaly Zdanevich

你还可以使用alsactl将混音器设置保存到自定义文件中:
alsactl --file ~/.config/asound.state store

重新加载:
alsactl --file ~/.config/asound.state restore

2最佳答案对我没用,但这个方法有效!我创建了一个配置文件,并将其放在/etc/asound.state,然后在我的/etc/rc.local中添加了重新加载的命令行。 - John
这对我来说是正确的解决方案... 但是我必须在 rc.local 中指定 .config 文件的绝对路径(尽管相对路径应该也可以,因为它是同一用户.. 但并没有起作用)。谢谢,并希望我的提示也能帮助到其他人。 - davidhq

Seppo Erviälä的回答是正确的,但不完整。正如dma_k已经指出的那样,man alsactl在最后明确说明了:

/var/lib/alsa/asound.state(或使用-f标志指定的任何文件)用于存储您的声卡的当前设置。

palacsinit适当地指出,您可以将配置存储到您的文件中。

alsactl --file ~/.config/asound.state store

重新加载
alsactl --file ~/.config/asound.state restore

这可以通过将第二行恢复命令放入一个.desktop文件中进一步改进。
您需要运行“nano ~/.config/autostart/alsarestore.desktop”,这将打开nano文本编辑器并创建“~/.config/autostart/alsarestore.desktop”文件。在“~/.config/autostart/”目录中的条目用于在启动/图形登录时自动启动特定用户的程序和服务。
.desktop文件的内容应为以下内容:
[Desktop Entry]
Type=Application
Terminal=false
Name=alsarestore
Exec=alsactl --file ~/.config/asound.state restore

除此之外,你可以将配置存储在/etc/asound.state并将其符号链接到/var/lib/alsa/asound.state,但这只是一个建议,而不是经过测试的解决方案。


这是我在Ubuntu Xenial 16.04上工作的唯一方法。 - Francisco Costa
1“store”和“restore”命令在手动控制时运行良好。然而,当我使用“restore”命令设置自启动文件时,我发现alsamixer中的麦克风设置被重写为静音,结果是杂音。如果我手动执行恢复命令,一切都正常。为什么麦克风设置会改变,并且自启动没有通过适当存储的配置文件进行修正呢? - Brad Horn
@BradHorn 可能有其他东西覆盖了你的命令。它运行了,但是之后又有其他东西撤销了它的更改。 - Sergiy Kolodyazhnyy
有什么想法吗?那可能是什么呢? - Brad Horn
1@BradHorn不是我立即想起来的,没有。尝试将.desktop文件中的Exec行更改为 Exec=bash -c "sleep 5 && alsactl --file ~/.config/asound.state restore"。这将引入5秒的延迟,所以任何覆盖您设置的内容都将首先运行,然后再运行还原命令。如果这仍然覆盖了您的设置,请尝试调整sleep值。 - Sergiy Kolodyazhnyy

经过两个月的努力,我终于成功让sudo alsactl store起作用了。
首先,在终端中输入alsamixer进入alsamixer界面。然后进行所需的配置(例如增加扬声器/耳机音量或按键盘上的“m”取消静音)。
现在是最重要的部分。在退出alsamixer之前,打开一个新的终端并运行sudo alsactl store来保存alsa设置。然后关闭两个终端并重新启动计算机。这样就完成了任务。

这对我来说不起作用。 - kleinfreund
对我来说没问题,虽然不完全一样,但可以使用sudo su - Дмитрий Полянин
使用sudo alsactl store而不是sudo su然后再执行alsactl store也可以正常工作。 - pktiuk

Sergiy Kolodyazhnyy的解决方案对我有效。尽管我不得不添加Exec=bash -c "sleep 5 ...的修改。事实上,这是因为PulseAudio正在修改ALSA。
另一个解决方案是在启动时禁用PulseAudio(请参见此处)。
sudo cp /etc/pulse/client.conf /etc/pulse/client.confbackup
sudo nano /etc/pulse/client.conf

找到; autospawn = yes,删除;并将其改为:
autospawn = no

这个解决方案对我也起作用了,尽管Ubuntu在启动时给了我一个系统程序错误。由于我讨厌这种消息,所以我使用了第一个解决方案。

ALSA有一种机制可以保存和恢复设置:
# alsactl store
# alsactl restore

它将使用默认文件(通常为/var/lib/alsa/asound.state)保存设置,并从中恢复。恢复操作通常在系统启动时自动完成,通常是通过systemd服务进行。
然而,可能会发生PulseAudio(通常在“最新”发行版上默认使用的音频服务器)会覆盖ALSA设置,有时会搞乱事情。教导PulseAudio按照您的意愿行事可能并不容易,因此可以使用以下这种解决方法:
您可能希望从root用户的crontab中启动以下脚本(~/alsarestore.sh)。
#!/bin/sh
restore_alsa() {
    while [ -z "$(pidof pulseaudio)" ]; do
        sleep 1
    done
    alsactl restore 
}
restore_alsa &

在调用alsactl restore之前,它将等待PulseAudio启动(考虑到存储的配置是您想要的配置)。

最后,作为root用户,您可能希望将此添加到crontab -e中:

@reboot ~/alsarestore.sh 2>/dev/null

这个解决方法是受到this ArchLinux wiki article的启发。


我在我的系统中发现pulseaudio从不终止,所以while循环会无限运行。通过简单地使用以下代码作为alsarestore.sh来解决问题:#!/bin/sh sleep 5 && alsactl -L restore(无需使用sudo) 你可能需要增加或减少5秒的延迟时间。 - Maurizio Ferreira
while循环等待pulseaudio 启动,而不是终止。一旦有一个pulseaudio进程在运行,while循环就会结束并执行alsactl restore。只有当pulseaudio从未启动时,它才会永远运行。另外,我已经从我的回答中删除了无用的sudo,感谢你指出。 - Totor

sudo权限打开alsamixer:
sudo alsamixer

然后调整音量并退出。
sudo alsactl store


对于那些 @Sergiy Kolodyazhnyy 的回答没有起作用的人,请尝试用完整路径替换 alsactl(无论 which alsactl 返回给你什么)。

Alsa-Json-Gateway https://github.com/fulup-bzh/AlsaJsonGateway 支持通过 JSON/REST API 存储和恢复声卡会话。
  • 列出会话 /jsonapi?request=session-list&cardid=hw:0
  • 存储会话 /jsonapi?request=session-store&cardid=hw:0&args=MySoundConfig
  • 恢复会话 /jsonapi?request=session-load&cardid=hw:0&args=MySoundConfig