当只有一个接收器时设置默认音频输出

当只有一个接收器时设置默认音频输出

我全新安装了 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,0plughw: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)

将此脚本添加到启动应用程序可以解决屏幕保护程序问题。

相关内容