Files
wireplumber/tests/examples/bt-pinephone.lua
George Kiagiadakis 03098c88bb bt-pinephone.lua: remove useless variable assignments
This is a copy/paste from the code that now lives in apply-routes.lua,
but there is no point since the route here is a real route param and
not a route_info structure.
2024-01-08 12:28:21 +02:00

117 lines
3.0 KiB
Lua
Executable File

#!/usr/bin/wpexec
--
-- WirePlumber
--
-- Copyright © 2022 Collabora Ltd.
-- @author Frédéric Danis <frederic.danis@collabora.com>
--
-- SPDX-License-Identifier: MIT
--
-- This is an example of the offload SCO nodes platform specific management,
-- in this case for the PinePhone.
--
-- The PinePhone provides specific ALSA ports to route audio to the Bluetooth
-- chipset. This script selects these ports when the offload SCO nodes state
-- change to 'running'.
--
-- This scriptcan be executed as a standalone executable, or it can be placed
-- in WirePlumber's scripts directory and loaded together with other scripts.
-----------------------------------------------------------------------------
devices_om = ObjectManager {
Interest {
type = "device",
}
}
nodes_om = ObjectManager {
Interest {
type = "node",
Constraint { "node.name", "#", "*.bluez_*put*"},
Constraint { "device.id", "+" },
}
}
function parseParam(param, id)
local route = param:parse()
if route.pod_type == "Object" and route.object_id == id then
return route.properties
else
return nil
end
end
function setPlatformRoute (route_name, direction)
local platform_sound = nil
local device_id = nil
local route_save = nil
local interest = Interest {
type = "device",
Constraint { "device.name", "=", "alsa_card.platform-sound"}
}
for d in devices_om:iterate (interest) do
platform_sound = d
for p in platform_sound:iterate_params("Route") do
route = parseParam(p, "Route")
if route.direction == direction then
device_id = route.device
route_save = route.save
end
end
for p in platform_sound:iterate_params("EnumRoute") do
enum_route = parseParam(p, "EnumRoute")
if enum_route.name == route_name then
route_index = enum_route.index
end
end
end
if route.index == route_index then
return
end
-- default props
local props = {
"Spa:Pod:Object:Param:Props", "Route",
mute = false,
}
-- construct Route param
local param = Pod.Object {
"Spa:Pod:Object:Param:Route", "Route",
index = route_index,
device = device_id,
props = Pod.Object(props),
save = route_save,
}
Log.info(param, "setting route on " .. tostring(platform_sound))
platform_sound:set_param("Route", param)
end
nodes_om:connect("object-added", function(_, node)
node:connect("state-changed", function(node, old_state, cur_state)
local interest = Interest {
type = "device",
Constraint { "object.id", "=", node.properties["device.id"]}
}
for d in devices_om:iterate (interest) do
if cur_state == "running" then
-- Both direction should be set to allow audio streaming
setPlatformRoute("[Out] BluetoothHeadset", "Output")
setPlatformRoute("[In] BluetoothHeadset", "Input")
else
setPlatformRoute("[Out] Earpiece", "Output")
setPlatformRoute("[In] DigitalMic", "Input")
end
end
end)
end)
nodes_om:activate()
devices_om:activate()