シンクが1つしかない場合にデフォルトのオーディオ出力を設定する

シンクが1つしかない場合にデフォルトのオーディオ出力を設定する

Ubuntu 22.04.1 LTS を新規インストールしました (以前は 18.04 を使用していました)。サウンド設定メニューには出力の選択肢があり、そのうち 2 番目の選択肢 (S/PDIF) が私が使用しているもので、これを選択するとオーディオが問題なく動作します。

オーディオ出力メニュー

しかし、再起動するたびにオーディオ出力が HDMI 出力にリセットされ、デフォルトで S/PDIF に設定する必要があります。私が見つけた (以前のインストールで使用した) 解決策には、Pulseaudio に適したシンクを選択することが含まれますが、現在はシンクが 1 つしかないようです。出力は次のとおりpactl list short sinksです。

6   alsa_output.pci-0000_00_0e.0.hdmi-stereo    module-alsa-card.c  s16le 2ch 44100Hz   SUSPENDED

の出力にはaplay -lS/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

さらに深く調べたところ、2 つの有効な解決策が見つかりました。そのうち 2 番目の解決策に完全に満足しています。

解決策 1: 明示的な alsa-sink

最初にリストされている2つのサブデバイスは、aplay -l実際にはどちらもS/PDIFであることに気づきました。Javaからサウンドを再生しているからです(自分の音楽プレーヤー) は、出力デバイスを または に設定すると動作しplughw:0,0plughw:0,1DAC 上の 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)

このスクリプトもスタートアップ アプリケーションに追加すると、スクリーン セーバーの問題が解消されます。

関連情報