Takashi Iwai
71654b8284
- Add patch from upstream to remove the "clear-persistent" sub-command and add a "settings" sub-command: * 0001-wpctl-add-settings-subcomand-to-show_-delete-or-change.patch - Update to version 0.4.82 (0.5.0 pre-release 2) * Highlights: - Bluetooth auto-switching is now implemented with a virtual source node. When an application links to it, the actual device switches to the HSP/HFP profile to provide the real audio stream. This is a more robust solution that works with more applications and is more user-friendly than the previous application whitelist approach - Added support for dynamic log level changes via the PipeWire settings metadata. Also added support for log level patterns in the configuration file - The "persistent" (i.e. stored) settings approach has changed to use two different metadata objects: sm-settings and persistent-sm-settings. Changes in the former are applied in the current session but not stored, while changes in the latter are stored and restored at startup. Some work was also done to expose a wpctl interface to read and change these settings, but more is underway - Several WirePlumber-specific node properties that used to be called target.* have been renamed to node.* to match the PipeWire convention of node.dont-reconnect. These are also now fully documented * Other changes: - Many documentation updates - Added support for SNAP container permissions - Fixed multiple issues related to restoring the Route OBS-URL: https://build.opensuse.org/request/show/1147639 OBS-URL: https://build.opensuse.org/package/show/multimedia:libs/wireplumber?expand=0&rev=66
275 lines
9.8 KiB
Diff
275 lines
9.8 KiB
Diff
From bebfc07d84b149a07af1dd2d5d26fafc76237b4e Mon Sep 17 00:00:00 2001
|
|
From: Julian Bouzas <julian.bouzas@collabora.com>
|
|
Date: Wed, 14 Feb 2024 12:04:01 -0500
|
|
Subject: [PATCH] wpctl: add settings subcomand to show, delete or change
|
|
settings
|
|
|
|
---
|
|
src/tools/wpctl.c | 196 ++++++++++++++++++++++++++++++++++++----------
|
|
1 file changed, 156 insertions(+), 40 deletions(-)
|
|
|
|
diff --git a/src/tools/wpctl.c b/src/tools/wpctl.c
|
|
index 13abe5db..d8b14eb7 100644
|
|
--- a/src/tools/wpctl.c
|
|
+++ b/src/tools/wpctl.c
|
|
@@ -82,7 +82,10 @@ static struct {
|
|
|
|
struct {
|
|
const gchar *key;
|
|
- } clear_persistent;
|
|
+ const gchar *val;
|
|
+ gboolean remove;
|
|
+ gboolean save;
|
|
+ } settings;
|
|
|
|
struct {
|
|
guint64 id;
|
|
@@ -393,7 +396,6 @@ status_run (WpCtl * self)
|
|
g_autoptr (WpIterator) it = NULL;
|
|
g_auto (GValue) val = G_VALUE_INIT;
|
|
g_autoptr (WpPlugin) def_nodes_api = NULL;
|
|
- g_autoptr (WpMetadata) persistent_settings = NULL;
|
|
struct print_context context = { .self = self };
|
|
|
|
def_nodes_api = wp_plugin_find (self->core, "default-nodes-api");
|
|
@@ -515,23 +517,6 @@ status_run (WpCtl * self)
|
|
/* Settings */
|
|
printf ("Settings\n");
|
|
|
|
- persistent_settings = wp_object_manager_lookup (self->om, WP_TYPE_METADATA,
|
|
- WP_CONSTRAINT_TYPE_PW_GLOBAL_PROPERTY,
|
|
- "metadata.name", "=s", "persistent-sm-settings",
|
|
- NULL);
|
|
- printf (TREE_INDENT_NODE "Persistent:\n");
|
|
- if (persistent_settings) {
|
|
- it = wp_metadata_new_iterator (persistent_settings, 0);
|
|
- for (; wp_iterator_next (it, &val); g_value_unset (&val)) {
|
|
- const gchar *key, *value;
|
|
- wp_metadata_iterator_item_extract (&val, NULL, &key, NULL, &value);
|
|
- printf (TREE_INDENT_LINE " - %s: %s\n", key, value);
|
|
- }
|
|
- g_clear_pointer (&it, wp_iterator_unref);
|
|
- }
|
|
-
|
|
- printf (TREE_INDENT_LINE "\n");
|
|
-
|
|
printf (TREE_INDENT_END "Default Configured Devices:\n");
|
|
if (def_nodes_api) {
|
|
for (guint i = 0; i < G_N_ELEMENTS (DEFAULT_NODE_MEDIA_CLASSES); i++) {
|
|
@@ -1368,21 +1353,30 @@ out:
|
|
g_main_loop_quit (self->loop);
|
|
}
|
|
|
|
-/* clear-persistent */
|
|
+/* settings */
|
|
|
|
static gboolean
|
|
-clear_persistent_parse_positional (gint argc, gchar ** argv, GError **error)
|
|
+settings_parse_positional (gint argc, gchar ** argv, GError **error)
|
|
{
|
|
- if (argc >= 3)
|
|
- cmdline.clear_persistent.key = argv[2];
|
|
- else
|
|
- cmdline.clear_persistent.key = NULL;
|
|
+ cmdline.settings.key = NULL;
|
|
+ cmdline.settings.val = NULL;
|
|
+ if (argc >= 3) {
|
|
+ cmdline.settings.key = argv[2];
|
|
+ if (argc >= 4)
|
|
+ cmdline.settings.val = argv[3];
|
|
+ }
|
|
+
|
|
+ if (cmdline.settings.remove && cmdline.settings.save) {
|
|
+ g_set_error (error, wpctl_error_domain_quark(), 0,
|
|
+ "Cannot use --delete and --save flags at the same time");
|
|
+ return FALSE;
|
|
+ }
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
static gboolean
|
|
-clear_persistent_prepare (WpCtl * self, GError ** error)
|
|
+settings_prepare (WpCtl * self, GError ** error)
|
|
{
|
|
wp_object_manager_add_interest (self->om, WP_TYPE_METADATA, NULL);
|
|
wp_object_manager_request_object_features (self->om, WP_TYPE_METADATA,
|
|
@@ -1391,10 +1385,21 @@ clear_persistent_prepare (WpCtl * self, GError ** error)
|
|
}
|
|
|
|
static void
|
|
-clear_persistent_run (WpCtl * self)
|
|
+settings_run (WpCtl * self)
|
|
{
|
|
+ g_autoptr (WpMetadata) settings = NULL;
|
|
g_autoptr (WpMetadata) persistent_settings = NULL;
|
|
+ g_autoptr (WpIterator) it = NULL;
|
|
+ g_auto (GValue) val = G_VALUE_INIT;
|
|
|
|
+ settings = wp_object_manager_lookup (self->om, WP_TYPE_METADATA,
|
|
+ WP_CONSTRAINT_TYPE_PW_GLOBAL_PROPERTY,
|
|
+ "metadata.name", "=s", "sm-settings",
|
|
+ NULL);
|
|
+ if (!settings) {
|
|
+ fprintf (stderr, "Settings metadata not found\n");
|
|
+ goto out;
|
|
+ }
|
|
persistent_settings = wp_object_manager_lookup (self->om, WP_TYPE_METADATA,
|
|
WP_CONSTRAINT_TYPE_PW_GLOBAL_PROPERTY,
|
|
"metadata.name", "=s", "persistent-sm-settings",
|
|
@@ -1404,12 +1409,115 @@ clear_persistent_run (WpCtl * self)
|
|
goto out;
|
|
}
|
|
|
|
- if (cmdline.clear_persistent.key)
|
|
- wp_metadata_set (persistent_settings, 0, cmdline.clear_persistent.key, NULL,
|
|
- NULL);
|
|
- else
|
|
- wp_metadata_clear (persistent_settings);
|
|
-
|
|
+ if (!cmdline.settings.key && !cmdline.settings.val) {
|
|
+ /* No key or value */
|
|
+ if (!cmdline.settings.remove && !cmdline.settings.save) {
|
|
+ /* Print all settings */
|
|
+ printf ("Settings:\n");
|
|
+ it = wp_metadata_new_iterator (settings, 0);
|
|
+ for (; wp_iterator_next (it, &val); g_value_unset (&val)) {
|
|
+ const gchar *key, *value, *saved_value;
|
|
+ wp_metadata_iterator_item_extract (&val, 0, &key, NULL, &value);
|
|
+ saved_value = wp_metadata_find (persistent_settings, 0, key, NULL);
|
|
+ if (saved_value)
|
|
+ printf (" - %s: %s (saved: %s)\n", key, value, saved_value);
|
|
+ else
|
|
+ printf (" - %s: %s\n", key, value);
|
|
+ }
|
|
+ g_clear_pointer (&it, wp_iterator_unref);
|
|
+ } else if (!cmdline.settings.remove && cmdline.settings.save) {
|
|
+ /* Save all current settings */
|
|
+ it = wp_metadata_new_iterator (settings, 0);
|
|
+ for (; wp_iterator_next (it, &val); g_value_unset (&val)) {
|
|
+ const gchar *key, *type, *value;
|
|
+ wp_metadata_iterator_item_extract (&val, 0, &key, &type, &value);
|
|
+ wp_metadata_set (persistent_settings, 0, key, type, value);
|
|
+ fprintf (stderr, "Saved setting %s with value %s\n", key, value);
|
|
+ }
|
|
+ } else if (cmdline.settings.remove && !cmdline.settings.save) {
|
|
+ /* Delete all saved settings */
|
|
+ wp_metadata_clear (persistent_settings);
|
|
+ fprintf (stderr, "Deleted all saved settings\n");
|
|
+ } else {
|
|
+ g_assert_not_reached ();
|
|
+ }
|
|
+ } else if (cmdline.settings.key && !cmdline.settings.val) {
|
|
+ /* only key */
|
|
+ if (!cmdline.settings.remove && !cmdline.settings.save) {
|
|
+ /* Print setting value */
|
|
+ const gchar *value, *saved_value;
|
|
+ value = wp_metadata_find (settings, 0, cmdline.settings.key, NULL);
|
|
+ if (value) {
|
|
+ saved_value = wp_metadata_find (persistent_settings, 0,
|
|
+ cmdline.settings.key, NULL);
|
|
+ if (saved_value)
|
|
+ printf ("%s (saved: %s)\n", value, saved_value);
|
|
+ else
|
|
+ printf ("%s\n", value);
|
|
+ } else {
|
|
+ printf ("Setting %s not found\n", cmdline.settings.key);
|
|
+ }
|
|
+ } else if (!cmdline.settings.remove && cmdline.settings.save) {
|
|
+ /* Save setting */
|
|
+ const gchar *value, *type;
|
|
+ value = wp_metadata_find (settings, 0, cmdline.settings.key, &type);
|
|
+ if (value) {
|
|
+ wp_metadata_set (persistent_settings, 0, cmdline.settings.key, type,
|
|
+ value);
|
|
+ printf ("Updated and saved setting %s with current value %s\n",
|
|
+ cmdline.settings.key, value);
|
|
+ } else {
|
|
+ printf ("Setting %s not found\n", cmdline.settings.key);
|
|
+ }
|
|
+ } else if (cmdline.settings.remove && !cmdline.settings.save) {
|
|
+ /* Delete saved setting */
|
|
+ const gchar *value;
|
|
+ value = wp_metadata_find (persistent_settings, 0, cmdline.settings.key,
|
|
+ NULL);
|
|
+ if (value) {
|
|
+ wp_metadata_set (persistent_settings, 0, cmdline.settings.key, NULL,
|
|
+ NULL);
|
|
+ printf ("Deleted setting %s with value %s\n", cmdline.settings.key,
|
|
+ value);
|
|
+ } else {
|
|
+ printf ("Setting %s is not saved\n", cmdline.settings.key);
|
|
+ }
|
|
+ } else {
|
|
+ g_assert_not_reached ();
|
|
+ }
|
|
+ } else if (cmdline.settings.key && cmdline.settings.val) {
|
|
+ /* key and value */
|
|
+ if (!cmdline.settings.remove && !cmdline.settings.save) {
|
|
+ /* Set setting value */
|
|
+ wp_metadata_set (settings, 0, cmdline.settings.key, NULL,
|
|
+ cmdline.settings.val);
|
|
+ printf ("Updated setting %s with value %s\n", cmdline.settings.key,
|
|
+ cmdline.settings.val);
|
|
+ } else if (!cmdline.settings.remove && cmdline.settings.save) {
|
|
+ /* Save setting value */
|
|
+ wp_metadata_set (persistent_settings, 0, cmdline.settings.key, NULL,
|
|
+ cmdline.settings.val);
|
|
+ printf ("Updated and saved setting %s with current value %s\n",
|
|
+ cmdline.settings.key, cmdline.settings.val);
|
|
+ } else if (cmdline.settings.remove && !cmdline.settings.save) {
|
|
+ /* Remove saved setting */
|
|
+ const gchar *value;
|
|
+ value = wp_metadata_find (persistent_settings, 0, cmdline.settings.key,
|
|
+ NULL);
|
|
+ if (value) {
|
|
+ wp_metadata_set (persistent_settings, 0, cmdline.settings.key, NULL,
|
|
+ NULL);
|
|
+ printf ("Deleted setting %s with value %s\n", cmdline.settings.key,
|
|
+ value);
|
|
+ } else {
|
|
+ printf ("Setting %s is not saved\n", cmdline.settings.key);
|
|
+ }
|
|
+ } else {
|
|
+ g_assert_not_reached ();
|
|
+ }
|
|
+ } else {
|
|
+ g_assert_not_reached ();
|
|
+ }
|
|
|
|
wp_core_sync (self->core, NULL, (GAsyncReadyCallback) async_quit, self);
|
|
return;
|
|
@@ -1647,14 +1755,22 @@ static const struct subcommand {
|
|
.run = clear_default_run,
|
|
},
|
|
{
|
|
- .name = "clear-persistent",
|
|
- .positional_args = "[KEY]",
|
|
- .summary = "Clears the persistent setting (no KEY means 'all')",
|
|
+ .name = "settings",
|
|
+ .positional_args = "[KEY] [VAL]",
|
|
+ .summary = "Shows, changes or removes settings",
|
|
.description = NULL,
|
|
- .entries = { { NULL } },
|
|
- .parse_positional = clear_persistent_parse_positional,
|
|
- .prepare = clear_persistent_prepare,
|
|
- .run = clear_persistent_run,
|
|
+ .entries = {
|
|
+ { "delete", 'd', G_OPTION_FLAG_NONE, G_OPTION_ARG_NONE,
|
|
+ &cmdline.settings.remove,
|
|
+ "Deletes the saved setting value (no KEY means 'all')", NULL },
|
|
+ { "save", 's', G_OPTION_FLAG_NONE, G_OPTION_ARG_NONE,
|
|
+ &cmdline.settings.save,
|
|
+ "Saves the setting value (no KEY means 'all', no VAL means current value)", NULL },
|
|
+ { NULL }
|
|
+ },
|
|
+ .parse_positional = settings_parse_positional,
|
|
+ .prepare = settings_prepare,
|
|
+ .run = settings_run,
|
|
},
|
|
{
|
|
.name = "set-log-level",
|
|
--
|
|
GitLab
|
|
|