diff options
Diffstat (limited to 'media-video/wireplumber/files/wireplumber-0.4.10-alsa.lua-fix-device-name-deduplication-when-reserva.patch')
-rw-r--r-- | media-video/wireplumber/files/wireplumber-0.4.10-alsa.lua-fix-device-name-deduplication-when-reserva.patch | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/media-video/wireplumber/files/wireplumber-0.4.10-alsa.lua-fix-device-name-deduplication-when-reserva.patch b/media-video/wireplumber/files/wireplumber-0.4.10-alsa.lua-fix-device-name-deduplication-when-reserva.patch new file mode 100644 index 000000000000..610db0e11e89 --- /dev/null +++ b/media-video/wireplumber/files/wireplumber-0.4.10-alsa.lua-fix-device-name-deduplication-when-reserva.patch @@ -0,0 +1,117 @@ +https://gitlab.freedesktop.org/pipewire/wireplumber/-/commit/c00c5a6675b6640db13111c808eaa3251917c412 + +From c00c5a6675b6640db13111c808eaa3251917c412 Mon Sep 17 00:00:00 2001 +From: Julian Bouzas <julian.bouzas@collabora.com> +Date: Wed, 18 May 2022 10:51:41 -0400 +Subject: [PATCH] alsa.lua: fix device name deduplication when reservation is + enabled + +Fixes #241 +--- + src/scripts/monitors/alsa.lua | 47 +++++++++++++++++++---------------- + 1 file changed, 25 insertions(+), 22 deletions(-) + +diff --git a/src/scripts/monitors/alsa.lua b/src/scripts/monitors/alsa.lua +index 01d241db..7beed3a8 100644 +--- a/src/scripts/monitors/alsa.lua ++++ b/src/scripts/monitors/alsa.lua +@@ -11,6 +11,10 @@ local config = ... or {} + -- ensure config.properties is not nil + config.properties = config.properties or {} + ++-- unique device/node name tables ++device_names_table = nil ++node_names_table = nil ++ + -- preprocess rules and create Interest objects + for _, r in ipairs(config.rules or {}) do + r.interests = {} +@@ -41,16 +45,6 @@ function rulesApplyProperties(properties) + end + end + +-function findDuplicate(parent, id, property, value) +- for i = 0, id - 1, 1 do +- local obj = parent:get_managed_object(i) +- if obj and obj.properties[property] == value then +- return true +- end +- end +- return false +-end +- + function nonempty(str) + return str ~= "" and str or nil + end +@@ -125,11 +119,11 @@ function createNode(parent, id, type, factory, properties) + + -- deduplicate nodes with the same name + for counter = 2, 99, 1 do +- if findDuplicate(parent, id, "node.name", properties["node.name"]) then +- properties["node.name"] = name .. "." .. counter +- else ++ if node_names_table[properties["node.name"]] ~= true then ++ node_names_table[properties["node.name"]] = true + break + end ++ properties["node.name"] = name .. "." .. counter + end + end + +@@ -186,6 +180,10 @@ function createDevice(parent, id, factory, properties) + local device = SpaDevice(factory, properties) + if device then + device:connect("create-object", createNode) ++ device:connect("object-removed", function (parent, id) ++ local node = parent:get_managed_object(id) ++ node_names_table[node.properties["node.name"]] = nil ++ end) + device:activate(Feature.SpaDevice.ENABLED | Feature.Proxy.BOUND) + parent:store_managed_object(id, device) + else +@@ -205,11 +203,11 @@ function prepareDevice(parent, id, type, factory, properties) + + -- deduplicate devices with the same name + for counter = 2, 99, 1 do +- if findDuplicate(parent, id, "device.name", properties["device.name"]) then +- properties["device.name"] = name .. "." .. counter +- else ++ if device_names_table[properties["device.name"]] ~= true then ++ device_names_table[properties["device.name"]] = true + break + end ++ properties["device.name"] = name .. "." .. counter + end + + -- ensure the device has a description +@@ -337,16 +335,21 @@ function createMonitor () + -- handle create-object to prepare device + m:connect("create-object", prepareDevice) + +- -- if dbus reservation, handle object-removed to destroy device reservations +- if rd_plugin then +- m:connect("object-removed", function (parent, id) +- local device = parent:get_managed_object(id) ++ -- handle object-removed to destroy device reservations and recycle device name ++ m:connect("object-removed", function (parent, id) ++ local device = parent:get_managed_object(id) ++ if rd_plugin then + local rd_name = device.properties["api.dbus.ReserveDevice1"] + if rd_name then + rd_plugin:call("destroy-reservation", rd_name) + end +- end) +- end ++ end ++ device_names_table[device.properties["device.name"]] = nil ++ end) ++ ++ -- reset the name tables to make sure names are recycled ++ device_names_table = {} ++ node_names_table = {} + + -- activate monitor + Log.info("Activating ALSA monitor") +-- +GitLab + |