From b45f1cd22728f1da74681a0cca90569864be1863 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Fri, 19 Nov 2021 09:36:40 +0100 Subject: [PATCH] Add some upstream patches for OBS audio output capture and device switching. --- 0001-policy-node-Remove-direction-check.patch | 40 ++++++++++++++++ ...-replace-the-hash-table-key-on-new-i.patch | 47 +++++++++++++++++++ ...it-for-nodes-when-we-become-unlinked.patch | 34 ++++++++++++++ wireplumber.spec | 15 +++++- 4 files changed, 135 insertions(+), 1 deletion(-) create mode 100644 0001-policy-node-Remove-direction-check.patch create mode 100644 0002-m-reserve-device-replace-the-hash-table-key-on-new-i.patch create mode 100644 0003-policy-node-wait-for-nodes-when-we-become-unlinked.patch diff --git a/0001-policy-node-Remove-direction-check.patch b/0001-policy-node-Remove-direction-check.patch new file mode 100644 index 0000000..f4f809a --- /dev/null +++ b/0001-policy-node-Remove-direction-check.patch @@ -0,0 +1,40 @@ +From 756c5222d698f143142b69318d5af22a377df0a0 Mon Sep 17 00:00:00 2001 +From: Wim Taymans +Date: Mon, 15 Nov 2021 11:51:11 +0100 +Subject: [PATCH 1/3] policy-node: Remove direction check + +Remove the direction check in findDefinedTarget. We already to a +better direction check in canLink(). + +This fixes the case where a capture stream has the node.target set +to a sink. The directions don't match and the capture stream is not +linked to the monitor ports of the sink. Removing the check triggers +the right logic in canLink() and obs studio can link to monitor +ports again. +--- + src/scripts/policy-node.lua | 2 -- + 1 file changed, 2 deletions(-) + +diff --git a/src/scripts/policy-node.lua b/src/scripts/policy-node.lua +index b2e1e14..5029d1b 100644 +--- a/src/scripts/policy-node.lua ++++ b/src/scripts/policy-node.lua +@@ -237,7 +237,6 @@ function findDefinedTarget (properties) + local target_id = metadata + and metadata:find(properties["node.id"], "target.node") + or properties["node.target"] +- local target_direction = getTargetDirection(properties) + + if target_id and tonumber(target_id) then + local si_target = linkables_om:lookup { +@@ -253,7 +252,6 @@ function findDefinedTarget (properties) + local target_props = si_target.properties + if (target_props["node.name"] == target_id or + target_props["object.path"] == target_id) and +- target_props["item.node.direction"] == target_direction and + canLink (properties, si_target) then + return si_target + end +-- +2.31.1 + diff --git a/0002-m-reserve-device-replace-the-hash-table-key-on-new-i.patch b/0002-m-reserve-device-replace-the-hash-table-key-on-new-i.patch new file mode 100644 index 0000000..bc5ca26 --- /dev/null +++ b/0002-m-reserve-device-replace-the-hash-table-key-on-new-i.patch @@ -0,0 +1,47 @@ +From 3795906f33dbd4af4c2d2603788a18cf9a24cbe1 Mon Sep 17 00:00:00 2001 +From: Peter Hutterer +Date: Fri, 12 Nov 2021 11:19:54 +1000 +Subject: [PATCH 2/3] m-reserve-device: replace the hash table key on new + insert + +We're using the WpReserveDevice's name as key in the hash table, so we +must update the key as well when we replace an item in the hashtable - +the old device (and its name) will be released. + +The side-effect of this is that the *third* device with an identical +name will no longer replace the previous device. This results in the +following sequence: + +- dev1 added: name Audio0 + - dev1 requests name owner Audio0 +- dev2 added: name Audio0 + - replace dev1 in the hashtable + - dev1 emits "release" signal + - dev1 unowns the Audio0 name + - dev2 requests name owner Audio0 +- dev3 added: name Audio0 + - adds to the hashtable because the existing key is now undefined + - dev3 requests name owner Audio0 + - error, you cannot request ownership for the same name twice + +Fixes #93 +--- + modules/module-reserve-device/plugin.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/modules/module-reserve-device/plugin.c b/modules/module-reserve-device/plugin.c +index d8e4e09..68df6ee 100644 +--- a/modules/module-reserve-device/plugin.c ++++ b/modules/module-reserve-device/plugin.c +@@ -221,7 +221,7 @@ wp_reserve_device_plugin_create_reservation (WpReserveDevicePlugin *self, + NULL); + + /* use rd->name to avoid copying @em name again */ +- g_hash_table_insert (self->reserve_devices, rd->name, rd); ++ g_hash_table_replace (self->reserve_devices, rd->name, rd); + + return g_object_ref (rd); + } +-- +2.31.1 + diff --git a/0003-policy-node-wait-for-nodes-when-we-become-unlinked.patch b/0003-policy-node-wait-for-nodes-when-we-become-unlinked.patch new file mode 100644 index 0000000..c29a735 --- /dev/null +++ b/0003-policy-node-wait-for-nodes-when-we-become-unlinked.patch @@ -0,0 +1,34 @@ +From 7b56ba347d44507ff510e88b6e0a984c37524de6 Mon Sep 17 00:00:00 2001 +From: Wim Taymans +Date: Thu, 18 Nov 2021 15:23:23 +0100 +Subject: [PATCH 3/3] policy-node: wait for nodes when we become unlinked + +If we were linked before but our node is removed, wait until a new node +becomes available instead of failing. + +This fixes an issue where there is only 1 sink available and the card +profile is toggeled between pro and stereo. After the profile is +toggled, the sink is removed and the node would be killed with an error +because there is no fallback sink. The fix is similar to the +pipewire-media-session logic. +--- + src/scripts/policy-node.lua | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/src/scripts/policy-node.lua b/src/scripts/policy-node.lua +index 5029d1b..445b1a7 100644 +--- a/src/scripts/policy-node.lua ++++ b/src/scripts/policy-node.lua +@@ -493,6 +493,9 @@ function handleLinkable (si) + if not reconnect then + Log.info (si, "... destroy node") + node:request_destroy() ++ elseif si_flags[si.id].was_handled then ++ Log.info (si, "... waiting reconnect") ++ return + end + + local client_id = node.properties["client.id"] +-- +2.31.1 + diff --git a/wireplumber.spec b/wireplumber.spec index b784b9e..29014b0 100644 --- a/wireplumber.spec +++ b/wireplumber.spec @@ -1,12 +1,21 @@ Name: wireplumber Version: 0.4.5 -Release: 2%{?dist} +Release: 3%{?dist} Summary: A modular session/policy manager for PipeWire License: MIT URL: https://pipewire.pages.freedesktop.org/wireplumber/ Source0: https://gitlab.freedesktop.org/pipewire/%{name}/-/archive/%{version}/%{name}-%{version}.tar.bz2 +## upstream patches +Patch0001: 0001-policy-node-Remove-direction-check.patch +Patch0002: 0002-m-reserve-device-replace-the-hash-table-key-on-new-i.patch +Patch0003: 0003-policy-node-wait-for-nodes-when-we-become-unlinked.patch + +## upstreamable patches + +## fedora patches + BuildRequires: meson gcc pkgconfig BuildRequires: pkgconfig(glib-2.0) BuildRequires: pkgconfig(gobject-2.0) @@ -109,6 +118,10 @@ fi %{_datadir}/gir-1.0/Wp-0.4.gir %changelog +* Fri Nov 19 2021 Wim Taymans - 0.4.5-3 +- Add some upstream patches for OBS audio output capture and + device switching. + * Wed Nov 17 2021 Peter Hutterer - 0.4.5-2 - Move the systemd scriptlet to posttrans so we can dnf swap with media-session (#2022584)