Files
wireplumber/modules/module-log-settings.c
Pauli Virtanen 6037a6af94 m-log-settings: add module for changing log level at runtime
Pipewire server uses the global "settings" metadata for adjusting its
own log level.

Make it a convention that clients may watch "log.level" in this metadata
with their client id as subject, for setting their own log level
dynamically.

Watch the global "settings" metadata for "log.level" changes for our id.
On changes, set our log level accordingly.
2023-12-24 17:59:59 +02:00

104 lines
3.0 KiB
C

/* WirePlumber
*
* Copyright © 2023 Collabora Ltd.
* Copyright © 2023 Pauli Virtanen <pav@iki.fi>
*
* SPDX-License-Identifier: MIT
*/
#include <wp/wp.h>
#include <errno.h>
#include <pipewire/pipewire.h>
#include <pipewire/keys.h>
WP_DEFINE_LOCAL_LOG_TOPIC ("m-log-settings")
struct _WpLogSettingsPlugin
{
WpPlugin parent;
WpObjectManager *metadata_om;
};
G_DECLARE_FINAL_TYPE (WpLogSettingsPlugin, wp_log_settings_plugin,
WP, LOG_SETTINGS_PLUGIN, WpPlugin)
G_DEFINE_TYPE (WpLogSettingsPlugin, wp_log_settings_plugin, WP_TYPE_PLUGIN)
static void
wp_log_settings_plugin_init (WpLogSettingsPlugin * self)
{
}
static void
on_metadata_changed (WpMetadata *m, guint32 subject,
const gchar *key, const gchar *type, const gchar *value, gpointer d)
{
WpLogSettingsPlugin * self = WP_LOG_SETTINGS_PLUGIN (d);
g_autoptr (WpCore) core = wp_object_get_core (WP_OBJECT (self));
g_return_if_fail (core);
if (subject != wp_core_get_own_bound_id (core))
return;
if (spa_streq(key, "log.level"))
wp_log_set_global_level (value ? value : "2");
}
static void
on_metadata_added (WpObjectManager *om, WpMetadata *metadata, gpointer d)
{
WpLogSettingsPlugin * self = WP_LOG_SETTINGS_PLUGIN (d);
g_autoptr (WpCore) core = wp_object_get_core (WP_OBJECT (self));
g_return_if_fail (core);
/* Handle the changed signal */
g_signal_connect_object (metadata, "changed",
G_CALLBACK (on_metadata_changed), self, 0);
}
static void
wp_log_settings_plugin_enable (WpPlugin * plugin, WpTransition * transition)
{
WpLogSettingsPlugin * self = WP_LOG_SETTINGS_PLUGIN (plugin);
g_autoptr (WpCore) core = wp_object_get_core (WP_OBJECT (plugin));
g_return_if_fail (core);
/* Create the metadata object manager */
self->metadata_om = wp_object_manager_new ();
wp_object_manager_add_interest (self->metadata_om, WP_TYPE_METADATA,
WP_CONSTRAINT_TYPE_PW_GLOBAL_PROPERTY, "metadata.name", "=s", "settings",
NULL);
wp_object_manager_request_object_features (self->metadata_om,
WP_TYPE_METADATA, WP_OBJECT_FEATURES_ALL);
g_signal_connect_object (self->metadata_om, "object-added",
G_CALLBACK (on_metadata_added), self, 0);
wp_core_install_object_manager (core, self->metadata_om);
wp_object_update_features (WP_OBJECT (self), WP_PLUGIN_FEATURE_ENABLED, 0);
}
static void
wp_log_settings_plugin_disable (WpPlugin * plugin)
{
WpLogSettingsPlugin * self = WP_LOG_SETTINGS_PLUGIN (plugin);
g_clear_object (&self->metadata_om);
}
static void
wp_log_settings_plugin_class_init (WpLogSettingsPluginClass * klass)
{
WpPluginClass *plugin_class = (WpPluginClass *) klass;
plugin_class->enable = wp_log_settings_plugin_enable;
plugin_class->disable = wp_log_settings_plugin_disable;
}
WP_PLUGIN_EXPORT GObject *
wireplumber__module_init (WpCore * core, GVariant * args, GError ** error)
{
return G_OBJECT (g_object_new (wp_log_settings_plugin_get_type (),
"name", "log-settings",
"core", core,
NULL));
}