wireplumber/src/scripts/node/create-item.lua

146 lines
4.1 KiB
Lua
Raw Normal View History

-- WirePlumber
--
-- Copyright © 2021 Collabora Ltd.
-- @author Julian Bouzas <julian.bouzas@collabora.com>
--
-- SPDX-License-Identifier: MIT
2022-07-13 06:25:51 +05:30
-- create-item.lua script takes pipewire nodes and creates session items (a.k.a
-- linkable) objects out of them.
cutils = require ("common-utils")
2023-05-19 20:12:08 +03:00
log = Log.open_topic ("s-node")
items = {}
2022-07-13 06:25:51 +05:30
function configProperties (node)
local properties = node.properties
2022-07-13 06:25:51 +05:30
local media_class = properties ["media.class"] or ""
-- ensure a media.type is set
2022-07-13 06:25:51 +05:30
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"] = node
properties ["item.node.direction"] =
cutils.mediaClassToDirection (media_class)
2022-07-13 06:25:51 +05:30
properties ["item.node.type"] =
media_class:find ("^Stream/") and "stream" or "device"
properties ["item.plugged.usec"] = GLib.get_monotonic_time ()
properties ["item.features.no-dsp"] =
Settings.get_boolean ("node.features.audio.no-dsp")
properties ["item.features.monitor"] =
Settings.get_boolean ("node.features.audio.monitor-ports")
properties ["item.features.control-port"] =
Settings.get_boolean ("node.features.audio.control-port")
properties ["node.id"] = node ["bound-id"]
return properties
end
AsyncEventHook {
name = "node/create-item",
interests = {
EventInterest {
Constraint { "event.type", "=", "node-added" },
Constraint { "media.class", "#", "Stream/*", type = "pw-global" },
},
EventInterest {
Constraint { "event.type", "=", "node-added" },
Constraint { "media.class", "#", "Video/*", type = "pw-global" },
},
EventInterest {
Constraint { "event.type", "=", "node-added" },
Constraint { "media.class", "#", "Audio/*", type = "pw-global" },
Constraint { "wireplumber.is-virtual", "-", type = "pw" },
},
},
steps = {
start = {
next = "register",
execute = function (event, transition)
2022-07-13 06:25:51 +05:30
local node = event:get_subject ()
local id = node.id
local item
local item_type
2022-07-13 06:25:51 +05:30
local media_class = node.properties ['media.class']
if string.find (media_class, "Audio") then
item_type = "si-audio-adapter"
else
item_type = "si-node"
end
2023-11-07 12:11:43 +02:00
log:info (node, "creating item for node -> " .. item_type)
-- create item
item = SessionItem (item_type)
2022-07-13 06:25:51 +05:30
items [id] = item
-- configure item
2022-07-13 06:25:51 +05:30
if not item:configure (configProperties (node)) then
transition:return_error ("failed to configure item for node "
.. tostring (id))
return
end
-- activate item
item:activate (Features.ALL, function (_, e)
if e then
2022-07-13 06:25:51 +05:30
transition:return_error ("failed to activate item: "
.. tostring (e));
else
2022-07-13 06:25:51 +05:30
transition:advance ()
end
end)
end,
},
register = {
next = "none",
execute = function (event, transition)
2022-07-13 06:25:51 +05:30
local node = event:get_subject ()
local bound_id = node ["bound-id"]
local item = items [node.id]
2023-05-19 20:12:08 +03:00
log:info (item, "activated item for node " .. tostring (bound_id))
item:register ()
2022-07-13 06:25:51 +05:30
transition:advance ()
end,
},
},
2022-07-13 06:25:51 +05:30
}:register ()
SimpleEventHook {
name = "node/destroy-item",
interests = {
EventInterest {
Constraint { "event.type", "=", "node-removed" },
Constraint { "media.class", "#", "Stream/*", type = "pw-global" },
},
EventInterest {
Constraint { "event.type", "=", "node-removed" },
Constraint { "media.class", "#", "Video/*", type = "pw-global" },
},
EventInterest {
Constraint { "event.type", "=", "node-removed" },
Constraint { "media.class", "#", "Audio/*", type = "pw-global" },
Constraint { "wireplumber.is-virtual", "-", type = "pw" },
},
},
execute = function (event)
2022-07-13 06:25:51 +05:30
local node = event:get_subject ()
local id = node.id
2022-07-13 06:25:51 +05:30
if items [id] then
items [id]:remove ()
items [id] = nil
end
end
2022-07-13 06:25:51 +05:30
}:register ()