node/software-dsp: ensure that filter chains are properly unloaded

Indexing into the subject from a node-removed event is slightly quirky.
As a result, we were not properly freeing filter chains tied to
disconnected nodes.

Change how we store the list of loaded filters and ensure they
are properly freed when their parent node is removed from the graph.

Signed-off-by: James Calligeros <jcalligeros99@gmail.com>
This commit is contained in:
James Calligeros 2024-06-08 20:40:51 +10:00 committed by George Kiagiadakis
parent eb707096f7
commit f57a46308d

View file

@ -34,7 +34,7 @@ SimpleEventHook {
if props["filter-graph"] then if props["filter-graph"] then
log:debug("Loading filter graph for " .. node.properties["node.name"]) log:debug("Loading filter graph for " .. node.properties["node.name"])
filter_nodes[node.properties["object.id"]] = LocalModule("libpipewire-module-filter-chain", props["filter-graph"], {}) filter_nodes[node.id] = LocalModule("libpipewire-module-filter-chain", props["filter-graph"], {})
elseif props["filter-path"] then elseif props["filter-path"] then
log:debug("Loading filter graph for " .. node.properties["node.name"] .. " from disk") log:debug("Loading filter graph for " .. node.properties["node.name"] .. " from disk")
local conf = Conf(props["filter-path"], { local conf = Conf(props["filter-path"], {
@ -44,7 +44,7 @@ SimpleEventHook {
local err = conf:open() local err = conf:open()
if not err then if not err then
local args = conf:get_section_as_json("node.software-dsp.graph"):to_string() local args = conf:get_section_as_json("node.software-dsp.graph"):to_string()
filter_nodes[node.properties["object.id"]] = LocalModule("libpipewire-module-filter-chain", args, {}) filter_nodes[node.id] = LocalModule("libpipewire-module-filter-chain", args, {})
else else
log:warning("Unable to load filter graph for " .. node.properties["node.name"]) log:warning("Unable to load filter graph for " .. node.properties["node.name"])
end end
@ -57,7 +57,7 @@ SimpleEventHook {
client:update_permissions{ [node["bound-id"]] = "-" } client:update_permissions{ [node["bound-id"]] = "-" }
end end
end end
hidden_nodes[node["bound-id"]] = node.properties["object.id"] hidden_nodes[node["bound-id"]] = node.id
end end
end end
end) end)
@ -73,9 +73,10 @@ SimpleEventHook {
}, },
execute = function(event) execute = function(event)
local node = event:get_subject() local node = event:get_subject()
if filter_nodes[node.properties["object.id"]] then if filter_nodes[node.id] then
log:debug("Freeing filter graph on disconnected node " .. node.properties["node.name"]) log:debug("Freeing filter on node " .. node.id)
filter_nodes[node.properties["object.id"]] = nil filter_nodes[node.id] = nil
hidden_nodes[node["bound-id"]] = nil
end end
end end
}:register() }:register()