wireplumber 0.4.12

This commit is contained in:
Wim Taymans 2022-10-07 09:35:35 +02:00
parent 9ae7e1ebef
commit ee0be42313
6 changed files with 6 additions and 257 deletions

View File

@ -1,39 +0,0 @@
From bc6b54229200537863426977c8d121bf9168fb94 Mon Sep 17 00:00:00 2001
From: George Kiagiadakis <george.kiagiadakis@collabora.com>
Date: Thu, 7 Jul 2022 20:58:36 +0300
Subject: [PATCH 1/2] alsa: use "obj_type" as a variable name to avoid
shadowing lua's "type" function
This causes a crash when running in a VM because the code tries to
execute lua's "type()" and ends up executing the local string variable...
Fixes: #303
---
src/scripts/monitors/alsa.lua | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/scripts/monitors/alsa.lua b/src/scripts/monitors/alsa.lua
index 43fab94..38f847f 100644
--- a/src/scripts/monitors/alsa.lua
+++ b/src/scripts/monitors/alsa.lua
@@ -49,7 +49,7 @@ function nonempty(str)
return str ~= "" and str or nil
end
-function createNode(parent, id, type, factory, properties)
+function createNode(parent, id, obj_type, factory, properties)
local dev_props = parent.properties
-- set the device id and spa factory name; REQUIRED, do not change
@@ -199,7 +199,7 @@ function createDevice(parent, id, factory, properties)
end
end
-function prepareDevice(parent, id, type, factory, properties)
+function prepareDevice(parent, id, obj_type, factory, properties)
-- ensure the device has an appropriate name
local name = "alsa_card." ..
(properties["device.name"] or
--
2.36.1

View File

@ -1,51 +0,0 @@
From 842e267af2925c5c0e8ea44b0f3d4e2823f787ce Mon Sep 17 00:00:00 2001
From: George Kiagiadakis <george.kiagiadakis@collabora.com>
Date: Wed, 13 Jul 2022 13:38:14 +0300
Subject: [PATCH 2/2] dbus: fix crash when trying to reconnect
When coming from on_sync_reconnect, data points to the WpDBus object
instead of the activation transition.
Fixes: #305
---
lib/wp/dbus.c | 20 ++++++++++++++++----
1 file changed, 16 insertions(+), 4 deletions(-)
diff --git a/lib/wp/dbus.c b/lib/wp/dbus.c
index 01a3b21..7c2d023 100644
--- a/lib/wp/dbus.c
+++ b/lib/wp/dbus.c
@@ -58,14 +58,26 @@ wp_dbus_set_state (WpDbus *self, WpDBusState new_state)
static void
on_got_bus (GObject * obj, GAsyncResult * res, gpointer data)
{
- WpTransition *transition = WP_TRANSITION (data);
- WpDbus *self = wp_transition_get_source_object (transition);
+ WpTransition *transition;
+ WpDbus *self;
g_autoptr (GError) error = NULL;
+ if (WP_IS_TRANSITION (data)) {
+ // coming from wp_dbus_enable
+ transition = WP_TRANSITION (data);
+ self = wp_transition_get_source_object (transition);
+ } else {
+ // coming from on_sync_reconnect
+ transition = NULL;
+ self = WP_DBUS (data);
+ }
+
self->connection = g_dbus_connection_new_for_address_finish (res, &error);
if (!self->connection) {
- g_prefix_error (&error, "Failed to connect to bus: ");
- wp_transition_return_error (transition, g_steal_pointer (&error));
+ if (transition) {
+ g_prefix_error (&error, "Failed to connect to bus: ");
+ wp_transition_return_error (transition, g_steal_pointer (&error));
+ }
return;
}
--
2.36.1

View File

@ -1,54 +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 e681672..43df701 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
--
2.37.1

View File

@ -1,106 +0,0 @@
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 dbebf39..9af7134 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)));
}
--
2.37.1

View File

@ -1 +1 @@
SHA512 (wireplumber-0.4.11.tar.bz2) = 8a2bf0701f61604d7f85a30d7ac0d51aca4b95c21a335b662a8162bb7531d93f8c327da34ae13263920c863b695a5e0e372b4d17ae8323bf2634065ce93dd3af
SHA512 (wireplumber-0.4.12.tar.bz2) = 79827ea9f61bacf8df80f9cd0ca4c80192cf85a1b181a51256b3c845d1d04a690ea5c1270d6d5d05d56f799f16980a593e61d003ef78ad7dc8d5e9ea332aa5d4

View File

@ -1,6 +1,6 @@
Name: wireplumber
Version: 0.4.11
Release: 4%{?dist}
Version: 0.4.12
Release: 1%{?dist}
Summary: A modular session/policy manager for PipeWire
License: MIT
@ -8,10 +8,6 @@ URL: https://pipewire.pages.freedesktop.org/wireplumber/
Source0: https://gitlab.freedesktop.org/pipewire/%{name}/-/archive/%{version}/%{name}-%{version}.tar.bz2
## upstream patches
Patch0001: 0001-alsa-use-obj_type-as-a-variable-name-to-avoid-shadow.patch
Patch0002: 0002-dbus-fix-crash-when-trying-to-reconnect.patch
Patch0003: 0003-policy-node-fix-potential-rescan-loop.patch
Patch0004: 0004-m-si-link-don-t-wait-for-establish-before-activation.patch
## upstreamable patches
@ -119,6 +115,9 @@ fi
%{_datadir}/gir-1.0/Wp-0.4.gir
%changelog
* Fri Oct 07 2022 Wim Taymans <wim.taymans@redhat.com> - 0.4.12-1
- wireplumber 0.4.12
* Thu Aug 04 2022 Ville-Pekka Vainio <vpvainio@iki.fi> - 0.4.11-4
- Add two patches to fix a rescan loop with Bluetooth