From 9d779300af0f58c4188571061a31772a6e182f3c Mon Sep 17 00:00:00 2001 From: Pauli Virtanen Date: Sat, 9 Dec 2023 11:25:43 +0200 Subject: [PATCH] context: support letter codes for log.level Letter codes instead of numbers for log levels are allowed in PIPEWIRE_DEBUG. Support them also for log.level in context properties and metadata. Add a few alias letter codes to harmonize them with what WirePlumber 0.5 supports. --- src/pipewire/context.c | 10 ++++++++-- src/pipewire/log.c | 2 -- src/pipewire/pipewire.c | 19 ++++++++++++++----- src/pipewire/private.h | 3 +++ src/pipewire/settings.c | 10 ++++++++-- 5 files changed, 33 insertions(+), 11 deletions(-) diff --git a/src/pipewire/context.c b/src/pipewire/context.c index 1046fc9ff..c7f937486 100644 --- a/src/pipewire/context.c +++ b/src/pipewire/context.c @@ -263,8 +263,14 @@ struct pw_context *pw_context_new(struct pw_loop *main_loop, } if (getenv("PIPEWIRE_DEBUG") == NULL && - (str = pw_properties_get(properties, "log.level")) != NULL) - pw_log_set_level(atoi(str)); + (str = pw_properties_get(properties, "log.level")) != NULL) { + enum spa_log_level lev; + + if (pw_parse_log_level(str, &lev)) + pw_log_set_level(lev); + else + pw_log_warn("%p: invalid log.level in context properties", this); + } if (pw_properties_get_bool(properties, "mem.mlock-all", false)) { if (mlockall(MCL_CURRENT | MCL_FUTURE) < 0) diff --git a/src/pipewire/log.c b/src/pipewire/log.c index 8dcbeb8fc..10b697c8f 100644 --- a/src/pipewire/log.c +++ b/src/pipewire/log.c @@ -18,8 +18,6 @@ SPA_LOG_IMPL(default_log); -#define DEFAULT_LOG_LEVEL SPA_LOG_LEVEL_WARN - SPA_EXPORT enum spa_log_level pw_log_level = DEFAULT_LOG_LEVEL; diff --git a/src/pipewire/pipewire.c b/src/pipewire/pipewire.c index 62e9ca57f..cc6169698 100644 --- a/src/pipewire/pipewire.c +++ b/src/pipewire/pipewire.c @@ -469,15 +469,23 @@ static struct spa_log *load_journal_logger(struct support *support, } #endif -static bool -parse_log_level(const char *str, enum spa_log_level *l) +bool +pw_parse_log_level(const char *str, enum spa_log_level *l) { uint32_t lvl; + + if (!str) + return false; + if (strlen(str) == 1) { - switch(str[0]) { + /* SPA levels, plus a few duplicate codes that + * WirePlumber supports for some GLib levels. */ + switch (str[0]) { case 'X': lvl = SPA_LOG_LEVEL_NONE; break; + case 'F': lvl = SPA_LOG_LEVEL_NONE; break; /* fatal */ case 'E': lvl = SPA_LOG_LEVEL_ERROR; break; case 'W': lvl = SPA_LOG_LEVEL_WARN; break; + case 'N': lvl = SPA_LOG_LEVEL_WARN; break; /* notice */ case 'I': lvl = SPA_LOG_LEVEL_INFO; break; case 'D': lvl = SPA_LOG_LEVEL_DEBUG; break; case 'T': lvl = SPA_LOG_LEVEL_TRACE; break; @@ -491,6 +499,7 @@ check_int: if (lvl > SPA_LOG_LEVEL_TRACE) return false; } + *l = lvl; return true; } @@ -524,11 +533,11 @@ parse_pw_debug_env(void) char *tok[2]; n_tok = pw_split_ip(tokens[i], ":", SPA_N_ELEMENTS(tok), tok); - if (n_tok == 2 && parse_log_level(tok[1], &lvl)) { + if (n_tok == 2 && pw_parse_log_level(tok[1], &lvl)) { char *pattern = tok[0]; pos += spa_scnprintf(pos, end - pos, "{ %s = %d },", pattern, lvl); - } else if (n_tok == 1 && parse_log_level(tok[0], &lvl)) { + } else if (n_tok == 1 && pw_parse_log_level(tok[0], &lvl)) { pw_log_set_level(lvl); } else { pw_log_warn("Ignoring invalid format in PIPEWIRE_DEBUG: '%s'", diff --git a/src/pipewire/private.h b/src/pipewire/private.h index 021a5d5f9..f35c3bf93 100644 --- a/src/pipewire/private.h +++ b/src/pipewire/private.h @@ -30,6 +30,7 @@ struct ucred { #define MAX_RATES 32u #define CLOCK_MIN_QUANTUM 4u #define CLOCK_MAX_QUANTUM 65536u +#define DEFAULT_LOG_LEVEL SPA_LOG_LEVEL_WARN struct settings { uint32_t log_level; @@ -1294,6 +1295,8 @@ void pw_settings_clean(struct pw_context *context); bool pw_should_dlclose(void); +bool pw_parse_log_level(const char *str, enum spa_log_level *l); + /** \endcond */ #ifdef __cplusplus diff --git a/src/pipewire/settings.c b/src/pipewire/settings.c index 716a686c6..c6b72ec86 100644 --- a/src/pipewire/settings.c +++ b/src/pipewire/settings.c @@ -142,8 +142,14 @@ static int metadata_property(void *data, uint32_t subject, const char *key, return 0; if (spa_streq(key, "log.level")) { - v = value ? atoi(value) : 3; - pw_log_set_level(v); + enum spa_log_level lev; + + if (!value) + pw_log_set_level(DEFAULT_LOG_LEVEL); + else if (pw_parse_log_level(value, &lev)) + pw_log_set_level(lev); + else + pw_log_warn("Ignoring unknown settings metadata log.level '%s'", value); } else if (spa_streq(key, "clock.rate")) { v = value ? atoi(value) : 0; s->clock_rate = v == 0 ? d->clock_rate : v;