mirror of
https://gitlab.freedesktop.org/pipewire/wireplumber.git
synced 2026-05-09 05:08:04 +02:00
policy: use a scheduleRescan function to avoid unneeded rescans
This commit is contained in:
parent
c6445ed3db
commit
a59dc92928
3 changed files with 100 additions and 57 deletions
|
|
@ -9,7 +9,33 @@
|
|||
local config = ...
|
||||
config.roles = config.roles or {}
|
||||
|
||||
local pending_rescan = false
|
||||
local self = {}
|
||||
self.scanning = false
|
||||
self.pending_rescan = false
|
||||
|
||||
function rescan ()
|
||||
for si in linkables_om:iterate() do
|
||||
handleLinkable (si)
|
||||
end
|
||||
end
|
||||
|
||||
function scheduleRescan ()
|
||||
if self.scanning then
|
||||
self.pending_rescan = true
|
||||
return
|
||||
end
|
||||
|
||||
self.scanning = true
|
||||
rescan ()
|
||||
self.scanning = false
|
||||
|
||||
if self.pending_rescan then
|
||||
self.pending_rescan = false
|
||||
Core.sync(function ()
|
||||
scheduleRescan ()
|
||||
end)
|
||||
end
|
||||
end
|
||||
|
||||
function findRole(role)
|
||||
if role and not config.roles[role] then
|
||||
|
|
@ -158,7 +184,7 @@ function handleLinkable (si)
|
|||
link:remove ()
|
||||
Log.info (si, "... moving to new target")
|
||||
else
|
||||
pending_rescan = true
|
||||
scheduleRescan ()
|
||||
Log.info (si, "... scheduled rescan")
|
||||
return
|
||||
end
|
||||
|
|
@ -191,20 +217,6 @@ function unhandleLinkable (si)
|
|||
end
|
||||
end
|
||||
|
||||
function rescan ()
|
||||
for si in linkables_om:iterate() do
|
||||
handleLinkable (si)
|
||||
end
|
||||
|
||||
-- if pending_rescan, re-evaluate after sync
|
||||
if pending_rescan then
|
||||
pending_rescan = false
|
||||
Core.sync (function (c)
|
||||
rescan()
|
||||
end)
|
||||
end
|
||||
end
|
||||
|
||||
endpoints_om = ObjectManager { Interest { type = "SiEndpoint" }}
|
||||
linkables_om = ObjectManager { Interest { type = "SiLinkable",
|
||||
-- only handle si-audio-adapter and si-node
|
||||
|
|
@ -218,7 +230,7 @@ links_om = ObjectManager { Interest { type = "SiLink",
|
|||
} }
|
||||
|
||||
linkables_om:connect("objects-changed", function (om)
|
||||
rescan ()
|
||||
scheduleRescan ()
|
||||
end)
|
||||
|
||||
linkables_om:connect("object-removed", function (om, si)
|
||||
|
|
|
|||
|
|
@ -12,7 +12,34 @@ local config = ...
|
|||
config.move = config.move or false
|
||||
config.follow = config.follow or false
|
||||
|
||||
local pending_rescan = false
|
||||
local self = {}
|
||||
self.scanning = false
|
||||
self.pending_rescan = false
|
||||
|
||||
function rescan ()
|
||||
-- check endpoints and register new links
|
||||
for si_ep in endpoints_om:iterate() do
|
||||
handleEndpoint (si_ep)
|
||||
end
|
||||
end
|
||||
|
||||
function scheduleRescan ()
|
||||
if self.scanning then
|
||||
self.pending_rescan = true
|
||||
return
|
||||
end
|
||||
|
||||
self.scanning = true
|
||||
rescan ()
|
||||
self.scanning = false
|
||||
|
||||
if self.pending_rescan then
|
||||
self.pending_rescan = false
|
||||
Core.sync(function ()
|
||||
scheduleRescan ()
|
||||
end)
|
||||
end
|
||||
end
|
||||
|
||||
function findTargetByDefaultNode (target_media_class)
|
||||
local def_id = default_nodes:call("get-default-node", target_media_class)
|
||||
|
|
@ -133,7 +160,7 @@ function handleEndpoint (si_ep)
|
|||
link:remove ()
|
||||
Log.info (si_ep, "... moving to new target")
|
||||
else
|
||||
pending_rescan = true
|
||||
scheduleRescan ()
|
||||
Log.info (si_ep, "... scheduled rescan")
|
||||
return
|
||||
end
|
||||
|
|
@ -164,21 +191,6 @@ function unhandleLinkable (si)
|
|||
end
|
||||
end
|
||||
|
||||
function rescan ()
|
||||
-- check endpoints and register new links
|
||||
for si_ep in endpoints_om:iterate() do
|
||||
handleEndpoint (si_ep)
|
||||
end
|
||||
|
||||
-- if pending_rescan, re-evaluate after sync
|
||||
if pending_rescan then
|
||||
pending_rescan = false
|
||||
Core.sync (function (c)
|
||||
rescan()
|
||||
end)
|
||||
end
|
||||
end
|
||||
|
||||
default_nodes = Plugin.find("default-nodes-api")
|
||||
endpoints_om = ObjectManager { Interest { type = "SiEndpoint" }}
|
||||
linkables_om = ObjectManager {
|
||||
|
|
@ -200,12 +212,12 @@ links_om = ObjectManager {
|
|||
-- listen for default node changes if config.follow is enabled
|
||||
if config.follow then
|
||||
default_nodes:connect("changed", function (p)
|
||||
rescan()
|
||||
scheduleRescan ()
|
||||
end)
|
||||
end
|
||||
|
||||
linkables_om:connect("objects-changed", function (om)
|
||||
rescan()
|
||||
scheduleRescan ()
|
||||
end)
|
||||
|
||||
linkables_om:connect("object-removed", function (om, si)
|
||||
|
|
|
|||
|
|
@ -12,7 +12,33 @@ local config = ...
|
|||
config.move = config.move or false
|
||||
config.follow = config.follow or false
|
||||
|
||||
local pending_rescan = false
|
||||
local self = {}
|
||||
self.scanning = false
|
||||
self.pending_rescan = false
|
||||
|
||||
function rescan()
|
||||
for si in linkables_om:iterate() do
|
||||
handleLinkable (si)
|
||||
end
|
||||
end
|
||||
|
||||
function scheduleRescan ()
|
||||
if self.scanning then
|
||||
self.pending_rescan = true
|
||||
return
|
||||
end
|
||||
|
||||
self.scanning = true
|
||||
rescan ()
|
||||
self.scanning = false
|
||||
|
||||
if self.pending_rescan then
|
||||
self.pending_rescan = false
|
||||
Core.sync(function ()
|
||||
scheduleRescan ()
|
||||
end)
|
||||
end
|
||||
end
|
||||
|
||||
function parseBool(var)
|
||||
return var and (var:lower() == "true" or var == "1")
|
||||
|
|
@ -516,7 +542,7 @@ function handleLinkable (si)
|
|||
if si_flags[si_id] then
|
||||
si_flags[si_id].done_waiting = true
|
||||
si_flags[si_id].timeout_source = nil
|
||||
rescan()
|
||||
scheduleRescan()
|
||||
end
|
||||
return false
|
||||
end)
|
||||
|
|
@ -545,7 +571,7 @@ function handleLinkable (si)
|
|||
link:remove ()
|
||||
Log.info (si, "... moving to new target")
|
||||
else
|
||||
pending_rescan = true
|
||||
scheduleRescan()
|
||||
Log.info (si, "... scheduled rescan")
|
||||
return
|
||||
end
|
||||
|
|
@ -634,20 +660,6 @@ function unhandleLinkable (si)
|
|||
si_flags[si.id] = nil
|
||||
end
|
||||
|
||||
function rescan()
|
||||
for si in linkables_om:iterate() do
|
||||
handleLinkable (si)
|
||||
end
|
||||
|
||||
-- if pending_rescan, re-evaluate after sync
|
||||
if pending_rescan then
|
||||
pending_rescan = false
|
||||
Core.sync (function (c)
|
||||
rescan()
|
||||
end)
|
||||
end
|
||||
end
|
||||
|
||||
default_nodes = Plugin.find("default-nodes-api")
|
||||
|
||||
metadata_om = ObjectManager {
|
||||
|
|
@ -712,7 +724,7 @@ end
|
|||
if config.follow then
|
||||
default_nodes:connect("changed", function ()
|
||||
cleanupTargetNodeMetadata()
|
||||
rescan()
|
||||
scheduleRescan ()
|
||||
end)
|
||||
end
|
||||
|
||||
|
|
@ -721,18 +733,25 @@ if config.move then
|
|||
metadata_om:connect("object-added", function (om, metadata)
|
||||
metadata:connect("changed", function (m, subject, key, t, value)
|
||||
if key == "target.node" then
|
||||
rescan()
|
||||
scheduleRescan ()
|
||||
end
|
||||
end)
|
||||
end)
|
||||
end
|
||||
|
||||
linkables_om:connect("objects-changed", function (om)
|
||||
rescan()
|
||||
linkables_om:connect("object-added", function (om, si)
|
||||
if si.properties["item.node.type"] ~= "stream" then
|
||||
scheduleRescan ()
|
||||
else
|
||||
handleLinkable (si)
|
||||
end
|
||||
end)
|
||||
|
||||
linkables_om:connect("object-removed", function (om, si)
|
||||
unhandleLinkable (si)
|
||||
if si.properties["item.node.type"] ~= "stream" then
|
||||
scheduleRescan ()
|
||||
end
|
||||
end)
|
||||
|
||||
metadata_om:activate()
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue