Files
wireplumber/tests/examples/bt-profile-switch.lua
George Kiagiadakis 1ba99739c2 tools: split wireplumber script execution mode to a separate wpexec tool
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
2021-04-12 09:53:30 +03:00

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()