Wireplumber - 동일한 사운드 카드의 여러 수신기로 동시 출력

Wireplumber - 동일한 사운드 카드의 여러 수신기로 동시 출력

저는 Fedora 38(6.5.6-200.fc38.x86_64) wireplumber를 사용하고 있습니다: libwireplumber 0.4.14로 컴파일됨 Pipewire: libpipewire 0.3.81로 컴파일됨

그래서 동일한 사운드 카드의 여러 수신기로 동시에 출력해 보았습니다. 다음 기사를 찾았습니다.https://wiki.archlinux.org/title/WirePlumber 내 시나리오는 2.6(동일한 사운드 카드의 여러 수신기로 동시 출력)에 설명되어 있습니다. (제 생각에는...) 그래서 시도해 봤습니다. 하지만 작동하지 않습니다. (연결되어 있고 선택된 수신기 하나만 소리가 납니다.)

설명된 시나리오를 실행하기 전에는 pavucontrol에서 하나의 수신기만 선택할 수 있었습니다. 그 이후의 모든 수신기는 선택 사항이었습니다. -> 진행 상황이지만 예상했던 것과는 다릅니다. 더 깊이 파고들었더니 위키 문서에 뭔가 잘못 설명되어 있거나 제대로 이해하지 못한 것 같습니다.

output-mappings = analog-stereo hdmi-stereo위키에서 설명하는 내용은 아닌 것 같습니다 . "출력 맵의 다중 설명 수신기"에 대한 다른 소스를 찾을 수 없습니다. 반면, 이는 수신기를 연결하는 것이 아니라 특성을 정의하는 ALSA 카드 프로필 프로필입니다.


그래서 좀 더 깊이 파고들고 나면 배관공이 이 작업을 수행해야 한다고 생각합니다. 인터넷 검색을 통해 작동하지 못한 후 chatgpt에 요청했습니다. 그의 아이디어는 흐름을 수신기로 라우팅하는 와이어맨 전략이었습니다.

하지만 작동하지 않거나 올바르게 수행하지 않습니다. 문서도 나에게 도움이 되지 않았습니다.


약간의 기술적인 부분을 살펴보겠습니다.

먼저 출력이 커널 측에서 작동하는지 확인합니다.

aplay -l

  **** List of PLAYBACK Hardware Devices ****
  card 0: PCH [HDA Intel PCH], device 0: ALC233 Analog [ALC233 Analog]
    Subdevices: 0/1
    Subdevice #0: subdevice #0
  card 0: PCH [HDA Intel PCH], device 3: HDMI 0 [VSEVEN]
    Subdevices: 1/1
    Subdevice #0: subdevice #0
  card 0: PCH [HDA Intel PCH], device 7: HDMI 1 [TD1655]
    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

systemctl --user mask pipewire{,-pulse} wireplumber --no

speaker-test -Dhw:0,0 -c2   => works! headphone jack
speaker-test -Dhw:0,3 -c2   => works! displayport Port
speaker-test -Dhw:0,7 -c2   => works! hdmi(2) Port

systemctl --user unmask pipewire{,-pulse} wireplumber --no

alsa 및 wireplumumber 조정(archwiki의 2.6)

vim /usr/share/alsa-card-profile/mixer/profile-sets/multiple.conf

다음에 추가:

[General]
auto-profiles = no

[Mapping analog-stereo]
device-strings = front:%f
channel-map = left,right
paths-output = analog-output analog-output-lineout analog-output-speaker analog-output-headphones analog-output-headphones-2
paths-input = analog-input-front-mic analog-input-rear-mic analog-input-internal-mic analog-input-dock-mic analog-input analog-input-mic analog-input-linein analog-input-aux analog-input-video analog-input-tvtuner analog-input-fm analog-input-mic-line analog-input-headphone-mic analog-input-headset-mic
priority = 15

[Mapping hdmi-stereo]
description = Digital Stereo (HDMI)
device-strings = hdmi:%f
paths-output = hdmi-output-0
channel-map = left,right
priority = 9
direction = output


[Profile multiple]
description = Output to All
output-mappings = analog-stereo hdmi-stereo

vim /usr/share/wireplumber/main.lua.d/51-alsa-custom.lua

rule = {
    matches = {
      {
        { "device.nick", "matches", "HDA Intel PCH" },
      },
    },
    apply_properties = {
      ["api.alsa.use-acp"] = true,
      ["api.acp.auto-profile"] = false,
      ["api.acp.auto-port"] = false,
      ["device.profile-set"] = "multiple.conf",
      ["device.profile"] = "multiple",
    },
  }
table.insert(alsa_monitor.rules,rule)

배선 담당자를 확인하십시오(지금 싱크대가 2개 모두 있는 경우).

wpctl status

Audio
 ├─ Devices:
 │      40. Built-in Audio                      [alsa]
 ├─ Sinks:
 │  *   41. Built-in Audio Analog Stereo        [vol: 0.79 MUTED]
 │      42. Built-in Audio Digital Stereo (HDMI) [vol: 0.72]
 ├─ Sink endpoints:
 ├─ Sources:
 ├─ Source endpoints:
 └─ Streams:
        53. Chromium                                                    
             54. output_FL       > ALC233 Analog:playback_FL    [active]
             55. output_FR       > ALC233 Analog:playback_FR    [active]

2개의 수신기를 사용할 수 있습니다(앞서 본 세 번째 수신기는 테스트 목적으로 연결되지 않았습니다).
위 단계를 수행하기 전에는 wpctl 상태에서 하나의 수신기만 볼 수 있었습니다.

운영자 정책 만들기

참고: 올바른 미디어 이름과 노드 이름을 확인하고 pactl list sinks몇 가지 변형도 시도했습니다.

vim /usr/share/wireplumber/policy.lua.d/15-chromium-sink.lua

policy = {
  {
    {
      matches = {
        {
          { "media.name", "==", "Playback" }
        }
      },
      actions = {
        { type = "route", path = "alsa_output.pci-0000_00_1f.3.analog-stereo" },
        { type = "route", path = "alsa_output.pci-0000_00_1f.3.hdmi-stereo" }
      }
    }
  }
}

WirePlumber(및 Chrome)를 이후 또는 바로 지금 다시 시작 systemctl --user restart wireplumber 하지만 작동하지 않습니다. (하나의 수신기에서만 출력)

운영자 오류 로그

내 정책과 관련된 로그를 찾을 수 없습니다.
이 정책이 사용되는지, 아니면 올바른지 모르겠습니다...

wireplumber 서비스가 다시 시작된 후 Journalctl이 표시됩니다.

Oct 13 10:38:48 xxx wireplumber[907]: stopped by signal: Terminated
Oct 13 10:38:48 xxx systemd[896]: Stopping wireplumber.service - Multimedia Service Session Manager...
Oct 13 10:38:48 xxx wireplumber[907]: disconnected from pipewire
Oct 13 10:38:48 xxx systemd[896]: Stopped wireplumber.service - Multimedia Service Session Manager.
Oct 13 10:38:48 xxx systemd[896]: Started wireplumber.service - Multimedia Service Session Manager.
Oct 13 10:38:48 xxx wireplumber[2059]: SPA handle 'api.libcamera.enum.manager' could not be loaded; is it installed?
Oct 13 10:38:48 xxx wireplumber[2059]: PipeWire's libcamera SPA missing or broken. libcamera not supported.
Oct 13 10:38:48 xxx wireplumber[2059]: GetManagedObjects() failed: org.freedesktop.DBus.Error.NameHasNoOwner
Oct 13 10:38:48 xxx wireplumber[2059]: <WpSiAudioAdapter:0x558c5887c3c0> Object activation aborted: proxy destroyed
Oct 13 10:38:48 xxx wireplumber[2059]: <WpSiAudioAdapter:0x558c5887c3c0> failed to activate item: Object activation aborted: proxy destroyed


해결 방법 테스트 1

pactl load-module module-combine-sink조합 싱크를 만드는 데 사용됩니다 . 수동으로 Chromium을 해당 싱크로 설정하고 pavucontrol모든 장치로 출력하는 경우. 그러나 wireplumber를 사용하여 이를 직접 자동화하는 방법은 무엇입니까?

해결 방법 테스트 2

여기에 명시된 바와 같이https://discussion.fedoraproject.org/t/configure-audio-for-simultaneous-output/74946/7

pactl load-module module-null-sink media.class=Audio/Sink sink_name=my-combined-sink channel_map=stereoqjackctl"다이어그램"에서 연결을 시작 하고 연결합니다. 이 변경 사항을 영구적으로 적용하는 방법은 아직 알려져 있지 않습니다.


이것은 Wireplumumber와 직접 작업해야 합니다. 그렇죠? 오른쪽? ;)

관련 정보