New wireplumber config
This commit is contained in:
75
.config/wireplumber/scripts/device/find-best-profile.lua
Normal file
75
.config/wireplumber/scripts/device/find-best-profile.lua
Normal file
@@ -0,0 +1,75 @@
|
||||
-- WirePlumber
|
||||
--
|
||||
-- Copyright © 2022 Collabora Ltd.
|
||||
--
|
||||
-- SPDX-License-Identifier: MIT
|
||||
--
|
||||
-- Find the best profile for a device based on profile priorities and
|
||||
-- availability
|
||||
|
||||
cutils = require ("common-utils")
|
||||
log = Log.open_topic ("s-device")
|
||||
|
||||
SimpleEventHook {
|
||||
name = "device/find-best-profile",
|
||||
after = "device/find-preferred-profile",
|
||||
before = "device/apply-profile",
|
||||
interests = {
|
||||
EventInterest {
|
||||
Constraint { "event.type", "=", "select-profile" },
|
||||
},
|
||||
},
|
||||
execute = function (event)
|
||||
local selected_profile = event:get_data ("selected-profile")
|
||||
|
||||
-- skip hook if profile is already selected
|
||||
if selected_profile then
|
||||
return
|
||||
end
|
||||
|
||||
local device = event:get_subject ()
|
||||
local dev_name = device.properties["device.name"] or ""
|
||||
local off_profile = nil
|
||||
local best_profile = nil
|
||||
local unk_profile = nil
|
||||
-- Takes absolute priority if available or unknown
|
||||
local profile_prop = device.properties["device.profile"]
|
||||
|
||||
|
||||
for p in device:iterate_params ("EnumProfile") do
|
||||
profile = cutils.parseParam (p, "EnumProfile")
|
||||
if profile and profile.name == profile_prop and profile.available ~= "no" then
|
||||
selected_profile = profile
|
||||
goto profile_set
|
||||
elseif profile and profile.name ~= "pro-audio" then
|
||||
if profile.name == "off" then
|
||||
off_profile = profile
|
||||
elseif profile.available == "yes" then
|
||||
if best_profile == nil or profile.priority > best_profile.priority then
|
||||
best_profile = profile
|
||||
end
|
||||
elseif profile.available ~= "no" then
|
||||
if unk_profile == nil or profile.priority > unk_profile.priority then
|
||||
unk_profile = profile
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if best_profile ~= nil then
|
||||
selected_profile = best_profile
|
||||
elseif unk_profile ~= nil then
|
||||
selected_profile = unk_profile
|
||||
elseif off_profile ~= nil then
|
||||
selected_profile = off_profile
|
||||
end
|
||||
|
||||
::profile_set::
|
||||
if selected_profile then
|
||||
log:info (device, string.format (
|
||||
"Found best profile '%s' (%d) for device '%s'",
|
||||
selected_profile.name, selected_profile.index, dev_name))
|
||||
event:set_data ("selected-profile", selected_profile)
|
||||
end
|
||||
end
|
||||
}:register()
|
||||
Reference in New Issue
Block a user