PulseAudioカードの複数のポート/プロファイルに固有のオーディオを出力するには?

PulseAudioカードの複数のポート/プロファイルに固有のオーディオを出力するには?

次の属性を持つカードがあるとしましょう。

index: 1
name: <alsa_card.pci-0000_00_1f.3>
driver: <module-alsa-card.c>
owner module: 7
properties:
    alsa.card = "0"
    alsa.card_name = "HDA Intel PCH"
    alsa.long_card_name = "HDA Intel PCH at 0xf7240000 irq 129"
    alsa.driver_name = "snd_hda_intel"
    device.bus_path = "pci-0000:00:1f.3"
    sysfs.path = "/devices/pci0000:00/0000:00:1f.3/sound/card0"
    device.bus = "pci"
    device.vendor.id = "8086"
    device.vendor.name = "Intel Corporation"
    device.product.id = "a170"
    device.form_factor = "internal"
    device.string = "0"
    device.description = "Built-in Audio"
    module-udev-detect.discovered = "1"
    device.icon_name = "audio-card-pci"
profiles:
    input:analog-stereo: Analog Stereo Input (priority 60, available: unknown)
    output:analog-stereo: Analog Stereo Output (priority 6000, available: unknown)
    output:analog-stereo+input:analog-stereo: Analog Stereo Duplex (priority 6060, available: unknown)
    output:hdmi-stereo: Digital Stereo (HDMI) Output (priority 5400, available: unknown)
    output:hdmi-stereo+input:analog-stereo: Digital Stereo (HDMI) Output + Analog Stereo Input (priority 5460, available: unknown)
    output:hdmi-surround: Digital Surround 5.1 (HDMI) Output (priority 300, available: unknown)
    output:hdmi-surround+input:analog-stereo: Digital Surround 5.1 (HDMI) Output + Analog Stereo Input (priority 360, available: unknown)
    output:hdmi-surround71: Digital Surround 7.1 (HDMI) Output (priority 300, available: unknown)
    output:hdmi-surround71+input:analog-stereo: Digital Surround 7.1 (HDMI) Output + Analog Stereo Input (priority 360, available: unknown)
    output:hdmi-stereo-extra1: Digital Stereo (HDMI 2) Output (priority 5200, available: unknown)
    output:hdmi-stereo-extra1+input:analog-stereo: Digital Stereo (HDMI 2) Output + Analog Stereo Input (priority 5260, available: unknown)
    output:hdmi-stereo-extra2: Digital Stereo (HDMI 3) Output (priority 5200, available: unknown)
    output:hdmi-stereo-extra2+input:analog-stereo: Digital Stereo (HDMI 3) Output + Analog Stereo Input (priority 5260, available: unknown)
    output:hdmi-surround-extra2: Digital Surround 5.1 (HDMI 3) Output (priority 100, available: unknown)
    output:hdmi-surround-extra2+input:analog-stereo: Digital Surround 5.1 (HDMI 3) Output + Analog Stereo Input (priority 160, available: unknown)
    output:hdmi-surround71-extra2: Digital Surround 7.1 (HDMI 3) Output (priority 100, available: unknown)
    output:hdmi-surround71-extra2+input:analog-stereo: Digital Surround 7.1 (HDMI 3) Output + Analog Stereo Input (priority 160, available: unknown)
    off: Off (priority 0, available: unknown)
active profile: <output:hdmi-stereo-extra1+input:analog-stereo>
sinks:
    alsa_output.pci-0000_00_1f.3.hdmi-stereo-extra1/#1: Built-in Audio Digital Stereo (HDMI 2)
sources:
    alsa_output.pci-0000_00_1f.3.hdmi-stereo-extra1.monitor/#1: Monitor of Built-in Audio Digital Stereo (HDMI 2)
    alsa_input.pci-0000_00_1f.3.analog-stereo/#2: Built-in Audio Analog Stereo
ports:
    analog-input-headphone-mic: Microphone (priority 8700, latency offset 0 usec, available: unknown)
        properties:
            device.icon_name = "audio-input-microphone"
    analog-input-headset-mic: Headset Microphone (priority 8700, latency offset 0 usec, available: unknown)
        properties:
            device.icon_name = "audio-input-microphone"
    analog-output-lineout: Line Out (priority 9900, latency offset 0 usec, available: no)
        properties:

    analog-output-speaker: Speakers (priority 10000, latency offset 0 usec, available: unknown)
        properties:
            device.icon_name = "audio-speakers"
    analog-output-headphones: Headphones (priority 9000, latency offset 0 usec, available: yes)
        properties:
            device.icon_name = "audio-headphones"
    hdmi-output-0: HDMI / DisplayPort (priority 5900, latency offset 0 usec, available: no)
        properties:
            device.icon_name = "video-display"
    hdmi-output-1: HDMI / DisplayPort 2 (priority 5800, latency offset 0 usec, available: yes)
        properties:
            device.icon_name = "video-display"
            device.product.name = "Inspiron 7459"
    hdmi-output-2: HDMI / DisplayPort 3 (priority 5700, latency offset 0 usec, available: no)
        properties:
            device.icon_name = "video-display"

独自のオーディオストリームをアナログ出力ライン出力し、可能であればすべてのポート(hdmi-output-0、hdmi-output-1、hdmi-output2):ポートに出力したいと思います。 PulseAudioで両方を行う方法はありますか?私はALSAで次のことができることを知っています。

gst-launch-1.0 audiotestsrc ! alsasink device="hw:0,0" gst-launch-1.0 audiotestsrc ! alsasink device="hw:0,3"

しかし、Pulseで見た内容によると、「カード」の「プロファイル」を設定する必要があり、すべてのプロファイルが出力ポートにバインドされているようです。

これを行う方法はありますか?それともPulseはこれに関して根本的に制限されていますか?

答え1

必要なすべてのHDMI出力を別々のシンクとして公開するカスタム設定ファイルを作成する必要があります。

見るはじめにPulseaudioドキュメントのファイル/usr/share/pulseaudio/alsa-mixer/paths/、特に。analog-output.conf.commonでコメント

残念ながら、これらの内容はすべて正しく文書化されていません。


動作させる:

/usr/share/pulseaudio/alsa-mixer/profile-sets/default.conf次の内容を修正して追加します。

[Profile output:analog-stereo+output:hdmi-stereo+output:hdmi-stereo+output:hdmi-stereo]
description = Foobar
output-mappings = analog-stereo hdmi-stereo hdmi-stereo-extra1 hdmi-stereo-extra2
input-mappings = 

次に、通常のデスクトップユーザーとしてPulseを再起動します。

pulseaudio --kill; sleep 1; pulseaudio --start

新しいプロファイルを使用するようにカードを設定します。

pacmd set-card-profile 0 output:analog-stereo+output:hdmi-stereo+output:hdmi-stereo+output:hdmi-stereo

これで、pacmd list-sinks新しい設定ファイルで識別された各ポートのさまざまなリスナーが表示されます。

最後にやるべきことは、システムファイルを壊さないようにする方法を見つけることです。可能であれば、ファイルを介してこれを行うのが最善です~/.config/pulse


編集する

ここM-Audio USB デバイスの新しいプロファイルを設定する方法を説明します。私も私がしたことを調べましたが、それはいくつかの変更でした(私は既存のファイルを変更するのが好きではなく、パッケージのアップグレードで上書きされる傾向があります)。

/etc/udev/rules.d/91-pulseaudio.rules次の内容で新しいファイルを追加します。

# Custom Profile for onboard Intel 8086:12c0

SUBSYSTEM!="sound", GOTO="xpulseaudio_end"
ACTION!="change", GOTO="xpulseaudio_end"
KERNEL!="card*", GOTO="xpulseaudio_end"

SUBSYSTEMS=="pci", ATTRS{vendor}=="0x8086", ATTRS{device}=="0x1c20", ENV{PULSE_PROFILE_SET}="my-personal.conf"

LABEL="xpulseaudio_end"

これはほとんどのコピーです/lib/udev/rules.d/90-pulseaudio.rules

これはオンボードサウンドカードなので、これらのルールは起動時に実行する必要があるため、initrdカーネルで使用されるルールの1つである必要があります。私は自分のカーネルをコンパイルしてmake-kpkgこのルールをコピーしたので、これは私にとって問題ではありません。

/usr/share/pulseaudio/alsa-mixer/profile-sets/my-personal.conf次に、必要な設定(他の設定ファイルからコピーおよび変更)を一覧表示できる新しいファイルを追加します。

答え2

私はHTC Viveが接続されているFedora 32でGeForce RTX 2070を使用しています。誰かがVRをプレイすると、他の人がモニターで視聴することがよくあります。 Viveとモニタの両方にストリーミングするようにゲームオーディオを設定しました。

まず、すべてのオーディオデバイスの検索を使用してaplay -Lから、デバイスをテストして、どのデバイスが接続されているかを確認します。たとえば、speaker-test -D hdmi:CARD=NVidia,DEV=1 -c2。しかし、コマンドを実行すると、Nvidiaドライバで奇妙なエラーが発生しました。

$ speaker-test -D hdmi:CARD=NVidia,DEV=1 -c2 

speaker-test 1.2.3

Playback device is hdmi:CARD=NVidia,DEV=1
Stream parameters are 48000Hz, S16_LE, 2 channels
Using 16 octaves of pink noise
Rate set to 48000Hz (requested 48000Hz)
Buffer size range from 64 to 8544000
Period size range from 32 to 4272000
Using max buffer size 8544000
Periods = 4
Unable to set hw params for playback: Cannot allocate memory
Setting of hwparams failed: Cannot allocate memory

より低いバッファサイズを明示的に設定すると、エラーが解決されます。

$ speaker-test -D hdmi:CARD=NVidia,DEV=1 -c2 -b10000

speaker-test 1.2.3

Playback device is hdmi:CARD=NVidia,DEV=1
Stream parameters are 48000Hz, S16_LE, 2 channels
Using 16 octaves of pink noise
Rate set to 48000Hz (requested 48000Hz)
Buffer size range from 64 to 8544000
Period size range from 32 to 4272000
Requested buffer time 10000 us
Periods = 4
was set period_size = 96
was set buffer_size = 480
 0 - Front Left
^C 1 - Front Right
Time per period = 0.438162

デバイスに有効な出力を決定したら、ファイルを生成してpulseaudioに明示的に追加します.config/pulse/default.pa。デバイスの説明は必要に応じて設定できます。これは私のファイルです:

load-module module-alsa-sink device=hdmi:CARD=NVidia,DEV=0 sink_properties="device.description='NVIDIA HDMI Vive'"
load-module module-alsa-sink device=hdmi:CARD=NVidia,DEV=1 sink_properties="device.description='NVIDIA HDMI monitor'"

.include /etc/pulse/default.pa

を実行してpulseaudioを再起動し、デバイスが表示されていることをsystemctl --user restart pulseaudio.service確認しますpavucontrol。最後に、paprefs を使用してすべてのオーディオデバイスの同時出力をイネーブルにします。

関連情報