From 931da277a039e3a631e88201c45f924695b9ecae Mon Sep 17 00:00:00 2001 From: Windsome Zeng Date: Fri, 14 Oct 2022 11:27:19 +0800 Subject: [PATCH] [pipewire] Add pipewire support. --- .../0002-disable-rtkit-and-v4l2.patch | 58 +++ .../0003-disable-rtkit-and-enable-alsa.patch | 345 ++++++++++++++++++ package/pipewire/pipewire.mk | 6 + package/pipewire/run_pipewire.sh | 14 + 4 files changed, 423 insertions(+) create mode 100644 package/pipewire-media-session/0002-disable-rtkit-and-v4l2.patch create mode 100644 package/pipewire/0003-disable-rtkit-and-enable-alsa.patch create mode 100644 package/pipewire/run_pipewire.sh diff --git a/package/pipewire-media-session/0002-disable-rtkit-and-v4l2.patch b/package/pipewire-media-session/0002-disable-rtkit-and-v4l2.patch new file mode 100644 index 00000000..34d78b96 --- /dev/null +++ b/package/pipewire-media-session/0002-disable-rtkit-and-v4l2.patch @@ -0,0 +1,58 @@ +Set thread priorities without using RTKit. +Disable v4l2 module. + +Signed-off-by: Windsome Zeng + +diff -purN a/media-session.d/alsa-monitor.conf b/media-session.d/alsa-monitor.conf +--- a/media-session.d/alsa-monitor.conf 2022-10-13 16:59:41.918942274 +0800 ++++ b/media-session.d/alsa-monitor.conf 2022-10-13 16:51:03.885741470 +0800 +@@ -12,7 +12,7 @@ properties = { + #alsa.jack-device = false + + # Reserve devices. +- #alsa.reserve = true ++ alsa.reserve = false + } + + rules = [ +diff -purN a/media-session.d/media-session.conf b/media-session.d/media-session.conf +--- a/media-session.d/media-session.conf 2022-10-13 16:59:41.918942274 +0800 ++++ b/media-session.d/media-session.conf 2022-10-13 16:51:03.885741470 +0800 +@@ -33,12 +33,23 @@ context.modules = [ + # If nofail is given, module initialization failures are ignored. + # + # Uses RTKit to boost the data thread priority. +- { name = libpipewire-module-rtkit ++ #{ name = libpipewire-module-rtkit ++ # args = { ++ # #nice.level = -11 ++ # #rt.prio = 88 ++ # #rt.time.soft = 2000000 ++ # #rt.time.hard = 2000000 ++ # } ++ # flags = [ ifexists nofail ] ++ #} ++ ++ # Set thread priorities without using RTKit. ++ { name = libpipewire-module-rt + args = { +- #nice.level = -11 +- #rt.prio = 88 +- #rt.time.soft = 2000000 +- #rt.time.hard = 2000000 ++ nice.level = -11 ++ rt.prio = 88 ++ rt.time.soft = 2000000 ++ rt.time.hard = 2000000 + } + flags = [ ifexists nofail ] + } +@@ -75,7 +86,7 @@ session.modules = { + default = [ + flatpak # manages flatpak access + portal # manage portal permissions +- v4l2 # video for linux udev detection ++ #v4l2 # video for linux udev detection + #libcamera # libcamera udev detection + suspend-node # suspend inactive nodes + policy-node # configure and link nodes diff --git a/package/pipewire/0003-disable-rtkit-and-enable-alsa.patch b/package/pipewire/0003-disable-rtkit-and-enable-alsa.patch new file mode 100644 index 00000000..d9a96428 --- /dev/null +++ b/package/pipewire/0003-disable-rtkit-and-enable-alsa.patch @@ -0,0 +1,345 @@ +Set thread priorities without using RTKit. +Enable alsa node. + +Signed-off-by: Windsome Zeng + +diff -purN a/src/daemon/client-rt.conf.in b/src/daemon/client-rt.conf.in +--- a/src/daemon/client-rt.conf.in 2022-10-13 16:54:09.376674871 +0800 ++++ b/src/daemon/client-rt.conf.in 2022-10-13 16:51:39.515754495 +0800 +@@ -33,12 +33,23 @@ context.modules = [ + # If nofail is given, module initialization failures are ignored. + # + # Uses RTKit to boost the data thread priority. +- { name = libpipewire-module-rtkit ++ #{ name = libpipewire-module-rtkit ++ # args = { ++ # #nice.level = -11 ++ # #rt.prio = 88 ++ # #rt.time.soft = 2000000 ++ # #rt.time.hard = 2000000 ++ # } ++ # flags = [ ifexists nofail ] ++ #} ++ ++ # Set thread priorities without using RTKit. ++ { name = libpipewire-module-rt + args = { +- #nice.level = -11 +- #rt.prio = 88 +- #rt.time.soft = 2000000 +- #rt.time.hard = 2000000 ++ nice.level = -11 ++ rt.prio = 88 ++ rt.time.soft = 2000000 ++ rt.time.hard = 2000000 + } + flags = [ ifexists nofail ] + } +diff -purN a/src/daemon/filter-chain/demonic.conf b/src/daemon/filter-chain/demonic.conf +--- a/src/daemon/filter-chain/demonic.conf 2022-10-13 16:54:09.376674871 +0800 ++++ b/src/daemon/filter-chain/demonic.conf 2022-10-13 16:51:39.515754495 +0800 +@@ -19,13 +19,13 @@ context.spa-libs = { + } + + context.modules = [ +- # Uses RTKit to boost the data thread priority. +- { name = libpipewire-module-rtkit ++ # Set thread priorities without using RTKit. ++ { name = libpipewire-module-rt + args = { +- #nice.level = -11 +- #rt.prio = 88 +- #rt.time.soft = 2000000 +- #rt.time.hard = 2000000 ++ nice.level = -11 ++ rt.prio = 88 ++ rt.time.soft = 2000000 ++ rt.time.hard = 2000000 + } + flags = [ ifexists nofail ] + } +diff -purN a/src/daemon/filter-chain/sink-dolby-surround.conf b/src/daemon/filter-chain/sink-dolby-surround.conf +--- a/src/daemon/filter-chain/sink-dolby-surround.conf 2022-10-13 16:54:09.376674871 +0800 ++++ b/src/daemon/filter-chain/sink-dolby-surround.conf 2022-10-13 16:51:39.515754495 +0800 +@@ -12,12 +12,13 @@ context.spa-libs = { + } + + context.modules = [ +- { name = libpipewire-module-rtkit ++ # Set thread priorities without using RTKit. ++ { name = libpipewire-module-rt + args = { +- #nice.level = -11 +- #rt.prio = 88 +- #rt.time.soft = 2000000 +- #rt.time.hard = 2000000 ++ nice.level = -11 ++ rt.prio = 88 ++ rt.time.soft = 2000000 ++ rt.time.hard = 2000000 + } + flags = [ ifexists nofail ] + } +diff -purN a/src/daemon/filter-chain/sink-eq6.conf b/src/daemon/filter-chain/sink-eq6.conf +--- a/src/daemon/filter-chain/sink-eq6.conf 2022-10-13 16:54:09.376674871 +0800 ++++ b/src/daemon/filter-chain/sink-eq6.conf 2022-10-13 16:51:39.515754495 +0800 +@@ -12,12 +12,13 @@ context.spa-libs = { + } + + context.modules = [ +- { name = libpipewire-module-rtkit ++ # Set thread priorities without using RTKit. ++ { name = libpipewire-module-rt + args = { +- #nice.level = -11 +- #rt.prio = 88 +- #rt.time.soft = 2000000 +- #rt.time.hard = 2000000 ++ nice.level = -11 ++ rt.prio = 88 ++ rt.time.soft = 2000000 ++ rt.time.hard = 2000000 + } + flags = [ ifexists nofail ] + } +diff -purN a/src/daemon/filter-chain/sink-matrix-spatialiser.conf b/src/daemon/filter-chain/sink-matrix-spatialiser.conf +--- a/src/daemon/filter-chain/sink-matrix-spatialiser.conf 2022-10-13 16:54:09.376674871 +0800 ++++ b/src/daemon/filter-chain/sink-matrix-spatialiser.conf 2022-10-13 16:51:39.515754495 +0800 +@@ -13,12 +13,13 @@ context.spa-libs = { + } + + context.modules = [ +- { name = libpipewire-module-rtkit ++ # Set thread priorities without using RTKit. ++ { name = libpipewire-module-rt + args = { +- #nice.level = -11 +- #rt.prio = 88 +- #rt.time.soft = 2000000 +- #rt.time.hard = 2000000 ++ nice.level = -11 ++ rt.prio = 88 ++ rt.time.soft = 2000000 ++ rt.time.hard = 2000000 + } + flags = [ ifexists nofail ] + } +diff -purN a/src/daemon/filter-chain/sink-virtual-surround-5.1-kemar.conf b/src/daemon/filter-chain/sink-virtual-surround-5.1-kemar.conf +--- a/src/daemon/filter-chain/sink-virtual-surround-5.1-kemar.conf 2022-10-13 16:54:09.376674871 +0800 ++++ b/src/daemon/filter-chain/sink-virtual-surround-5.1-kemar.conf 2022-10-13 16:51:39.515754495 +0800 +@@ -12,12 +12,13 @@ context.spa-libs = { + } + + context.modules = [ +- { name = libpipewire-module-rtkit ++ # Set thread priorities without using RTKit. ++ { name = libpipewire-module-rt + args = { +- #nice.level = -11 +- #rt.prio = 88 +- #rt.time.soft = 2000000 +- #rt.time.hard = 2000000 ++ nice.level = -11 ++ rt.prio = 88 ++ rt.time.soft = 2000000 ++ rt.time.hard = 2000000 + } + flags = [ ifexists nofail ] + } +diff -purN a/src/daemon/filter-chain/sink-virtual-surround-7.1-hesuvi.conf b/src/daemon/filter-chain/sink-virtual-surround-7.1-hesuvi.conf +--- a/src/daemon/filter-chain/sink-virtual-surround-7.1-hesuvi.conf 2022-10-13 16:54:09.376674871 +0800 ++++ b/src/daemon/filter-chain/sink-virtual-surround-7.1-hesuvi.conf 2022-10-13 16:51:39.515754495 +0800 +@@ -12,12 +12,13 @@ context.spa-libs = { + } + + context.modules = [ +- { name = libpipewire-module-rtkit ++ # Set thread priorities without using RTKit. ++ { name = libpipewire-module-rt + args = { +- #nice.level = -11 +- #rt.prio = 88 +- #rt.time.soft = 2000000 +- #rt.time.hard = 2000000 ++ nice.level = -11 ++ rt.prio = 88 ++ rt.time.soft = 2000000 ++ rt.time.hard = 2000000 + } + flags = [ ifexists nofail ] + } +diff -purN a/src/daemon/filter-chain/source-rnnoise.conf b/src/daemon/filter-chain/source-rnnoise.conf +--- a/src/daemon/filter-chain/source-rnnoise.conf 2022-10-13 16:54:09.376674871 +0800 ++++ b/src/daemon/filter-chain/source-rnnoise.conf 2022-10-13 16:51:39.515754495 +0800 +@@ -12,12 +12,13 @@ context.spa-libs = { + } + + context.modules = [ +- { name = libpipewire-module-rtkit ++ # Set thread priorities without using RTKit. ++ { name = libpipewire-module-rt + args = { +- #nice.level = -11 +- #rt.prio = 88 +- #rt.time.soft = 2000000 +- #rt.time.hard = 2000000 ++ nice.level = -11 ++ rt.prio = 88 ++ rt.time.soft = 2000000 ++ rt.time.hard = 2000000 + } + flags = [ ifexists nofail ] + } +diff -purN a/src/daemon/meson.build b/src/daemon/meson.build +--- a/src/daemon/meson.build 2022-10-13 16:54:09.376674871 +0800 ++++ b/src/daemon/meson.build 2022-10-13 16:51:39.515754495 +0800 +@@ -13,7 +13,7 @@ conf_config.set('session_manager_path', + conf_config.set('session_manager_args', '') + conf_config.set('pipewire_path', pipewire_bindir / 'pipewire') + conf_config.set('pipewire_pulse_path', pipewire_bindir / 'pipewire-pulse') +-conf_config.set('sm_comment', '#') ++conf_config.set('sm_comment', '') + conf_config.set('pulse_comment', '#') + + conf_config_uninstalled = conf_config +diff -purN a/src/daemon/pipewire.conf.in b/src/daemon/pipewire.conf.in +--- a/src/daemon/pipewire.conf.in 2022-10-13 16:54:09.376674871 +0800 ++++ b/src/daemon/pipewire.conf.in 2022-10-13 16:51:39.515754495 +0800 +@@ -68,27 +68,27 @@ context.modules = [ + # + + # Uses RTKit to boost the data thread priority. +- { name = libpipewire-module-rtkit +- args = { +- #nice.level = -11 +- #rt.prio = 88 +- #rt.time.soft = 2000000 +- #rt.time.hard = 2000000 +- } +- flags = [ ifexists nofail ] +- } +- +- # Set thread priorities without using RTKit. +- #{ name = libpipewire-module-rt ++ #{ name = libpipewire-module-rtkit + # args = { +- # nice.level = -11 +- # rt.prio = 88 +- # rt.time.soft = 2000000 +- # rt.time.hard = 2000000 ++ # #nice.level = -11 ++ # #rt.prio = 88 ++ # #rt.time.soft = 2000000 ++ # #rt.time.hard = 2000000 + # } + # flags = [ ifexists nofail ] + #} + ++ # Set thread priorities without using RTKit. ++ { name = libpipewire-module-rt ++ args = { ++ nice.level = -11 ++ rt.prio = 88 ++ rt.time.soft = 2000000 ++ rt.time.hard = 2000000 ++ } ++ flags = [ ifexists nofail ] ++ } ++ + # The native communication protocol. + { name = libpipewire-module-protocol-native } + +@@ -131,9 +131,9 @@ context.modules = [ + args = { + # access.allowed to list an array of paths of allowed + # apps. +- #access.allowed = [ +- # @session_manager_path@ +- #] ++ access.allowed = [ ++ @session_manager_path@ ++ ] + + # An array of rejected paths. + #access.rejected = [ ] +@@ -208,23 +208,41 @@ context.objects = [ + # This creates a single PCM source device for the given + # alsa device path hw:0. You can change source to sink + # to make a sink in the same way. +- #{ factory = adapter +- # args = { +- # factory.name = api.alsa.pcm.source +- # node.name = "alsa-source" +- # node.description = "PCM Source" +- # media.class = "Audio/Source" +- # api.alsa.path = "hw:0" +- # api.alsa.period-size = 1024 +- # api.alsa.headroom = 0 +- # api.alsa.disable-mmap = false +- # api.alsa.disable-batch = false +- # audio.format = "S16LE" +- # audio.rate = 48000 +- # audio.channels = 2 +- # audio.position = "FL,FR" +- # } +- #} ++ { factory = adapter ++ args = { ++ factory.name = api.alsa.pcm.source ++ node.name = "alsa-source" ++ node.description = "PCM Source" ++ media.class = "Audio/Source" ++ api.alsa.path = "hw:0,0" ++ api.alsa.period-size = 1024 ++ api.alsa.headroom = 0 ++ api.alsa.disable-mmap = false ++ api.alsa.disable-batch = false ++ audio.format = "S16LE" ++ audio.rate = 48000 ++ audio.channels = 2 ++ audio.position = "FL,FR" ++ } ++ } ++ ++ { factory = adapter ++ args = { ++ factory.name = api.alsa.pcm.sink ++ node.name = "alsa-sink" ++ node.description = "PCM Sink" ++ media.class = "Audio/Sink" ++ api.alsa.path = "hw:0,1" ++ api.alsa.period-size = 1024 ++ api.alsa.headroom = 0 ++ api.alsa.disable-mmap = false ++ api.alsa.disable-batch = false ++ audio.format = "S16LE" ++ audio.rate = 48000 ++ audio.channels = 2 ++ audio.position = "FL,FR" ++ } ++ } + ] + + context.exec = [ +diff -purN a/src/daemon/pipewire-pulse.conf.in b/src/daemon/pipewire-pulse.conf.in +--- a/src/daemon/pipewire-pulse.conf.in 2022-10-13 16:54:09.376674871 +0800 ++++ b/src/daemon/pipewire-pulse.conf.in 2022-10-13 16:51:39.515754495 +0800 +@@ -17,12 +17,13 @@ context.spa-libs = { + } + + context.modules = [ +- { name = libpipewire-module-rtkit ++ # Set thread priorities without using RTKit. ++ { name = libpipewire-module-rt + args = { +- #nice.level = -11 +- #rt.prio = 88 +- #rt.time.soft = 2000000 +- #rt.time.hard = 2000000 ++ nice.level = -11 ++ rt.prio = 88 ++ rt.time.soft = 2000000 ++ rt.time.hard = 2000000 + } + flags = [ ifexists nofail ] + } diff --git a/package/pipewire/pipewire.mk b/package/pipewire/pipewire.mk index cbf24dd0..f5290f86 100644 --- a/package/pipewire/pipewire.mk +++ b/package/pipewire/pipewire.mk @@ -177,4 +177,10 @@ define PIPEWIRE_USERS pipewire -1 pipewire -1 * - - audio,video PipeWire System Daemon endef +define PIPEWIRE_INSTALL_CONF_ON_TARGET + $(INSTALL) -D -m 0755 package/pipewire/run_pipewire.sh $(TARGET_DIR)/root/run_pipewire.sh +endef + +PIPEWIRE_POST_INSTALL_TARGET_HOOKS += PIPEWIRE_INSTALL_CONF_ON_TARGET + $(eval $(meson-package)) diff --git a/package/pipewire/run_pipewire.sh b/package/pipewire/run_pipewire.sh new file mode 100644 index 00000000..d36b986e --- /dev/null +++ b/package/pipewire/run_pipewire.sh @@ -0,0 +1,14 @@ +#!/bin/sh +mkdir -p /run/pipewire +export XDG_RUNTIME_DIR=/run/pipewire +start-stop-daemon -K -s 9 -x pipewire +start-stop-daemon -Sb -q -x dbus-run-session -- pipewire +sleep 2s +echo "Record 10s audio to pwtest.wav now ..." +rm -f pwtest.wav +pw-record pwtest.wav & +sleep 10s +killall pw-record +echo "Stop record and play it again." +pw-play pwtest.wav +start-stop-daemon -K -x pipewire