policy: refactor/improve policy-node & session items to fix linking to monitors
* populate most session item properties from create-item.lua to keep things more compact and readable * use a standard naming scheme for the session item properties * use session item properties instead of node properties in policy-node.lua * improve policy-node's performance by converting the properties dictionary less times for each session item * refactor some policy logic and make things slighly more readable * change the accepted values for 'context' in wp_si_linkable_get_ports(); use "input" and "output" to keep things clear, because the previous use of NULL and "reverse" were implying that a node has only one "standard" direction, but this is complicated for sinks w/ monitors and duplex nodes * allow using monitors (which are Audio/Sink nodes in fact) as sources * treat Audio/Duplex nodes as sinks, like p-m-s does * respect the "stream.capture.sink" property of streams Fixes #66
This commit is contained in:
@@ -5,8 +5,54 @@
|
||||
--
|
||||
-- SPDX-License-Identifier: MIT
|
||||
|
||||
-- Receive script arguments from config.lua
|
||||
local config = ...
|
||||
|
||||
items = {}
|
||||
|
||||
function configProperties(node)
|
||||
local np = node.properties
|
||||
local properties = {
|
||||
["item.node"] = node,
|
||||
["item.plugged.usec"] = GLib.get_monotonic_time(),
|
||||
["item.features.no-dsp"] = config["audio.no-dsp"],
|
||||
["item.features.monitor"] = true,
|
||||
["item.features.control-port"] = false,
|
||||
["node.id"] = node["bound-id"],
|
||||
["client.id"] = np["client.id"],
|
||||
["object.path"] = np["object.path"],
|
||||
}
|
||||
|
||||
for k, v in pairs(np) do
|
||||
if k:find("^node") or k:find("^stream") or k:find("^media") then
|
||||
properties[k] = v
|
||||
end
|
||||
end
|
||||
|
||||
local media_class = properties["media.class"] or ""
|
||||
|
||||
if not properties["media.type"] then
|
||||
for _, i in ipairs({ "Audio", "Video", "Midi" }) do
|
||||
if media_class:find(i) then
|
||||
properties["media.type"] = i
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
properties["item.node.type"] =
|
||||
media_class:find("^Stream/") and "stream" or "device"
|
||||
|
||||
if media_class:find("Sink") or
|
||||
media_class:find("Input") or
|
||||
media_class:find("Duplex") then
|
||||
properties["item.node.direction"] = "input"
|
||||
elseif media_class:find("Source") or media_class:find("Output") then
|
||||
properties["item.node.direction"] = "output"
|
||||
end
|
||||
return properties
|
||||
end
|
||||
|
||||
function addItem (node, item_type)
|
||||
local id = node["bound-id"]
|
||||
|
||||
@@ -14,12 +60,7 @@ function addItem (node, item_type)
|
||||
items[id] = SessionItem ( item_type )
|
||||
|
||||
-- configure item
|
||||
if not items[id]:configure {
|
||||
["node"] = node,
|
||||
["enable.monitor"] = true,
|
||||
["disable.dsp"] = false,
|
||||
["item.plugged.usec"] = GLib.get_monotonic_time(),
|
||||
} then
|
||||
if not items[id]:configure(configProperties(node)) then
|
||||
Log.warning(items[id], "failed to configure item for node " .. tostring(id))
|
||||
return
|
||||
end
|
||||
|
Reference in New Issue
Block a user