107 lines
2.9 KiB
Lua
107 lines
2.9 KiB
Lua
|
|
local json = require("json")
|
|
|
|
local utils = {}
|
|
|
|
local function split(string_to_split, separator)
|
|
if separator == nil then separator = "%s" end
|
|
local t = {}
|
|
|
|
for str in string.gmatch(string_to_split, "([^".. separator .."]+)") do
|
|
table.insert(t, str)
|
|
end
|
|
|
|
return t
|
|
end
|
|
|
|
function utils.extract_sinks_and_sources(pacmd_output)
|
|
local sinks = {}
|
|
local sources = {}
|
|
local device
|
|
local properties
|
|
local ports
|
|
local in_sink = false
|
|
local in_source = false
|
|
local in_device = false
|
|
local in_properties = false
|
|
local in_ports = false
|
|
for line in pacmd_output:gmatch("[^\r\n]+") do
|
|
if string.match(line, 'source%(s%) available.') then
|
|
in_sink = false
|
|
in_source = true
|
|
end
|
|
if string.match(line, 'sink%(s%) available.') then
|
|
in_sink = true
|
|
in_source = false
|
|
end
|
|
|
|
if string.match(line, 'index:') then
|
|
in_device = true
|
|
in_properties = false
|
|
device = {
|
|
id = line:match(': (%d+)'),
|
|
is_default = string.match(line, '*') ~= nil
|
|
}
|
|
if in_sink then
|
|
table.insert(sinks, device)
|
|
elseif in_source then
|
|
table.insert(sources, device)
|
|
end
|
|
end
|
|
|
|
if string.match(line, '^\tproperties:') then
|
|
in_device = false
|
|
in_properties = true
|
|
properties = {}
|
|
device['properties'] = properties
|
|
end
|
|
|
|
if string.match(line, 'ports:') then
|
|
in_device = false
|
|
in_properties = false
|
|
in_ports = true
|
|
ports = {}
|
|
device['ports'] = ports
|
|
end
|
|
|
|
if string.match(line, 'active port:') then
|
|
in_device = false
|
|
in_properties = false
|
|
in_ports = false
|
|
device['active_port'] = line:match(': (.+)'):gsub('<',''):gsub('>','')
|
|
end
|
|
|
|
if in_device then
|
|
local t = split(line, ': ')
|
|
local key = t[1]:gsub('\t+', ''):lower()
|
|
local value = t[2]:gsub('^<', ''):gsub('>$', '')
|
|
device[key] = value
|
|
end
|
|
|
|
if in_properties then
|
|
local t = split(line, '=')
|
|
local key = t[1]:gsub('\t+', ''):gsub('%.', '_'):gsub('-', '_'):gsub(':', ''):gsub("%s+$", "")
|
|
local value
|
|
if t[2] == nil then
|
|
value = t[2]
|
|
else
|
|
value = t[2]:gsub('"', ''):gsub("^%s+", ""):gsub(' Analog Stereo', '')
|
|
end
|
|
properties[key] = value
|
|
end
|
|
|
|
if in_ports then
|
|
local t = split(line, ': ')
|
|
local key = t[1]
|
|
if key ~= nil then
|
|
key = key:gsub('\t+', '')
|
|
end
|
|
ports[key] = t[2]
|
|
end
|
|
end
|
|
print(json.encode(sources))
|
|
|
|
return sinks, sources
|
|
end
|
|
|
|
return utils |