1
0
mirror of https://github.com/AvengeMedia/DankMaterialShell.git synced 2026-08-02 03:28:28 -04:00

feat(bluetooth): built in audio codec support - another dep bites the dust

- Updated the codec logic to utilize WirePlumber, bye pactl
- Improved UI to display media and call codec sections
This commit is contained in:
purian23
2026-07-18 14:16:49 -04:00
parent 4a90bd3fb1
commit 2114ece0df
4 changed files with 699 additions and 310 deletions
+142
View File
@@ -0,0 +1,142 @@
#!/usr/bin/wpexec
cutils = require("common-utils")
local args = (...):parse()
local mode = args.mode or "list"
local dev_name = args.device or ""
local target = args.target or ""
local function fail(msg)
print("ERROR: " .. msg)
Core.quit()
end
if dev_name == "" then
fail("missing device")
return
end
local om = ObjectManager {
Interest {
type = "device",
Constraint { "media.class", "=", "Audio/Device", type = "pw-global" },
}
}
local handled = false
local function profile_available(profile)
return profile and profile.available ~= "no"
end
local function codec_from_profile(profile)
if not profile then
return ""
end
local desc = profile.description or ""
local codec = desc:match("[Cc]odec%s+([%w%+%-%._]+)")
if not codec then
return ""
end
return codec:gsub("%-", "_"):upper()
end
local function handle_device(device)
if handled then
return
end
local name = device.properties["device.name"] or ""
if name ~= dev_name then
return
end
handled = true
if mode == "list" then
local active_index = nil
for p in device:iterate_params("Profile") do
local active = cutils.parseParam(p, "Profile")
if active then
active_index = active.index
end
end
for p in device:iterate_params("EnumProfile") do
local profile = cutils.parseParam(p, "EnumProfile")
if profile_available(profile) then
local codec = codec_from_profile(profile)
if codec ~= "" then
local current = (active_index ~= nil and profile.index == active_index) and "1" or "0"
print(string.format("CODEC\t%s\t%s\t%s\t%s", codec, profile.name, profile.description or "", current))
end
end
end
Core.quit()
return
end
if mode == "set" then
if target == "" then
fail("missing target")
return
end
local target_lower = tostring(target):lower()
local match = nil
for p in device:iterate_params("EnumProfile") do
local profile = cutils.parseParam(p, "EnumProfile")
if profile_available(profile) then
local pname = profile.name or ""
local codec = codec_from_profile(profile):lower()
if pname == target or pname:lower() == target_lower or codec == target_lower
or codec == target_lower:gsub("%-", "_") then
match = profile
break
end
end
end
if not match then
fail("profile not found: " .. target)
return
end
local param = Pod.Object {
"Spa:Pod:Object:Param:Profile", "Profile",
index = tonumber(match.index),
save = true,
}
device:set_param("Profile", param)
Core.sync(function()
print("OK\t" .. (match.name or target))
Core.quit()
end)
return
end
fail("unknown mode " .. mode)
end
om:connect("object-added", function(_, device)
handle_device(device)
end)
om:connect("installed", function()
if handled then
return
end
for device in om:iterate() do
handle_device(device)
if handled then
return
end
end
fail("device not found: " .. dev_name)
end)
om:activate()
Core.timeout_add(3000, function()
if not handled then
fail("timed out waiting for device " .. dev_name)
end
return false
end)