#!/usr/bin/wpexec -- -- WirePlumber -- -- Copyright © 2021 Collabora Ltd. -- @author George Kiagiadakis -- -- 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()