當只有一個接收器時設定預設音訊輸出

當只有一個接收器時設定預設音訊輸出

我全新安裝了 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:設定卡片設定文件

脈衝音頻指令清單卡揭示了一些有趣的資訊。輸出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)

將此腳本新增至啟動應用程式也可以解決螢幕保護程式問題。

相關內容