diff --git a/src/scripts/policy-endpoint-client.lua b/src/scripts/policy-endpoint-client.lua index d32de5bb..6b96edf2 100644 --- a/src/scripts/policy-endpoint-client.lua +++ b/src/scripts/policy-endpoint-client.lua @@ -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) diff --git a/src/scripts/policy-endpoint-device.lua b/src/scripts/policy-endpoint-device.lua index 04e3bc62..b726cb3d 100644 --- a/src/scripts/policy-endpoint-device.lua +++ b/src/scripts/policy-endpoint-device.lua @@ -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) diff --git a/src/scripts/policy-node.lua b/src/scripts/policy-node.lua index 264f7203..0f102b5f 100644 --- a/src/scripts/policy-node.lua +++ b/src/scripts/policy-node.lua @@ -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()