filter-utils: fix handling of targetless smart filters

A smart filter should be considered "targetless" (i.e. interpose on
streams going to default target) only if filter.smart.target is not set.

Currently any smart filter with specified target not found is considered
such, which is wrong.  This causes misbehavior, such as all recording
streams going to the bluetooth dummy source.

Fix this by doing it correctly.
This commit is contained in:
Pauli Virtanen
2024-03-21 20:02:02 +02:00
parent 59d190a2bd
commit 428462ddf3

View File

@@ -157,6 +157,19 @@ local function getFilterSmartTarget (metadata, node, om)
return target
end
local function getFilterSmartTargetless (metadata, node)
local id = node["bound-id"]
local value_str = nil
if metadata ~= nil then
value_str = metadata:find (id, "filter.smart.target")
end
if value_str == nil then
value_str = node.properties ["filter.smart.target"]
end
return value_str == nil
end
local function getFilterSmartBefore (metadata, node)
-- Check metadata and fallback to properties
local id = node["bound-id"]
@@ -312,6 +325,7 @@ local function rescanFilters (om, metadata_om)
filter.disabled = getFilterSmartDisabled (metadata, n)
filter.targetable = getFilterSmartTargetable (metadata, n)
filter.target = getFilterSmartTarget (metadata, n, om)
filter.targetless = getFilterSmartTargetless (metadata, n)
filter.before = getFilterSmartBefore (metadata, n)
filter.after = getFilterSmartAfter (metadata, n)
@@ -471,7 +485,7 @@ function module.get_filter_from_target (direction, si_target)
not v.disabled and
v.smart and
((v.target ~= nil and target ~= nil and v.target.id == target.id) or
(target == nil and v.target == nil)) then
(target == nil and v.targetless)) then
return v.main_si
end
end