From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from atuin.qyliss.net (localhost [IPv6:::1]) by atuin.qyliss.net (Postfix) with ESMTP id 6069C18746; Sat, 26 Jul 2025 11:29:23 +0000 (UTC) Received: by atuin.qyliss.net (Postfix, from userid 993) id 80114186F4; Sat, 26 Jul 2025 11:29:21 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on atuin.qyliss.net X-Spam-Level: * X-Spam-Status: No, score=1.2 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,DMARC_MISSING,PDS_OTHER_BAD_TLD,RCVD_IN_DNSWL_LOW, SPF_HELO_PASS autolearn=no autolearn_force=no version=4.0.1 Received: from fout-b8-smtp.messagingengine.com (fout-b8-smtp.messagingengine.com [202.12.124.151]) by atuin.qyliss.net (Postfix) with ESMTPS id BFD4F1873E for ; Sat, 26 Jul 2025 11:29:19 +0000 (UTC) Received: from phl-compute-06.internal (phl-compute-06.phl.internal [10.202.2.46]) by mailfout.stl.internal (Postfix) with ESMTP id B7D121D0038B; Sat, 26 Jul 2025 07:29:18 -0400 (EDT) Received: from phl-mailfrontend-02 ([10.202.2.163]) by phl-compute-06.internal (MEProxy); Sat, 26 Jul 2025 07:29:18 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=alyssa.is; h=cc :content-type:content-type:date:date:from:from:in-reply-to :in-reply-to:message-id:mime-version:references:reply-to:subject :subject:to:to; s=fm2; t=1753529358; x=1753615758; bh=YxHDxYUVp/ QGFIvOjih4wwoWejVt/7Tkvll6O0bStbs=; b=m5k3dvEtI94zycKYX9Yp78D9Sk gdOcaMpGjMmo1085xKasHCxWrq5eSOYU4Y/tNWGmTah32A7q8uTxlL3puGJBrWKl ZzAtNEWLBMibKgb776+IHf5kHYfHaLo/eP7FYmgqmhcqEN1YtnA3gdGQl6674grO PKIuFQGTyIG1vJ6IPs2/CGIZhlCvlTF4Lhtv+QeLnhfczfZ4yCi/Cw8VpHj21kvl i9Qo5XVfyGPBAsBDpA7wf7u6i0wSmMiU96qCRoS/s5AZ71D7BePrmXk8La+68IoN rL71OaIHvjN4/tFEOokbs5s1nfexKG5TOwgzfcRGqAC5y9vFpGuG5yh3i9mA== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-type:content-type:date:date :feedback-id:feedback-id:from:from:in-reply-to:in-reply-to :message-id:mime-version:references:reply-to:subject:subject:to :to:x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s=fm3; t= 1753529358; x=1753615758; bh=YxHDxYUVp/QGFIvOjih4wwoWejVt/7Tkvll 6O0bStbs=; b=epNCpBQ937EGicBQKvDzk283Pb2KaKtpiNjUcqQNL9mLAtPrttc QEhPjiABNLWYxS3RDVLVA9rRTgsLI0fvJabbEzUEXr/OzaRuVwe9QubS2ZNZHHdC IQAtVs1BE0e2Kzh+4adYxagfdKPxH/J28zmDTmrfbxUqE6uzNfFgtHUVKfC+Ikut BSJ4I4ZvzYRTtg5dAT7Zi1AXhHFjeqIPXHE8GrOU9CgP6LAXnN341gFf7vsRcc8S /DOS6fqVwwocwi8IWGYKKrL7RRZcUZHmuCDnRmJ/k0w+huQSaP7YkRFzzk03qF0g Jralrp7+2DxEUo0LlB/stavpvFCX5VP/16A== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeeffedrtdefgdekiedvlecutefuodetggdotefrod ftvfcurfhrohhfihhlvgemucfhrghsthforghilhdpuffrtefokffrpgfnqfghnecuuegr ihhlohhuthemuceftddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmdenucfjug hrpefhvffujghffffkgggtsehgtderredttdejnecuhfhrohhmpeetlhihshhsrgcutfho shhsuceohhhisegrlhihshhsrgdrihhsqeenucggtffrrghtthgvrhhnpeegfeektdeije fgveeigfeuveefgeeigffggeduffdvueevffetgeekueelvdelfeenucffohhmrghinhep shhhuhhtughofihnrdhfihhnrghlpdgtrghrugdrnhgrmhgvpdhptghmrdhsthhrvggrmh enucevlhhushhtvghrufhiiigvpedtnecurfgrrhgrmhepmhgrihhlfhhrohhmpehhihes rghlhihsshgrrdhishdpnhgspghrtghpthhtohepvddpmhhouggvpehsmhhtphhouhhtpd hrtghpthhtohepuggvmhhiohgsvghnohhurhesghhmrghilhdrtghomhdprhgtphhtthho peguvghvvghlsehsphgvtghtrhhumhdqohhsrdhorhhg X-ME-Proxy: Feedback-ID: i12284293:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Sat, 26 Jul 2025 07:29:18 -0400 (EDT) Received: by sf.qyliss.net (Postfix, from userid 1000) id 506872D841307; Sat, 26 Jul 2025 13:29:07 +0200 (CEST) From: Alyssa Ross To: Demi Marie Obenour , Spectrum OS Development Subject: Re: [PATCH v6 5/5] img/app: Run PipeWire and WirePlumber in the VMs In-Reply-To: <5286585c-360a-4ef3-a6fc-752a5963d855@gmail.com> References: <2862317f-1419-4405-870d-f7631bcd1d2a@gmail.com> <5286585c-360a-4ef3-a6fc-752a5963d855@gmail.com> Date: Sat, 26 Jul 2025 13:29:04 +0200 Message-ID: <8734ajfawv.fsf@alyssa.is> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="=-=-="; micalg=pgp-sha512; protocol="application/pgp-signature" Message-ID-Hash: AJOKRBM625Y6TMUK5OG3HZYIPEQADVEG X-Message-ID-Hash: AJOKRBM625Y6TMUK5OG3HZYIPEQADVEG X-MailFrom: hi@alyssa.is X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-devel.spectrum-os.org-0; header-match-devel.spectrum-os.org-1; header-match-devel.spectrum-os.org-2; header-match-devel.spectrum-os.org-3; header-match-devel.spectrum-os.org-4; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.9 Precedence: list List-Id: Patches and low-level development discussion Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Demi Marie Obenour writes: > WirePlumber is completely overkill as a session manager here, and > ideally a trivial session manager would be used instead. PipeWire is > configured to listen on the PulseAudio socket, so PulseAudio > compatibility works. pw-record and pw-play both work, and if PulseAudio > is installed paplay and parecord also work. This does install a lot of > unnecessary files into the VMs, which will hopefully be removed > later as part of a debloating effort. > > Signed-off-by: Demi Marie Obenour > --- > img/app/Makefile | 18 +- > img/app/default.nix | 3 + > img/app/etc/mdev.conf | 1 + > img/app/etc/pipewire/pipewire.conf | 199 ++++++++++++++++++ > .../etc/s6-rc/app/dependencies.d/wireplumber | 0 > .../etc/s6-rc/pipewire/dependencies.d/dbus | 0 > img/app/etc/s6-rc/pipewire/notification-fd | 1 + > .../s6-rc/pipewire/notification-fd.license | 2 + > img/app/etc/s6-rc/pipewire/run | 23 ++ > img/app/etc/s6-rc/pipewire/type | 1 + > img/app/etc/s6-rc/pipewire/type.license | 2 + > .../etc/s6-rc/wireplumber/dependencies.d/dbus | 0 > .../s6-rc/wireplumber/dependencies.d/pipewire | 0 > img/app/etc/s6-rc/wireplumber/run | 4 + > img/app/etc/s6-rc/wireplumber/type | 1 + > img/app/etc/s6-rc/wireplumber/type.license | 2 + > .../wireplumber.conf.d/99_spectrum.conf | 39 ++++ > 17 files changed, 293 insertions(+), 3 deletions(-) > create mode 100644 img/app/etc/pipewire/pipewire.conf > create mode 100644 img/app/etc/s6-rc/app/dependencies.d/wireplumber > create mode 100644 img/app/etc/s6-rc/pipewire/dependencies.d/dbus > create mode 100644 img/app/etc/s6-rc/pipewire/notification-fd > create mode 100644 img/app/etc/s6-rc/pipewire/notification-fd.license > create mode 100644 img/app/etc/s6-rc/pipewire/run > create mode 100644 img/app/etc/s6-rc/pipewire/type > create mode 100644 img/app/etc/s6-rc/pipewire/type.license > create mode 100644 img/app/etc/s6-rc/wireplumber/dependencies.d/dbus > create mode 100644 img/app/etc/s6-rc/wireplumber/dependencies.d/pipewire > create mode 100644 img/app/etc/s6-rc/wireplumber/run > create mode 100644 img/app/etc/s6-rc/wireplumber/type > create mode 100644 img/app/etc/s6-rc/wireplumber/type.license > create mode 100644 img/app/etc/wireplumber/wireplumber.conf.d/99_spectru= m.conf > > diff --git a/img/app/Makefile b/img/app/Makefile > index 4b4d64f81d99a01eebe777f3737fef813ebb6d3f..69bc9afc0756b0628ddc1fe53= 913a75b45b3213b 100644 > --- a/img/app/Makefile > +++ b/img/app/Makefile > @@ -53,7 +53,10 @@ VM_FILES =3D \ > etc/s6-linux-init/scripts/rc.init \ > etc/s6-linux-init/scripts/rc.shutdown \ > etc/s6-linux-init/scripts/rc.shutdown.final \ > - etc/xdg/xdg-desktop-portal/portals.conf > + etc/xdg/xdg-desktop-portal/portals.conf \ > + etc/pipewire/pipewire.conf \ > + etc/wireplumber/wireplumber.conf.d/99_spectrum.conf > + Sorting again! (Don't worry about it too much =E2=80=94 if it was the only issue I'd just fix it myself when applying the patch.) > VM_DIRS =3D dev run proc sys tmp \ > etc/s6-linux-init/run-image/service \ > etc/s6-linux-init/run-image/user \ > @@ -85,6 +88,7 @@ build/rootfs.erofs: ../../scripts/make-erofs.sh $(PACKA= GES_FILE) $(VM_FILES) $(V > VM_S6_RC_FILES =3D \ > etc/s6-rc/app/dependencies.d/dbus \ > etc/s6-rc/app/dependencies.d/wayland-proxy-virtwl \ > + etc/s6-rc/app/dependencies.d/wireplumber \ > etc/s6-rc/app/run \ > etc/s6-rc/app/type \ > etc/s6-rc/dbus/notification-fd \ > @@ -98,9 +102,16 @@ VM_S6_RC_FILES =3D \ > etc/s6-rc/mdevd/type \ > etc/s6-rc/ok-all/contents \ > etc/s6-rc/ok-all/type \ > + etc/s6-rc/pipewire/notification-fd \ > + etc/s6-rc/pipewire/run \ > + etc/s6-rc/pipewire/type \ > etc/s6-rc/wayland-proxy-virtwl/notification-fd \ > etc/s6-rc/wayland-proxy-virtwl/run \ > - etc/s6-rc/wayland-proxy-virtwl/type > + etc/s6-rc/wayland-proxy-virtwl/type \ > + etc/s6-rc/wireplumber/dependencies.d/dbus \ > + etc/s6-rc/wireplumber/dependencies.d/pipewire \ > + etc/s6-rc/wireplumber/run \ > + etc/s6-rc/wireplumber/type >=20=20 > build/etc/s6-rc: $(VM_S6_RC_FILES) > mkdir -p $$(dirname $@) > @@ -137,7 +148,7 @@ start-virtiofsd: scripts/start-virtiofsd.elb > .PHONY: start-virtiofsd >=20=20 > run-qemu: $(imgdir)/appvm/blk/root.img start-vhost-user-net start-virtio= fsd > - @../../scripts/run-qemu.sh -m 256 -cpu host -kernel $(KERNEL) -vga none= \ > + @../../scripts/run-qemu.sh -m 256 -kernel $(KERNEL) -vga none \ > -drive file=3D$(imgdir)/appvm/blk/root.img,if=3Dvirtio,format=3Draw= ,readonly=3Don \ > -append "root=3DPARTLABEL=3Droot nokaslr" \ > -gdb unix:build/gdb.sock,server,nowait \ This unrelated change is still here. > @@ -147,6 +158,7 @@ run-qemu: $(imgdir)/appvm/blk/root.img start-vhost-us= er-net start-virtiofsd > -chardev socket,id=3Dvirtiofsd,path=3Dbuild/virtiofsd.sock \ > -device vhost-user-fs-pci,chardev=3Dvirtiofsd,tag=3Dvirtiofs0 \ > -device virtio-gpu-rutabaga-pci,cross-domain=3Don,hostmem=3D8G \ > + -audio driver=3Dpipewire,model=3Dvirtio \ > -object memory-backend-memfd,id=3Dmem,size=3D256M,share=3Don \ > -numa node,memdev=3Dmem \ > -device vhost-vsock-pci,guest-cid=3D3 \ > diff --git a/img/app/default.nix b/img/app/default.nix > index 740643ac41f6473cdb6f6b0fd1f5f47f4493240d..d3eed1f0accdc8968d1ba5bde= c74ab597789082f 100644 > --- a/img/app/default.nix > +++ b/img/app/default.nix > @@ -48,6 +48,9 @@ let > pkgs.xwayland > pkgs.xdg-desktop-portal > pkgs.xdg-desktop-portal-gtk > + # Depends on pulseaudio libs > + pkgs.pipewire > + pkgs.wireplumber > ]; > })).fhsenv; > in > diff --git a/img/app/etc/mdev.conf b/img/app/etc/mdev.conf > index f2101e1f683c49808358b25520080c59ed2afa8e..0e4a1a088522c05da9e0ce15f= e135c40d6cf3064 100644 > --- a/img/app/etc/mdev.conf > +++ b/img/app/etc/mdev.conf > @@ -5,3 +5,4 @@ > $INTERFACE=3D.* 0:0 660 ! +/etc/mdev/iface > $MODALIAS=3Dvirtio:d0000001Av.* 0:0 660 ! +/etc/mdev/virtiofs > dri/card0 0:0 660 +background { /etc/mdev/listen card0 } > +snd/controlC0 0:0 660 +background { /etc/mdev/listen controlC0 } > diff --git a/img/app/etc/pipewire/pipewire.conf b/img/app/etc/pipewire/pi= pewire.conf > new file mode 100644 > index 0000000000000000000000000000000000000000..e5a413a409f46e7fe176102bb= d6780db14f85dba > --- /dev/null > +++ b/img/app/etc/pipewire/pipewire.conf > @@ -0,0 +1,199 @@ > +# SPDX-License-Identifier: MIT > + > +# Copyright =C2=A9 2018 Wim Taymans > +# Copyright =C2=A9 2025 Demi Marie Obenour > +# > +# Permission is hereby granted, free of charge, to any person obtaining a > +# copy of this software and associated documentation files (the "Softwar= e"), > +# to deal in the Software without restriction, including without limitat= ion > +# the rights to use, copy, modify, merge, publish, distribute, sublicens= e, > +# and/or sell copies of the Software, and to permit persons to whom the > +# Software is furnished to do so, subject to the following conditions: > +# > +# The above copyright notice and this permission notice (including the n= ext > +# paragraph) shall be included in all copies or substantial portions of = the > +# Software. > +# > +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRES= S OR > +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILIT= Y, > +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHA= LL > +# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR O= THER > +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING > +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER > +# DEALINGS IN THE SOFTWARE. > + > +# This file is based on the upstream default configuration. This can be > +# found in upstream GitLab or in any distro with a recent version of Pip= eWire. > +# The following changes have been made: > +# > +# - Conditions that have known values in Spectrum VMs are omitted. > +# - Modules for hardware devices Spectrum VMs don't have are not loaded. > +# - The PulseAudio emulation server is loaded. > +# - Settings for VMs are applied unconditionally. > +# - Most comments in the upstream files have been removed. > +# - Device nodes for virtio-sound devices have been added. > +# - Integration with udev and logind is removed. > +context.properties =3D { > + # Upstream defaults. > + link.max-buffers =3D 16 > + core.daemon =3D true > + core.name =3D pipewire-0 > + # Account for running in a VM > + default.clock.min-quantum =3D 1024 > +} > + > +# Upstream defaults, with support for AVB, V4L2, libcamera > +# bluez, Vulkan, JACK, and video conversion omitted. > +context.spa-libs =3D { > + audio.convert.* =3D audioconvert/libspa-audioconvert > + api.alsa.* =3D alsa/libspa-alsa > + support.* =3D support/libspa-support > +} > + > +context.modules =3D [ > + # Upstream defaults > + { name =3D libpipewire-module-rt > + args =3D { nice.level =3D -11, rt.prio =3D 88 } > + } > + { name =3D libpipewire-module-protocol-native } > + { name =3D libpipewire-module-metadata } > + { name =3D libpipewire-module-spa-device-factory } > + { name =3D libpipewire-module-spa-node-factory } > + { name =3D libpipewire-module-client-node } > + { name =3D libpipewire-module-access } > + { name =3D libpipewire-module-client-device } > + { name =3D libpipewire-module-portal } > + { name =3D libpipewire-module-adapter } > + { name =3D libpipewire-module-link-factory } > + { name =3D libpipewire-module-session-manager } > + > + # Load the PulseAudio server into PipeWire. > + # This avoids needing a separate pipewire-pulse > + # process. The args are those used when running > + # in a VM. > + { name =3D libpipewire-module-protocol-pulse > + args =3D { > + server.address =3D [ "unix:native" ] > + pulse.min.quantum =3D 1024/48000 > + } > + } > +] > + > +context.objects =3D [ > + # Upstream defaults > + { factory =3D spa-node-factory > + args =3D { > + factory.name =3D support.node.driver > + node.name =3D Dummy-Driver > + node.group =3D pipewire.dummy > + node.sync-group =3D sync.dummy > + priority.driver =3D 200000 > + } > + } > + { factory =3D spa-node-factory > + args =3D { > + factory.name =3D support.node.driver > + node.name =3D Freewheel-Driver > + priority.driver =3D 190000 > + node.group =3D pipewire.freewheel > + node.sync-group =3D sync.dummy > + node.freewheel =3D true > + } > + } > + > + # Spectrum doesn't use udev, so device nodes must be created statica= lly. > + # Creating them with pw-cli works as long as pw-cli is running, but > + # the nodes are destroyed when pw-cli exits. > + { factory =3D adapter > + args =3D { > + alsa.card =3D 0, > + alsa.card_name =3D "VirtIO SoundCard" > + alsa.device =3D 0 > + alsa.driver_name =3D "virtio_snd" > + alsa.id =3D "SoundCard" > + alsa.long_card_name =3D "VirtIO SoundCard at pci/0000:00:= 01.0/virtio0" > + alsa.name =3D "VirtIO SoundCard" > + alsa.subdevice =3D 0 > + alsa.subdevice_name =3D "subdevice #0" > + api.alsa.card.longname =3D "VirtIO SoundCard at pci/0000:00:= 01.0/virtio0" > + api.alsa.card.name =3D "VirtIO SoundCard" > + api.alsa.headroom =3D 0 > + api.alsa.path =3D "hw:0,0,0" > + api.alsa.pcm.card =3D 0, > + api.alsa.pcm.stream =3D "playback" > + audio.allowed-rates =3D [ ] > + audio.channels =3D 2 > + audio.format =3D "S32" > + audio.position =3D "FL,FR" > + audio.rate =3D 48000 > + factory.name =3D "api.alsa.pcm.sink" > + media.class =3D "Audio/Sink" > + node.name =3D "alsa_output.pci-0000_00_01.0.ana= log-stereo" > + node.suspend-on-idle =3D true > + } > + } > + { factory =3D adapter > + args =3D { > + alsa.card =3D 0, > + alsa.card_name =3D "VirtIO SoundCard" > + alsa.device =3D 0 > + alsa.driver_name =3D "virtio_snd" > + alsa.id =3D "SoundCard" > + alsa.long_card_name =3D "VirtIO SoundCard at pci/0000:00:= 01.0/virtio0" > + alsa.name =3D "VirtIO SoundCard" > + alsa.subdevice =3D 0 > + alsa.subdevice_name =3D "subdevice #0" > + api.alsa.card.longname =3D "VirtIO SoundCard at pci/0000:00:= 01.0/virtio0" > + api.alsa.card.name =3D "VirtIO SoundCard" > + api.alsa.headroom =3D 0 > + api.alsa.path =3D "hw:0,0,0" > + api.alsa.pcm.card =3D 0, > + api.alsa.pcm.stream =3D "capture" > + audio.allowed-rates =3D [ ] > + audio.channels =3D 2 > + audio.format =3D "S32" > + audio.position =3D "FL,FR" > + audio.rate =3D 48000 > + factory.name =3D "api.alsa.pcm.source" > + media.class =3D "Audio/Source" > + node.name =3D "alsa_input.pci-0000_00_01.0.anal= og-stereo" > + node.suspend-on-idle =3D true > + } > + } > +] > + > +# Load the modules that are in the default config *except* > +# for ones whose job is to maintain state. > +pulse.cmd =3D [ > + { cmd =3D "load-module" args =3D "module-always-sink" flags =3D [ ] } > + { cmd =3D "load-module" args =3D "module-device-manager" flags =3D [= ] } > +] > + > +# More default stuff. > +pulse.rules =3D [ > + { > + matches =3D [ > + { application.process.binary =3D "teams" } > + { application.process.binary =3D "teams-insiders" } > + { application.process.binary =3D "teams-for-linux" } > + { application.process.binary =3D "skypeforlinux" } > + ] > + actions =3D { quirks =3D [ force-s16-info ] } > + } > + { > + matches =3D [ { application.process.binary =3D "firefox" } ] > + actions =3D { quirks =3D [ remove-capture-dont-move ] } > + } > + { > + matches =3D [ { application.name =3D "~speech-dispatcher.*" } ] > + actions =3D { > + update-props =3D { > + pulse.min.req =3D 512/48000 > + pulse.min.quantum =3D 512/48000 > + pulse.idle.timeout =3D 5 > + } > + } > + } > +] > + > +context.exec =3D [] > diff --git a/img/app/etc/s6-rc/app/dependencies.d/wireplumber b/img/app/e= tc/s6-rc/app/dependencies.d/wireplumber > new file mode 100644 > index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae7= 75ad8c2e48c5391 > diff --git a/img/app/etc/s6-rc/pipewire/dependencies.d/dbus b/img/app/etc= /s6-rc/pipewire/dependencies.d/dbus > new file mode 100644 > index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae7= 75ad8c2e48c5391 > diff --git a/img/app/etc/s6-rc/pipewire/notification-fd b/img/app/etc/s6-= rc/pipewire/notification-fd > new file mode 100644 > index 0000000000000000000000000000000000000000..7ed6ff82de6bcc2a78243fc9c= 54d3ef5ac14da69 > --- /dev/null > +++ b/img/app/etc/s6-rc/pipewire/notification-fd > @@ -0,0 +1 @@ > +5 > diff --git a/img/app/etc/s6-rc/pipewire/notification-fd.license b/img/app= /etc/s6-rc/pipewire/notification-fd.license > new file mode 100644 > index 0000000000000000000000000000000000000000..c4a0586a407fe14c3e0855749= a7524ac3871dda4 > --- /dev/null > +++ b/img/app/etc/s6-rc/pipewire/notification-fd.license > @@ -0,0 +1,2 @@ > +SPDX-License-Identifier: CC0-1.0 > +SPDX-FileCopyrightText: 2025 Demi Marie Obenour > diff --git a/img/app/etc/s6-rc/pipewire/run b/img/app/etc/s6-rc/pipewire/= run > new file mode 100644 > index 0000000000000000000000000000000000000000..c5cf090fb4779e0f3ede1782a= da5c95ce5b25702 > --- /dev/null > +++ b/img/app/etc/s6-rc/pipewire/run > @@ -0,0 +1,23 @@ > +#!/bin/execlineb -P > +# SPDX-License-Identifier: EUPL-1.2+ > +# SPDX-FileCopyrightText: 2023-2024 Alyssa Ross > +# SPDX-FileCopyrightText: 2025 Demi Marie Obenour > + > +s6-ipcserver-socketbinder -B /run/user/0/pipewire-0 > +fdmove -c 3 0 > + > +s6-ipcserver-socketbinder -B /run/user/0/pipewire-0-manager > +fdmove -c 4 0 > + > +redirfd -r 0 /dev/null > + > +# Wait for sound devices to be available > +if { /etc/mdev/wait controlC0 } > + > +# Notify readiness. > +if { fdmove 1 5 echo } > +fdclose 5 > + > +export LISTEN_FDS 2 > +getpid LISTEN_PID > +pipewire > diff --git a/img/app/etc/s6-rc/pipewire/type b/img/app/etc/s6-rc/pipewire= /type > new file mode 100644 > index 0000000000000000000000000000000000000000..5883cff0cd1514b2836f4ffa3= 9fdac769a5213cb > --- /dev/null > +++ b/img/app/etc/s6-rc/pipewire/type > @@ -0,0 +1 @@ > +longrun > diff --git a/img/app/etc/s6-rc/pipewire/type.license b/img/app/etc/s6-rc/= pipewire/type.license > new file mode 100644 > index 0000000000000000000000000000000000000000..c4a0586a407fe14c3e0855749= a7524ac3871dda4 > --- /dev/null > +++ b/img/app/etc/s6-rc/pipewire/type.license > @@ -0,0 +1,2 @@ > +SPDX-License-Identifier: CC0-1.0 > +SPDX-FileCopyrightText: 2025 Demi Marie Obenour > diff --git a/img/app/etc/s6-rc/wireplumber/dependencies.d/dbus b/img/app/= etc/s6-rc/wireplumber/dependencies.d/dbus > new file mode 100644 > index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae7= 75ad8c2e48c5391 > diff --git a/img/app/etc/s6-rc/wireplumber/dependencies.d/pipewire b/img/= app/etc/s6-rc/wireplumber/dependencies.d/pipewire > new file mode 100644 > index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae7= 75ad8c2e48c5391 > diff --git a/img/app/etc/s6-rc/wireplumber/run b/img/app/etc/s6-rc/wirepl= umber/run > new file mode 100644 > index 0000000000000000000000000000000000000000..d58f1971c7387c896256a91ad= 0c92386a02fd9e2 > --- /dev/null > +++ b/img/app/etc/s6-rc/wireplumber/run > @@ -0,0 +1,4 @@ > +#!/bin/execlineb -P > +# SPDX-License-Identifier: EUPL-1.2+ > +# SPDX-FileCopyrightText: 2025 Demi Marie Obenour > +wireplumber --profile spectrum > diff --git a/img/app/etc/s6-rc/wireplumber/type b/img/app/etc/s6-rc/wirep= lumber/type > new file mode 100644 > index 0000000000000000000000000000000000000000..5883cff0cd1514b2836f4ffa3= 9fdac769a5213cb > --- /dev/null > +++ b/img/app/etc/s6-rc/wireplumber/type > @@ -0,0 +1 @@ > +longrun > diff --git a/img/app/etc/s6-rc/wireplumber/type.license b/img/app/etc/s6-= rc/wireplumber/type.license > new file mode 100644 > index 0000000000000000000000000000000000000000..c4a0586a407fe14c3e0855749= a7524ac3871dda4 > --- /dev/null > +++ b/img/app/etc/s6-rc/wireplumber/type.license > @@ -0,0 +1,2 @@ > +SPDX-License-Identifier: CC0-1.0 > +SPDX-FileCopyrightText: 2025 Demi Marie Obenour > diff --git a/img/app/etc/wireplumber/wireplumber.conf.d/99_spectrum.conf = b/img/app/etc/wireplumber/wireplumber.conf.d/99_spectrum.conf > new file mode 100644 > index 0000000000000000000000000000000000000000..ff2f464395aaf7c8f0a739b0f= 01552c4ee987740 > --- /dev/null > +++ b/img/app/etc/wireplumber/wireplumber.conf.d/99_spectrum.conf > @@ -0,0 +1,39 @@ > +# SPDX-License-Identifier: MIT > + > +# Copyright =C2=A9 2019-2021 Collabora Ltd. Which part of this is =C2=A9 Collabora? It looks like you've written it yourself. I like this approach better though. :) > +# > +# Permission is hereby granted, free of charge, to any person obtaining a > +# copy of this software and associated documentation files (the "Softwar= e"), > +# to deal in the Software without restriction, including without limitat= ion > +# the rights to use, copy, modify, merge, publish, distribute, sublicens= e, > +# and/or sell copies of the Software, and to permit persons to whom the > +# Software is furnished to do so, subject to the following conditions: > +# > +# The above copyright notice and this permission notice (including the n= ext > +# paragraph) shall be included in all copies or substantial portions of = the > +# Software. > +# > +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRES= S OR > +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILIT= Y, > +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHA= LL > +# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR O= THER > +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING > +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER > +# DEALINGS IN THE SOFTWARE. > + > +# Disable various stuff Spectrum doesn't need and which causes errors. > +wireplumber.profiles =3D { > + spectrum =3D { > + inherits =3D [ main-embedded ] > + hardware.video-capture =3D disabled > + hardware.bluetooth =3D disabled > + support.settings =3D disabled > + check.no-media-session =3D disabled > + policy.standard =3D required > + } > +} > + > +# Default to 100% sink volume. The host will adjust this as needed. > +wireplumber.settings =3D { > + device.routes.default-sink-volume =3D 1.0 > +} > --=20 > Sincerely, > Demi Marie Obenour (she/her/hers) --=-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iHUEARYKAB0WIQRV/neXydHjZma5XLJbRZGEIw/wogUCaIS8AAAKCRBbRZGEIw/w om/5AP4jpv+XadYpwQszIbyWEZHrZmrNx94E9R/H1Q1JwxhGJAD+NKLl3Uj+AjJd gnl8Ee10Stl31NAFlLIaEKscsKH+Sgs= =1UGQ -----END PGP SIGNATURE----- --=-=-=--