ebuild-repository/media-video/wireplumber/files/wireplumber-0.4.10-alsa.lua-fix-device-name-deduplication-when-reserva.patch

118 lines
3.9 KiB
Diff

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