Commit graph

29 commits

Author SHA1 Message Date
Julian Bouzas
388acb6ff3 scripts: Fix bluetooth profile autoswitch
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.
2023-10-19 11:24:42 -04:00
George Kiagiadakis
43aa2d4952 scripts: don't use 'local' for file-wide scoped variables
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.
2023-09-29 23:13:28 +03:00
Ashok Sidipotu
0dcd28e50f Lua scripts: replace "policy" with "linking" 2023-09-26 10:09:03 +03:00
Julian Bouzas
360e0b3eaf scripts: use WpConf API to get configuration values
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.
2023-04-17 07:48:18 -04:00
George Kiagiadakis
e1a8c3459a scripts: remove priority from all hooks and set up some basic dependencies 2023-04-17 07:48:18 -04:00
George Kiagiadakis
b100bdda4a event-hook: remove the exec type property & enumeration
With the latest changes, we can implement the "after-events" type
with external code that pushes a very low priority event that is
the "rescan" event.
2023-04-17 07:48:18 -04:00
George Kiagiadakis
bcb4e80723 m-std-event-source: use type-specific event names and multiple object managers
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.
2023-04-17 07:48:18 -04:00
George Kiagiadakis
c2c95bf726 scripts: port misc hooks to use the new priority enumerations 2023-04-17 07:48:18 -04:00
Julian Bouzas
6a612db57a config: make remaining non rule settings optional 2023-04-17 07:48:18 -04:00
Julian Bouzas
f1fbeaa661 m-lua-scripting: add fallback value for parse_{array|object}_safe() APIs 2023-04-17 07:48:18 -04:00
Julian Bouzas
42fc17b234 config: clean and comment all configuration that is not needed by default
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.
2023-04-17 07:48:16 -04:00
Ashok Sidipotu
6762de3990 policy-{bluetooth|device-profile|device-routes}.lua: Optimize for Event stack
- Sharpen the hooks.
- Make settings live, apply them when they are changed.
- Move some of the common functions to common_utils.lua
2023-04-17 07:47:09 -04:00
Julian Bouzas
a512ddaaf3 scripts: use the WpSettings safe APIs
Avoids Lua errors if a setting cannot be parsed or does not exist.
2023-04-17 07:47:09 -04:00
Julian Bouzas
0983326433 scripts: use the new object ID as index in the Lua tables
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.
2023-04-17 07:47:09 -04:00
Julian Bouzas
2f1aece8b6 settings: remove _get_{boolean|int|float|string}() APIs
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()'.
2023-04-17 07:47:09 -04:00
Julian Bouzas
a76e780b4b docs: update new configuration file names 2023-04-17 07:47:09 -04:00
Ashok Sidipotu
5550777983 policy-bluetooth.lua: Port onto Event-stack 2023-04-17 07:47:09 -04:00
Ashok Sidipotu
1f77be36e5 policy-bluetooth.lua: Adjust style 2023-04-17 07:47:09 -04:00
Ashok Sidipotu
8a0c4fde4c policy: Switch policy settings to JSON
- 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.
2023-04-17 07:44:19 -04:00
George Kiagiadakis
c4c5ca8e22 policy-bluetooth: fix string.find crash with nil string
Fixes #193
2022-02-14 10:38:51 +02:00
Pauli Virtanen
453a7e9325 scripts: policy-bluetooth: don't switch if already have input route
If the current profile has input route, don't switch to a different
profile. Instead, consider the current profile as the new headset
profile.
2022-02-02 10:33:24 +00:00
Pauli Virtanen
5a108a7c3f scripts: policy-bluetooth: save only necessary state on disk
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.
2022-02-02 10:33:24 +00:00
Pauli Virtanen
4dbf4f2b82 scripts: policy-bluetooth: monitor whether streams are running
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.
2022-02-02 10:33:24 +00:00
Pauli Virtanen
1fa65bf5b7 scripts: policy-bluetooth: save profiles by name, not index
The profile index may change, if the set of profiles on the device
changes, and is better to not use it for saving long-term.
2022-02-02 10:33:24 +00:00
Pauli Virtanen
ab725987d7 scripts: policy-bluetooth: fix headset profile saving
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.
2022-02-02 10:33:24 +00:00
Pauli Virtanen
c1f5e57047 scripts: policy-bluetooth: fix state_table usage
State saves everything as strings, so the get* routines have to convert
back.
2022-02-02 10:33:24 +00:00
Pauli Virtanen
2b1ee0c5b9 scripts: policy-bluetooth: ignore monitor streams properly
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.
2022-02-02 10:33:24 +00:00
Sanchayan Maity
ef7504bdc8 scripts: policy-bluetooth: Support saving of user selected headset profile
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.
2022-01-14 16:49:27 +00:00
Sanchayan Maity
99d0fa3196 scripts: Add a bluetooth policy script
Allow switching bluetooth profile based on presence of media.role or
a list of specified applications.
2022-01-14 16:49:27 +00:00