This patch updates the deprecated policy-bluetooth.lua script so that it works
with the current version. The script has been moved into the device sub-folder,
and renamed to autoswitch-blueooth-profile.lua. The settings-manager is also
used for the configuration, and the actual configuration has been moved from
linkind.conf to bluetooth.conf.
Since all scripts run in a sandbox with their own global environment,
it means that they don't interfere with each other's global variables.
Therefore, all file-wide variables can be declared global without
any change in behavior. In my understanding, it is better to do so
because this means that any code accessing those variables is going
to access them directly from the global environment table with a simple
lookup rather than having each variable referenced in the local closure
of each function separately.
This patch also moves nested configuration objects that are not considered
settings from the wireplumber.settings section to its own configuration
section (eg the rules array, the spa plugin properties, etc...). This allows
those objects to be merged with other same sections defined in other files.
It is better to have type-specific event names to minimize the amount
of constraint string matches we do on hooks, as most hooks (if not all)
are interested on specific types of objects only.
Similarly, use a different object manager for each object type to
minimize the performance impact of iterations and lookups, as all
such actions are interested in only 1 object type every time.
Port all existing hooks to the new event names and the get-object-manager API.
Most of the configuration settings have a default value when they are loaded by
the Lua scripts if they are not present, so we leave them commented in the
configuration. This will make the configuration smaller when supporting layered
configuration, as all the commented sections will be part of the override files.
We cannot guarantee that the object's bound-id is always valid when an event is
triggered, especially when an object is removed. This patch uses the new object
wireplumber unique ID to index Lua tables, fixing runtime WP_PROXY_FEATURE_BOUND
check warnings.
They is really no needed with the new _get() API and the WpSpaJson API. In C,
users can use 'wp_spa_json_parse_{boolean|int|float|string}()' APIs to parse the
WpSpaJson. In Lua, users can just do 'Settings.get(setting, m):parse()'.
- Create policy-settings.conf and move all the policy settings to it.
- Change all the policy scripts to fetch the settigs from WpSettings
API.
- Remove all the references to config/lua.
Only the configured headset profile needs to be persistent, the switched
status and saved profile should not persist over wireplumber restart.
When devices appear initially, they should not appear as switched,
but recheck switch status.
Monitor whether streams are running or suspended. When they are
suspended, switch to normal mode.
This is required e.g. for programs such as Teams, which keep recording
streams open but inactive for their whole runtime.
Profile restore also needs to be done with a timeout, to avoid switching
rapidly when streams are moved between sources.
Use Lua tables properly as maps.
Headset profile saving does not work properly currently (only called on
metadata change; if headset-profile == current-profile, it doesn't get
saved etc.)
Change it to follow the logic:
- Each device has a "normal" and "switched" mode. The latter becomes
active if a "communication" input stream exists and the current
default sink is bluez sink. The switched mode is exited only when
there are no "communication" input streams.
- On transition normal->switched, record current profile as the "saved"
profile. Then switch to "headset" profile. If no headset profile
was saved previously, pick profile with input direction & highest
priority.
- On transition switched->normal, save currently active profile as the
"headset" profile. Then switch back to "saved" profile.
Monitor streams can be identified based on the stream.monitor property.
They should not be identified based on application name, because that
may be localized, and the previous code does not work properly on
non-English locale.
The "saved headset profile" is taken as the profile that was active when
the headset mode deactivates. So in case the user switches profile during
the time when the Communication input stream is active, the selected
profile is remembered next time.