
This is mainly for security reasons. This way, we can limit the permissions of wpexec without limiting wireplumber, for instance with pipewire's default module-access, which limits apps based on their executable name
77 lines
2.3 KiB
Lua
Executable File
77 lines
2.3 KiB
Lua
Executable File
#!/usr/bin/wpexec
|
|
--
|
|
-- WirePlumber
|
|
--
|
|
-- Copyright © 2021 Collabora Ltd.
|
|
-- @author George Kiagiadakis <george.kiagiadakis@collabora.com>
|
|
--
|
|
-- SPDX-License-Identifier: MIT
|
|
--
|
|
-- This is an example of a standalone policy making script. It can be executed
|
|
-- either on top of another instance of wireplumber or pipewire-media-session,
|
|
-- as a standalone executable, or it can be placed in WirePlumber's scripts
|
|
-- directory and loaded together with other scripts.
|
|
--
|
|
-- The script basically watches for a client application called
|
|
-- "ZOOM VoiceEngine", and when it appears (i.e. Zoom starts), it switches
|
|
-- the profile of all connected bluetooth devices to the "headset-head-unit"
|
|
-- (a.k.a HSP Headset Audio) profile. When Zoom exits, it switches again the
|
|
-- profile of all bluetooth devices to A2DP Sink.
|
|
--
|
|
-- The script can be customized further to look for other clients and/or
|
|
-- change the profile of a specific device, by customizing the constraints.
|
|
-----------------------------------------------------------------------------
|
|
|
|
devices_om = ObjectManager {
|
|
Interest { type = "device",
|
|
Constraint { "device.api", "=", "bluez5" },
|
|
}
|
|
}
|
|
|
|
clients_om = ObjectManager {
|
|
Interest { type = "client",
|
|
Constraint { "application.name", "=", "ZOOM VoiceEngine" },
|
|
}
|
|
}
|
|
|
|
function set_profile(profile_name)
|
|
for device in devices_om:iterate() do
|
|
local index = nil
|
|
local desc = nil
|
|
|
|
for profile in device:iterate_params("EnumProfile") do
|
|
local p = profile:parse()
|
|
if p.properties.name == profile_name then
|
|
index = p.properties.index
|
|
desc = p.properties.description
|
|
break
|
|
end
|
|
end
|
|
|
|
if index then
|
|
local pod = Pod.Object {
|
|
"Spa:Pod:Object:Param:Profile", "Profile",
|
|
index = index
|
|
}
|
|
|
|
print("Setting profile of '"
|
|
.. device.properties["device.description"]
|
|
.. "' to: " .. desc)
|
|
device:set_params("Profile", pod)
|
|
end
|
|
end
|
|
end
|
|
|
|
clients_om:connect("object-added", function (om, client)
|
|
print("Client '" .. client.properties["application.name"] .. "' connected")
|
|
set_profile("headset-head-unit")
|
|
end)
|
|
|
|
clients_om:connect("object-removed", function (om, client)
|
|
print("Client '" .. client.properties["application.name"] .. "' disconnected")
|
|
set_profile("a2dp-sink")
|
|
end)
|
|
|
|
devices_om:activate()
|
|
clients_om:activate()
|