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 692861FEB1; Mon, 14 Jul 2025 14:54:33 +0000 (UTC) Received: by atuin.qyliss.net (Postfix, from userid 993) id E520A1FF22; Mon, 14 Jul 2025 14:54:29 +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=-0.1 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,DMARC_MISSING,RCVD_IN_MSPIKE_H2,SPF_HELO_PASS autolearn=unavailable autolearn_force=no version=4.0.1 Received: from fout-a3-smtp.messagingengine.com (fout-a3-smtp.messagingengine.com [103.168.172.146]) by atuin.qyliss.net (Postfix) with ESMTPS id 8C6201FEA0 for ; Mon, 14 Jul 2025 14:54:27 +0000 (UTC) Received: from phl-compute-08.internal (phl-compute-08.phl.internal [10.202.2.48]) by mailfout.phl.internal (Postfix) with ESMTP id C8599EC051D; Mon, 14 Jul 2025 10:54:24 -0400 (EDT) Received: from phl-mailfrontend-01 ([10.202.2.162]) by phl-compute-08.internal (MEProxy); Mon, 14 Jul 2025 10:54:24 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=alyssa.is; h=cc :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=fm1; t=1752504864; x=1752591264; bh=22moRIu1JH 4CTrWZu5AUMFjaVgTIF4KDf4iEpckclpc=; b=djYppE0nsDQCmY7uq5tMG9QlZg rm7CojHFLhFYnbVQ9enwXl337la7Y+4zsFkFyj4ziNlsahWMD/556MHh4010uG4w 6FLhvQycql/6ohqi7f3G9+lsFSyLiK+kuqrYydPbVGngEeP53uDlTtqxXPcR3Izd 2Nx+k/N6UVNx1esT44vMNgZJwZumlTPxk9olmwJlCdehMAVO7SqweN+TPUB5xuyw b9os+liSZ4qRPVMrWA0d3aNeicms/QhKb7ZkguCpjohlwqeZhjskaXAgEsFZYz+o ZDfkU3xdcF9pMefK1fWmKz9o2mBloSV/CkzjxoOVxx49scHSGOL+dMb4vqlw== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc: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=fm2; t= 1752504864; x=1752591264; bh=22moRIu1JH4CTrWZu5AUMFjaVgTIF4KDf4i Epckclpc=; b=NDI5q7Id/AHXnHvhZLNmTjty0SF1tnvxGf2eHAhJ7a0Ax9xyLQ7 dwJwGJmFZjbMq7s2tMoXegiPQhfoVhnE4aBNdTxmwZBFqgbpvz3sSItMhOIbPP0L Ig2B6H4bpYz9d/R24K7p1+p0cXTaWA1+Ldp3FCG6M999uX3CovsbmitNwO5SdLpT sJfVSSaU9vvfDOzom3fpOUSz6fdAQ4YJh7nI/GiMO8mn9jbx999wThmIup9zEfXr 5T8KDSZ2woENQ8wwMGcyzPaiBBgfx2FpHZSP38IdQ1NWkQn3vLSE6nhlz1hPewXV ObMOmG/nuoSa2TYT+mbB4ZcSdHdI0gnHaPw== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeeffedrtdefgdehvddvgecutefuodetggdotefrod ftvfcurfhrohhfihhlvgemucfhrghsthforghilhdpuffrtefokffrpgfnqfghnecuuegr ihhlohhuthemuceftddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmdenucfjug hrpefhvfevufgjfhffkfggtgesghdtreertddtjeenucfhrhhomheptehlhihsshgrucft ohhsshcuoehhihesrghlhihsshgrrdhisheqnecuggftrfgrthhtvghrnhepfeduieefie euudfhgeekgedvfeegheeitddugeegudefudejheffieefvdeiveeinecuffhomhgrihhn pegslhhuvgiirdhsvggrthdpmhhiughirdhnohdpshhhuhhtughofihnrdhfihhnrghlpd gtmhgurdhsthhrvggrmhdpvhhmrdhnrghmvgenucevlhhushhtvghrufhiiigvpedtnecu rfgrrhgrmhepmhgrihhlfhhrohhmpehhihesrghlhihsshgrrdhishdpnhgspghrtghpth htohepvddpmhhouggvpehsmhhtphhouhhtpdhrtghpthhtohepuggvmhhiohgsvghnohhu rhesghhmrghilhdrtghomhdprhgtphhtthhopeguvghvvghlsehsphgvtghtrhhumhdqoh hsrdhorhhg X-ME-Proxy: Feedback-ID: i12284293:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Mon, 14 Jul 2025 10:54:23 -0400 (EDT) Received: by sf.qyliss.net (Postfix, from userid 1000) id 0812929E41C56; Mon, 14 Jul 2025 16:54:23 +0200 (CEST) From: Alyssa Ross To: Demi Marie Obenour Subject: Re: [PATCH v3] Run PipeWire and WirePlumber in the VMs In-Reply-To: <638beeaa-2351-4f51-81a6-bc58883930c2@gmail.com> References: <638beeaa-2351-4f51-81a6-bc58883930c2@gmail.com> Date: Mon, 14 Jul 2025 16:54:21 +0200 Message-ID: <87seiyg6w2.fsf@alyssa.is> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="=-=-="; micalg=pgp-sha512; protocol="application/pgp-signature" Message-ID-Hash: FKMZNMU42PDT3SLPVUBGVD23HYX2UOHI X-Message-ID-Hash: FKMZNMU42PDT3SLPVUBGVD23HYX2UOHI 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 CC: Spectrum OS Development 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. I did build a > Spectrum OS image and found that PipeWire and WirePlumber both > successfully started. PipeWire is configured to listen on the > PulseAudio socket, so PulseAudio compatibility works. This does inject > a large number of completely unnecessary files into the VM, notably for > libcamera and Bluetooth support. Yeah, I saw this in the log: N 14:27:54.810067 wp-internal-comp-l ../lib/wp/private/internal-comp-loader= .c:588:on_component_loaded: optional component 'support= .logind [module: libwireplumber-module-logind]' failed to load: failed to s= tart systemd logind monitor: -2 (No such file or directory) N 14:27:54.811299 wp-internal-comp-l ../lib/wp/private/internal-comp-loader= .c:640:wp_component_array_load_task_execute_step: skipp= ing component 'monitor.bluez.seat-monitoring [virtual]' because some of its= dependencies were not loaded E 14:27:54.851210 spa.dbus ../spa/plugins/support/dbus.c:333:impl= _connection_get: Failed to connect to system bus: Failed to connect to sock= et /run/dbus/system_bus_socket: No such file or directory E 14:27:54.852143 spa.bluez5 ../spa/plugins/bluez5/bluez5-dbus.c:66= 32:impl_init: failed to get dbus connection N 14:27:54.855904 wp-device ../lib/wp/device.c:710:wp_spa_device_n= ew_from_spa_factory: SPA handle 'api.bluez5.enum.dbus' could not be loaded;= is it installed? N 14:27:54.856657 s-monitors bluez.lua:411:createMonitor: PipeWire'= s BlueZ SPA plugin is missing or broken. Bluetooth devices will not be supp= orted. E 14:27:54.859091 spa.bluez5.midi ../spa/plugins/bluez5/midi-enum.c:805:= impl_init: Creating GDBus connection failed: Could not connect: No such fil= e or directory N 14:27:54.859810 wp-device ../lib/wp/device.c:710:wp_spa_device_n= ew_from_spa_factory: SPA handle 'api.bluez5.midi.enum' could not be loaded;= is it installed? N 14:27:54.860524 s-monitors bluez-midi.lua:95:createMonitor: PipeW= ire's BlueZ MIDI SPA missing or broken. Bluetooth not supported. E 14:27:54.861346 spa.bluez5.midi.no ../spa/plugins/bluez5/midi-node.c:1989= :impl_init: failed to get dbus connection: Could not connect: No such file = or directory E 14:27:54.862435 pw.resource ../src/pipewire/resource.c:255:pw_reso= urce_errorf_id: can't create node: Input/output error W 14:27:54.863275 wp-node ../lib/wp/node.c:913:wp_impl_node_new_= from_pw_factory: failed to create node from factory 'spa-node-factory' N 14:27:54.863965 s-monitors bluez-midi.lua:130:createServers: Fail= ed to create BLE MIDI server. [0:00:01.314658075] [123] INFO IPAManager ipa_manager.cpp:137 libcamera is= not installed. Adding '/nix/store/src/ipa' to the IPA search path [0:00:01.321611889] [123] INFO Camera camera_manager.cpp:326 libcamera v0.= 5.0 Can we set something in a config file or something to disable this extra stuff? > Signed-off-by: Demi Marie Obenour > --- > Changes since v2: Enable PipeWire's PulseAudio emulation. > > img/app/Makefile | 19 +- > img/app/default.nix | 3 + > img/app/etc/fstab | 5 +- > .../pipewire.conf.d/90_enable_pulseaudio.conf | 172 ++++++++++++++++++ > .../etc/s6-rc/app/dependencies.d/wireplumber | 0 > .../app/dependencies.d/wireplumber.license | 2 + > img/app/etc/s6-rc/directories/type | 1 + > img/app/etc/s6-rc/directories/type.license | 2 + > img/app/etc/s6-rc/directories/up | 11 ++ > .../s6-rc/pipewire/dependencies.d/directories | 0 > .../dependencies.d/directories.license | 2 + > img/app/etc/s6-rc/pipewire/notification-fd | 1 + > .../s6-rc/pipewire/notification-fd.license | 2 + > img/app/etc/s6-rc/pipewire/run | 20 ++ > img/app/etc/s6-rc/pipewire/type | 1 + > img/app/etc/s6-rc/pipewire/type.license | 2 + > .../dependencies.d/directories | 0 > .../dependencies.d/directories.license | 2 + > img/app/etc/s6-rc/wayland-proxy-virtwl/run | 11 -- > .../etc/s6-rc/wireplumber/dependencies.d/dbus | 0 > .../wireplumber/dependencies.d/dbus.license | 2 + > .../s6-rc/wireplumber/dependencies.d/pipewire | 0 > .../dependencies.d/pipewire.license | 2 + > 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 + > 26 files changed, 251 insertions(+), 16 deletions(-) > create mode 100644 img/app/etc/pipewire/pipewire.conf.d/90_enable_pulsea= udio.conf > create mode 100644 img/app/etc/s6-rc/app/dependencies.d/wireplumber > create mode 100644 img/app/etc/s6-rc/app/dependencies.d/wireplumber.lice= nse > create mode 100644 img/app/etc/s6-rc/directories/type > create mode 100644 img/app/etc/s6-rc/directories/type.license > create mode 100644 img/app/etc/s6-rc/directories/up > create mode 100644 img/app/etc/s6-rc/pipewire/dependencies.d/directories > create mode 100644 img/app/etc/s6-rc/pipewire/dependencies.d/directories= .license > 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/wayland-proxy-virtwl/dependencies.d= /directories > create mode 100644 img/app/etc/s6-rc/wayland-proxy-virtwl/dependencies.d= /directories.license > create mode 100644 img/app/etc/s6-rc/wireplumber/dependencies.d/dbus > create mode 100644 img/app/etc/s6-rc/wireplumber/dependencies.d/dbus.lic= ense > create mode 100644 img/app/etc/s6-rc/wireplumber/dependencies.d/pipewire > create mode 100644 img/app/etc/s6-rc/wireplumber/dependencies.d/pipewire= .license > 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 > > diff --git a/img/app/Makefile b/img/app/Makefile > index f818e91..8144518 100644 > --- a/img/app/Makefile > +++ b/img/app/Makefile > @@ -53,7 +53,8 @@ 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.d/90_enable_pulseaudio.conf Keep lists alphabetical please! > VM_DIRS =3D dev run proc sys tmp \ > etc/s6-linux-init/run-image/service > VM_FIFOS =3D etc/s6-linux-init/run-image/service/s6-linux-init-shutdownd= /fifo > @@ -83,22 +84,34 @@ build/rootfs.erofs: ../../scripts/make-erofs.sh $(VM_= FILES) $(VM_BUILD_FILES) bu > 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 \ > etc/s6-rc/dbus/run \ > etc/s6-rc/dbus/type \ > + etc/s6-rc/directories/type \ > + etc/s6-rc/directories/up \ > etc/s6-rc/mdevd-coldplug/dependencies \ > etc/s6-rc/mdevd-coldplug/type \ > etc/s6-rc/mdevd-coldplug/up \ > etc/s6-rc/mdevd/notification-fd \ > etc/s6-rc/mdevd/run \ > etc/s6-rc/mdevd/type \ > + etc/s6-rc/ok-all/contents \ > + etc/s6-rc/ok-all/type \ > + etc/s6-rc/pipewire/dependencies.d/directories \ > + etc/s6-rc/pipewire/notification-fd \ > + etc/s6-rc/pipewire/run \ > + etc/s6-rc/pipewire/type \ > + etc/s6-rc/wayland-proxy-virtwl/dependencies.d/directories \ > 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/ok-all/contents \ > - etc/s6-rc/ok-all/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 $@) > diff --git a/img/app/default.nix b/img/app/default.nix > index 740643a..d3eed1f 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/fstab b/img/app/etc/fstab > index a95088b..40aa3bd 100644 > --- a/img/app/etc/fstab > +++ b/img/app/etc/fstab > @@ -1,7 +1,8 @@ > # SPDX-License-Identifier: CC0-1.0 > # SPDX-FileCopyrightText: 2020-2022 Alyssa Ross > proc /proc proc defaults 0 0 > -devpts /dev/pts devpts defaults,gid=3D4,mode=3D620 0 0 > +devpts /dev/pts devpts defaults,gid=3D4,mode=3D620 0 0 > tmpfs /dev/shm tmpfs defaults 0 0 > sysfs /sys sysfs defaults 0 0 > -tmpfs /tmp tmpfs defaults 0 0 > +tmpfs /tmp tmpfs defaults,mode=3D1755 0 0 > +tmpfs /run tmpfs defaults 0 0 Still think it would be nice to do the directory permissions a separate patch, since it's not strictly related to PipeWire. (And again, /run is provided by s6-linux-init, so we don't need to create it again =E2=80=94 or= is there some advantage to still having it listed in fstab?) > diff --git a/img/app/etc/pipewire/pipewire.conf.d/90_enable_pulseaudio.co= nf b/img/app/etc/pipewire/pipewire.conf.d/90_enable_pulseaudio.conf > new file mode 100644 > index 0000000..a5b86a6 > --- /dev/null > +++ b/img/app/etc/pipewire/pipewire.conf.d/90_enable_pulseaudio.conf > @@ -0,0 +1,172 @@ > +# SPDX-License-Identifier: MIT > +# SPDX-FileCopyrightText: Copyright =C2=A9 2018 Wim Taymans REUSE should detect the copyright line below fine, so the SPDX-FileCopyrightText header shouldn't be necessary. (It's probably a bug if not.) > + > +# Copyright =C2=A9 2018 Wim Taymans > +#=20 > +# 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: > +#=20 > +# 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. > +#=20 I recently added a check for trailing whitespace (release/checks/whitespace.nix), and it doesn't like this license header. > +# 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. > + > +# PulseAudio config file for PipeWire version "1.4.2" # > +# > +# Copy and edit this file in /etc/pipewire for system-wide changes > +# or in ~/.config/pipewire for local changes. > +# > +# It is also possible to place a file with an updated section in > +# /etc/pipewire/pipewire-pulse.conf.d/ for system-wide changes or in > +# ~/.config/pipewire/pipewire-pulse.conf.d/ for local changes. > +# > + > +context.modules =3D [ > + { name =3D libpipewire-module-protocol-pulse > + args =3D { > + # contents of pulse.properties can also be placed here > + # to have config per server. > + } > + } > +] > + > +# Extra commands can be executed here. > +# load-module : loads a module with args and flags > +# args =3D " " > +# ( flags =3D [ nofail ] ) > +# ( condition =3D [ { =3D , ... } ... ] ) > +# conditions will check the pulse.properties key/values. > +pulse.cmd =3D [ > + { cmd =3D "load-module" args =3D "module-always-sink" flags =3D [ ] > + condition =3D [ { pulse.cmd.always-sink =3D !false } ] } > + { cmd =3D "load-module" args =3D "module-device-manager" flags =3D [= ] > + condition =3D [ { pulse.cmd.device-manager =3D !false } ] } > + { cmd =3D "load-module" args =3D "module-device-restore" flags =3D [= ] > + condition =3D [ { pulse.cmd.device-restore =3D !false } ] } > + { cmd =3D "load-module" args =3D "module-stream-restore" flags =3D [= ] > + condition =3D [ { pulse.cmd.stream-restore =3D !false } ] } > + #{ cmd =3D "load-module" args =3D "module-switch-on-connect" } > + #{ cmd =3D "load-module" args =3D "module-gsettings" flags =3D [ nof= ail ] } There's a lot of commented out stuff in this file. Elsewhere in Spectrum, I've generally left that sort of thing out, to keep the file as short and easy to review as possible. Upstream is always available as a reference when more stuff needs to be enabled. > +] > + > +stream.properties =3D { > + #node.latency =3D 1024/48000 > + #node.autoconnect =3D true > + #resample.quality =3D 4 > + #channelmix.normalize =3D false > + #channelmix.mix-lfe =3D true > + #channelmix.upmix =3D true > + #channelmix.upmix-method =3D psd # none, simple > + #channelmix.lfe-cutoff =3D 150 > + #channelmix.fc-cutoff =3D 12000 > + #channelmix.rear-delay =3D 12.0 > + #channelmix.stereo-widen =3D 0.0 > + #channelmix.hilbert-taps =3D 0 > + #dither.noise =3D 0 > +} > + > +pulse.properties =3D { > + # the addresses this server listens on > + server.address =3D [ > + "unix:native" > + #"unix:/tmp/something" # absolute paths may be used > + #"tcp:4713" # IPv4 and IPv6 on all addre= sses > + #"tcp:[::]:9999" # IPv6 on all addresses > + #"tcp:127.0.0.1:8888" # IPv4 on a single address > + # > + #{ address =3D "tcp:4713" # address > + # max-clients =3D 64 # maximum number of clients > + # listen-backlog =3D 32 # backlog in the server li= sten queue > + # client.access =3D "restricted" # permissions for clients > + #} > + ] > + #server.dbus-name =3D "org.pulseaudio.Server" > + #pulse.allow-module-loading =3D true > + #pulse.min.req =3D 128/48000 # 2.7ms > + #pulse.default.req =3D 960/48000 # 20 milliseconds > + #pulse.min.frag =3D 128/48000 # 2.7ms > + #pulse.default.frag =3D 96000/48000 # 2 seconds > + #pulse.default.tlength =3D 96000/48000 # 2 seconds > + #pulse.min.quantum =3D 128/48000 # 2.7ms > + #pulse.idle.timeout =3D 0 # don't pause after underr= uns > + #pulse.default.format =3D F32 > + #pulse.default.position =3D [ FL FR ] > +} > + > +pulse.properties.rules =3D [ > + { matches =3D [ { cpu.vm.name =3D !null } ] > + actions =3D { > + update-props =3D { > + # These overrides are only applied when running in a vm. > + pulse.min.quantum =3D 1024/48000 # 22ms > + } > + } > + } > +] > + > +# client/stream specific properties > +pulse.rules =3D [ > + { > + matches =3D [ > + { > + # all keys must match the value. ! negates. ~ starts reg= ex. > + #client.name =3D "Firefox" > + #application.process.binary =3D "teams" > + #application.name =3D "~speech-dispatcher.*" > + } > + ] > + actions =3D { > + update-props =3D { > + #node.latency =3D 512/48000 > + } > + # Possible quirks:" > + # force-s16-info forces sink and source i= nfo as S16 format > + # remove-capture-dont-move removes the capture DONT= _MOVE flag > + # block-source-volume blocks updates to source= volume > + # block-sink-volume blocks updates to sink v= olume > + #quirks =3D [ ] > + } > + } > + { > + # skype does not want to use devices that don't have an S16 samp= le format. > + 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 ] } > + } > + { > + # firefox marks the capture streams as don't move and then they > + # can't be moved with pavucontrol or other tools. > + matches =3D [ { application.process.binary =3D "firefox" } ] > + actions =3D { quirks =3D [ remove-capture-dont-move ] } > + } > + { > + # speech dispatcher asks for too small latency and then underrun= s. > + matches =3D [ { application.name =3D "~speech-dispatcher.*" } ] > + actions =3D { > + update-props =3D { > + pulse.min.req =3D 512/48000 # 10.6ms > + pulse.min.quantum =3D 512/48000 # 10.6ms > + pulse.idle.timeout =3D 5 # pause after = 5 seconds of underrun > + } > + } > + } > + #{ > + # matches =3D [ { application.process.binary =3D "Discord" } ] > + # actions =3D { quirks =3D [ block-source-volume ] } > + #} > +] > 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 0000000..e69de29 > diff --git a/img/app/etc/s6-rc/app/dependencies.d/wireplumber.license b/i= mg/app/etc/s6-rc/app/dependencies.d/wireplumber.license > new file mode 100644 > index 0000000..c4a0586 > --- /dev/null > +++ b/img/app/etc/s6-rc/app/dependencies.d/wireplumber.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/directories/type b/img/app/etc/s6-rc/direc= tories/type > new file mode 100644 > index 0000000..bdd22a1 > --- /dev/null > +++ b/img/app/etc/s6-rc/directories/type > @@ -0,0 +1 @@ > +oneshot > diff --git a/img/app/etc/s6-rc/directories/type.license b/img/app/etc/s6-= rc/directories/type.license > new file mode 100644 > index 0000000..c4a0586 > --- /dev/null > +++ b/img/app/etc/s6-rc/directories/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/directories/up b/img/app/etc/s6-rc/directo= ries/up > new file mode 100644 > index 0000000..2396fad > --- /dev/null > +++ b/img/app/etc/s6-rc/directories/up > @@ -0,0 +1,11 @@ > +#!/bin/execlineb -P > +# SPDX-License-Identifier: EUPL-1.2+ > +# SPDX-FileCopyrightText: 2023-2024 Alyssa Ross > +# > +# Directory creation (if it's copyrightable): > +# SPDX-License-Identifier: MIT > +# SPDX-FileCopyrightText: 2022 Unikie > + > +if { mkdir -m 1755 /tmp/.X11-unix } > +if { mkdir -m 0755 /run/user } > +if { mkdir -m 0700 /run/user/0 } > diff --git a/img/app/etc/s6-rc/pipewire/dependencies.d/directories b/img/= app/etc/s6-rc/pipewire/dependencies.d/directories > new file mode 100644 > index 0000000..e69de29 > diff --git a/img/app/etc/s6-rc/pipewire/dependencies.d/directories.licens= e b/img/app/etc/s6-rc/pipewire/dependencies.d/directories.license > new file mode 100644 > index 0000000..c4a0586 > --- /dev/null > +++ b/img/app/etc/s6-rc/pipewire/dependencies.d/directories.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/notification-fd b/img/app/etc/s6-= rc/pipewire/notification-fd > new file mode 100644 > index 0000000..7ed6ff8 > --- /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 0000000..c4a0586 > --- /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 0000000..c0b55a1 > --- /dev/null > +++ b/img/app/etc/s6-rc/pipewire/run > @@ -0,0 +1,20 @@ > +#!/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 > + > +# 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 0000000..5883cff > --- /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 0000000..c4a0586 > --- /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/wayland-proxy-virtwl/dependencies.d/direct= ories b/img/app/etc/s6-rc/wayland-proxy-virtwl/dependencies.d/directories > new file mode 100644 > index 0000000..e69de29 > diff --git a/img/app/etc/s6-rc/wayland-proxy-virtwl/dependencies.d/direct= ories.license b/img/app/etc/s6-rc/wayland-proxy-virtwl/dependencies.d/direc= tories.license > new file mode 100644 > index 0000000..c4a0586 > --- /dev/null > +++ b/img/app/etc/s6-rc/wayland-proxy-virtwl/dependencies.d/directories.l= icense > @@ -0,0 +1,2 @@ > +SPDX-License-Identifier: CC0-1.0 > +SPDX-FileCopyrightText: 2025 Demi Marie Obenour > diff --git a/img/app/etc/s6-rc/wayland-proxy-virtwl/run b/img/app/etc/s6-= rc/wayland-proxy-virtwl/run > index 7b80343..c1e0e08 100755 > --- a/img/app/etc/s6-rc/wayland-proxy-virtwl/run > +++ b/img/app/etc/s6-rc/wayland-proxy-virtwl/run > @@ -1,17 +1,6 @@ > #!/bin/execlineb -P > # SPDX-License-Identifier: EUPL-1.2+ > # SPDX-FileCopyrightText: 2023-2024 Alyssa Ross > -# > -# Directory creation (if it's copyrightable): > -# SPDX-License-Identifier: MIT > -# SPDX-FileCopyrightText: 2022 Unikie > - > -foreground { mkdir /tmp/.X11-unix } > -foreground { mkdir /run/user } > -foreground { > - umask 077 > - mkdir /run/user/0 > -} >=20=20 > s6-ipcserver-socketbinder -B /run/user/0/wayland-0 > fdmove -c 3 0 > 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 0000000..e69de29 > diff --git a/img/app/etc/s6-rc/wireplumber/dependencies.d/dbus.license b/= img/app/etc/s6-rc/wireplumber/dependencies.d/dbus.license > new file mode 100644 > index 0000000..c4a0586 > --- /dev/null > +++ b/img/app/etc/s6-rc/wireplumber/dependencies.d/dbus.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/pipewire b/img/= app/etc/s6-rc/wireplumber/dependencies.d/pipewire > new file mode 100644 > index 0000000..e69de29 > diff --git a/img/app/etc/s6-rc/wireplumber/dependencies.d/pipewire.licens= e b/img/app/etc/s6-rc/wireplumber/dependencies.d/pipewire.license > new file mode 100644 > index 0000000..c4a0586 > --- /dev/null > +++ b/img/app/etc/s6-rc/wireplumber/dependencies.d/pipewire.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/run b/img/app/etc/s6-rc/wirepl= umber/run > new file mode 100644 > index 0000000..e721d8d > --- /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 > diff --git a/img/app/etc/s6-rc/wireplumber/type b/img/app/etc/s6-rc/wirep= lumber/type > new file mode 100644 > index 0000000..5883cff > --- /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 0000000..c4a0586 > --- /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 > > base-commit: 9090caebe25310caa80a13787ef58b1f81658a78 > --=20 > Sincerely, > Demi Marie Obenour (she/her/hers) --=-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iHUEARYKAB0WIQRV/neXydHjZma5XLJbRZGEIw/wogUCaHUaHQAKCRBbRZGEIw/w oqeNAQCMRz0D6Xrd+yIhh8jAbffrvxXT7izcIegcYXpy4gU+QAD+Je9LI3vbsp/J YTpd+/WFNiEqs2RsnyNI869Ejo2iggU= =tEzO -----END PGP SIGNATURE----- --=-=-=--