author | Jan Alexander Steffens
<heftig@archlinux.org> 2022-10-04 13:50:38 UTC |
committer | Jan Alexander Steffens
<heftig@archlinux.org> 2022-10-04 13:50:38 UTC |
parent | a182172bd84c826eb51cc750542247b99971a623 |
398.patch | +0 | -161 |
PKGBUILD | +7 | -18 |
diff --git a/398.patch b/398.patch deleted file mode 100644 index 0bd950f..0000000 --- a/398.patch +++ /dev/null @@ -1,161 +0,0 @@ -From ba10c7d8c68db7b79cfa9f0e42432b63a76c415a Mon Sep 17 00:00:00 2001 -From: Pauli Virtanen <pav@iki.fi> -Date: Tue, 19 Jul 2022 20:39:06 +0300 -Subject: [PATCH 1/2] policy-node: fix potential rescan loop - -SiLink activation might be delayed indefinitely under some error -conditions. Currently, policy-node schedules a rescan when it sees a -non-activated link on a stream to be moved, which produces busy loop if -the si-link doesn't activate. - -Instead of rescheduling on non-active si-links, just remove and emit a -warning. The si-link then gets removed once it gets activated. - -Reproducer: - -1. Play audio from Rhythmbox and pause. -2. Switch default output with pactl between two different outputs -3. Links from the paused stream stay at "init" ---- - src/scripts/policy-node.lua | 17 ++++++++--------- - 1 file changed, 8 insertions(+), 9 deletions(-) - -diff --git a/src/scripts/policy-node.lua b/src/scripts/policy-node.lua -index e6816723..43df701c 100644 ---- a/src/scripts/policy-node.lua -+++ b/src/scripts/policy-node.lua -@@ -694,16 +694,15 @@ function handleLinkable (si) - local link = lookupLink (si_id, si_flags[si_id].peer_id) - if reconnect then - if link ~= nil then -- -- remove old link if active, otherwise schedule rescan -- if ((link:get_active_features() & Feature.SessionItem.ACTIVE) ~= 0) then -- si_flags[si_id].peer_id = nil -- link:remove () -- Log.info (si, "... moving to new target") -- else -- scheduleRescan() -- Log.info (si, "... scheduled rescan") -- return -+ -- remove old link -+ if ((link:get_active_features() & Feature.SessionItem.ACTIVE) == 0) then -+ -- remove also not yet activated links: they might never become active, -+ -- and we should not loop waiting for them -+ Log.warning (link, "Link was not activated before removing") - end -+ si_flags[si_id].peer_id = nil -+ link:remove () -+ Log.info (si, "... moving to new target") - end - else - if link ~= nil then --- -GitLab - - -From dd017b43fa1077200ae5e00f697334908ef1b9b2 Mon Sep 17 00:00:00 2001 -From: Pauli Virtanen <pav@iki.fi> -Date: Tue, 19 Jul 2022 20:01:10 +0300 -Subject: [PATCH 2/2] m-si-link: don't wait for establish before activation + - cleanup links - -SiLink should not wait for WpLinks becoming ESTABLISHED, before -activation. That flag shows whether a link has moved away from the -"init" state, however, links to e.g. Pulseaudio corked streams can stay -in "init" state until uncorking. This causes trouble for policies, -which needlessly wait for such links to establish. - -The WpLink objects may also be kept alive by other referents, and -just unrefing them does not necessarily destroy the PW objects. - -Activate SiLink even if the WpLink is still in "init" state. It's enough -that the link otherwise successfully establishes. - -At dispose time, explicitly request destroying the WpLinks that were -created by the SiLink, to ensure they are removed even if there's -something else referring to them. ---- - modules/module-si-standard-link.c | 32 ++++++++++++++++++++++++++----- - 1 file changed, 27 insertions(+), 5 deletions(-) - -diff --git a/modules/module-si-standard-link.c b/modules/module-si-standard-link.c -index dbebf391..9af71342 100644 ---- a/modules/module-si-standard-link.c -+++ b/modules/module-si-standard-link.c -@@ -132,6 +132,27 @@ si_standard_link_get_associated_proxy (WpSessionItem * item, GType proxy_type) - return NULL; - } - -+static void -+request_destroy_link (gpointer data, gpointer user_data) -+{ -+ WpLink *link = WP_LINK (data); -+ -+ wp_global_proxy_request_destroy (WP_GLOBAL_PROXY (link)); -+} -+ -+static void -+clear_node_links (GPtrArray **node_links_p) -+{ -+ /* -+ * Something else (eg. object managers) may be keeping the WpLink -+ * objects alive. Deactive the links now, to destroy the PW objects. -+ */ -+ if (*node_links_p) -+ g_ptr_array_foreach (*node_links_p, request_destroy_link, NULL); -+ -+ g_clear_pointer (node_links_p, g_ptr_array_unref); -+} -+ - static void - si_standard_link_disable_active (WpSessionItem *si) - { -@@ -154,7 +175,8 @@ si_standard_link_disable_active (WpSessionItem *si) - WP_SI_LINKABLE (si_in)); - } - -- g_clear_pointer (&self->node_links, g_ptr_array_unref); -+ clear_node_links (&self->node_links); -+ - self->n_active_links = 0; - self->n_failed_links = 0; - self->n_async_ops_wait = 0; -@@ -168,7 +190,7 @@ on_link_activated (WpObject * proxy, GAsyncResult * res, - WpTransition * transition) - { - WpSiStandardLink *self = wp_transition_get_source_object (transition); -- guint len = self->node_links->len; -+ guint len = self->node_links ? self->node_links->len : 0; - - /* Count the number of failed and active links */ - if (wp_object_activate_finish (proxy, res, NULL)) -@@ -182,7 +204,7 @@ on_link_activated (WpObject * proxy, GAsyncResult * res, - - /* We only active feature if all links activated successfully */ - if (self->n_failed_links > 0) { -- g_clear_pointer (&self->node_links, g_ptr_array_unref); -+ clear_node_links (&self->node_links); - wp_transition_return_error (transition, g_error_new ( - WP_DOMAIN_LIBRARY, WP_LIBRARY_ERROR_OPERATION_FAILED, - "%d of %d PipeWire links failed to activate", -@@ -251,7 +273,7 @@ create_links (WpSiStandardLink * self, WpTransition * transition, - /* Clear old links if any */ - self->n_active_links = 0; - self->n_failed_links = 0; -- g_clear_pointer (&self->node_links, g_ptr_array_unref); -+ clear_node_links (&self->node_links); - - /* tuple format: - uint32 node_id; -@@ -327,7 +349,7 @@ create_links (WpSiStandardLink * self, WpTransition * transition, - - /* activate to ensure it is created without errors */ - wp_object_activate_closure (WP_OBJECT (link), -- WP_OBJECT_FEATURES_ALL, NULL, -+ WP_OBJECT_FEATURES_ALL & ~WP_LINK_FEATURE_ESTABLISHED, NULL, - g_cclosure_new_object ( - (GCallback) on_link_activated, G_OBJECT (transition))); - } --- -GitLab - diff --git a/PKGBUILD b/PKGBUILD index 08a806c..228acb7 100644 --- a/PKGBUILD +++ b/PKGBUILD @@ -3,9 +3,9 @@ pkgbase=wireplumber pkgname=(wireplumber wireplumber-docs) -_commit=80b3559963f0ad40a7bfa6c23b0098275c0b5ebe # tags/0.4.11 -pkgver=0.4.11 -pkgrel=4 +_commit=6f6e5df9c1b223907efa8dcbfcd538821d0dabc4 # tags/0.4.12 +pkgver=0.4.12 +pkgrel=1 pkgdesc="Session / policy manager implementation for PipeWire" url="https://pipewire.pages.freedesktop.org/wireplumber/" arch=(x86_64) @@ -13,11 +13,10 @@ license=(MIT) makedepends=(git meson doxygen graphviz 'pipewire>=0.3.52' systemd glib2 lua gobject-introspection python-sphinx python-sphinx_rtd_theme python-breathe python-lxml) +checkdepends=(pipewire-audio) options=(debug) -source=("git+https://gitlab.freedesktop.org/pipewire/$pkgbase.git#commit=$_commit" - 398.patch) -sha256sums=('SKIP' - 'c51e1dfed7456186fc9f8630a116c593978b2b5d62b895236c595a54ea735827') +source=("git+https://gitlab.freedesktop.org/pipewire/$pkgbase.git#commit=$_commit") +sha256sums=('SKIP') pkgver() { cd $pkgbase @@ -26,16 +25,6 @@ pkgver() { prepare() { cd $pkgbase - - # Fix sound inside VM - git cherry-pick -n c16e637c329bc9dda8544b18f5bd47a8d63ee253 - - # https://bugs.archlinux.org/task/75352 - git cherry-pick -n eb406bdb2cbbcd49c55c71285f8f2eddb624d24b - - # https://gitlab.freedesktop.org/pipewire/wireplumber/-/issues/152 - # https://gitlab.freedesktop.org/pipewire/wireplumber/-/merge_requests/398 - git apply -3 ../398.patch } build() { @@ -86,4 +75,4 @@ package_wireplumber-docs() { install -Dt "$pkgdir/usr/share/licenses/$pkgname" -m644 $pkgbase/LICENSE } -# vim:set sw=2 et: +# vim:set sw=2 sts=-1 et: