1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
|
#!/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()
|