/usr/share/wireplumber/scripts/linking
NameSizeModeActions
find-audio-group-target.lua27790644editdlrm
find-best-target.lua40680644editdlrm
find-default-target.lua16900644editdlrm
find-defined-target.lua43530644editdlrm
find-filter-target.lua29710644editdlrm
find-media-role-target.lua19650644editdlrm
find-user-target.lua.example9250644editdlrm
get-filter-from-target.lua35980644editdlrm
link-target.lua53520644editdlrm
mpris-pause.lua102560644editdlrm
prepare-link.lua38780644editdlrm
rescan-media-role-links.lua66170644editdlrm
rescan.lua85500644editdlrm
Edit: /usr/share/wireplumber/scripts/linking/find-media-role-target.lua (1965B)
-- WirePlumber -- -- Copyright © 2024 Collabora Ltd. -- -- SPDX-License-Identifier: MIT -- -- Select the media role target cutils = require("common-utils") lutils = require("linking-utils") log = Log.open_topic("s-linking") SimpleEventHook { name = "linking/find-media-role-target", after = { "linking/find-defined-target", "linking/find-filter-target" }, before = "linking/prepare-link", interests = { EventInterest { Constraint { "event.type", "=", "select-target" }, }, }, execute = function (event) local _, om, si, si_props, _, target = lutils:unwrap_select_target_event (event) local target_direction = cutils.getTargetDirection (si_props) local media_role = si_props["media.role"] -- bypass the hook if the target is already picked up or if the role is not -- defined if target or media_role == nil then return end log:info (si, string.format ("handling item %d: %s (%s) role (%s)", si.id, tostring (si_props ["node.name"]), tostring (si_props ["node.id"]), media_role)) for si_target in om:iterate { type = "SiLinkable", Constraint { "item.node.direction", "=", target_direction }, Constraint { "device.intended-roles", "+" }, Constraint { "media.type", "=", si_props["media.type"] }, } do local roles_json = si_target.properties["device.intended-roles"] local roles_table = Json.Raw(roles_json):parse() for _, target_role in ipairs(roles_table) do if target_role == media_role then target = si_target break end end if target then break end end -- set target if target ~= nil then log:info(si, string.format("... media role target picked: %s (%s)", tostring(target.properties["node.name"]), tostring(target.properties["node.id"]))) event:set_data("target", target) end end }:register()