我全新安装了 Ubuntu 22.04.1 LTS(之前使用的是 18.04)。声音配置菜单有这些输出选项,其中第二个选项(S/PDIF)是我使用的,选择它可以让音频正常工作。
但每次重启后,音频输出都会重置为 HDMI 输出,我需要将其默认为 S/PDIF。我找到的解决方案(并在以前的安装中使用过)涉及为 Pulseaudio 选择正确的接收器,但我现在似乎只有一个接收器!输出为pactl list short sinks
:
6 alsa_output.pci-0000_00_0e.0.hdmi-stereo module-alsa-card.c s16le 2ch 44100Hz SUSPENDED
输出aplay -l
似乎也没有任何 S/PDIF 的痕迹:
**** List of PLAYBACK Hardware Devices ****
card 0: PCH [HDA Intel PCH], device 0: ALC283 Analog [ALC283 Analog]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 1: ALC283 Digital [ALC283 Digital]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 3: HDMI 0 [HDMI 0]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 7: HDMI 1 [HDMI 1]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 8: HDMI 2 [HDMI 2]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 9: HDMI 3 [HDMI 3]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 10: HDMI 4 [HDMI 4]
Subdevices: 1/1
Subdevice #0: subdevice #0
那么它在哪里?!菜单选项来自哪里?我如何将 S/PDIF 设置为默认值?
答案1
我深入挖掘并找到了两个可行的解决方案,其中第二个解决方案让我完全满意。
解决方案 1:显式 alsa-sink
我意识到列出的前两个子设备aplay -l
实际上都是 S/PDIF,因为播放来自 Java 的声音(就像我在我自己的音乐播放器) 与设置为输出设备plughw:0,0
或plughw:0,1
我的 DAC 上的 LED 根据采样率适当变化的情况配合使用。
为了默认选择其中一个,可以添加
load-module module-alsa-sink
load-module module-alsa-source device=hw:0,1
到我的~/.config/pulse/default.pa
(从 复制/etc/pulse/
)。这会在声音输出菜单中添加一个“内置音频”选项,默认情况下会选中该选项。这实际上是 S/PDIF 选项的别名(我发现这个解决方案有点烦人)。
解决方案 2:set-card-profile
Pulseaudio 命令列表卡揭示了一些有趣的信息。pacmd list-cards
输出列出了一张名为的卡 alsa_card.pci-0000_00_0e.0
,它有一个端口包含以下行的部分:
iec958-stereo-output: Digital Output (S/PDIF) (priority 0, latency offset 0 usec, available: unknown)
这是由 产生的module-udev-detect
,并且一定是声音设置获取有关其列为 S/PDIF 的输出信息的地方。通过查看列表卡在声音设置菜单中使用不同的输出选择,我发现差异在于设置为“活动配置文件”的内容。这,我发现,可以用 来改变set-card-profile
。添加
set-card-profile alsa_card.pci-0000_00_0e.0 output:iec958-stereo+input:analog-stereo
可以~/.config/pulse/default.pa
正常工作,因为我可以在之后获得 S/PDIF 输出pulsaudio -k
,但重新启动并登录后,声音输出将仍然设置为 HDMI。(显然,Pulseaudio 初始化以外的其他因素会改变卡配置文件设置。)因此,我default.pa
再次删除了本地文件并添加了命令
pacmd set-card-profile alsa_card.pci-0000_00_0e.0 output:iec958-stereo+input:analog-stereo
作为一个启动应用程序。这似乎奏效了,直到屏幕保护程序启动……当屏幕从屏幕保护程序唤醒时,卡配置文件再次更改为其他内容!我找到的解决方案是创建一个脚本,该脚本监听屏幕保护程序事件,在屏幕保护程序激活时检查卡配置文件设置,并在屏幕保护程序关闭时将其恢复为该设置。该脚本是这个答案(涉及设置接收器而不是卡配置文件),如下所示:
#!/bin/bash
my_card="alsa_card.pci-0000_00_0e.0"
watch="type=signal,interface=org.gnome.ScreenSaver"
screen_locked_signal="boolean true"
screen_unlocked_signal="boolean false"
_get_active_profile() {
pacmd list-cards | sed -n 's/^\s*[Aa]ctive\s\s*[Pp]rofile:\s*<\([^>]*\)>/\1/p'
}
last_profile=$(_get_active_profile)
# Watch for screensaver D-Bus signals
dbus-monitor --session "$watch" | ( \
while read signal; do
if [[ "$signal" =~ "$screen_locked_signal" ]]; then
# Screen locked: remember the current profile
last_profile=$(_get_active_profile)
elif [[ "$signal" =~ "$screen_unlocked_signal" ]]; then
# Screen unlocked: restore the last profile
pacmd set-card-profile "$my_card $last_profile"
fi
done)
将此脚本添加到启动应用程序可以解决屏幕保护程序问题。