diff --git a/src/pipewire/log.c b/src/pipewire/log.c index 9a0bc2a96..e3a06e784 100644 --- a/src/pipewire/log.c +++ b/src/pipewire/log.c @@ -48,9 +48,13 @@ static struct spa_log *global_log = &default_log.log; SPA_EXPORT void pw_log_set(struct spa_log *log) { - global_log = log; - if (global_log) - global_log->level = pw_log_level; + global_log = log ? log : &default_log.log; + global_log->level = pw_log_level; +} + +bool pw_log_is_default(void) +{ + return global_log == &default_log.log; } /** Get the global log interface @@ -71,8 +75,7 @@ SPA_EXPORT void pw_log_set_level(enum spa_log_level level) { pw_log_level = level; - if (global_log) - global_log->level = level; + global_log->level = level; } /** Log a message diff --git a/src/pipewire/log.h b/src/pipewire/log.h index 7b9eea708..3ea539242 100644 --- a/src/pipewire/log.h +++ b/src/pipewire/log.h @@ -43,19 +43,26 @@ extern "C" { /** The global log level */ extern enum spa_log_level pw_log_level; +/** Configure a logging module. This is usually done automatically + * in pw_init() but you can install a custom logger before calling + * pw_init(). */ void pw_log_set(struct spa_log *log); + +/** Get the log interface */ struct spa_log *pw_log_get(void); -void -pw_log_set_level(enum spa_log_level level); +/** Configure the logging level */ +void pw_log_set_level(enum spa_log_level level); +/** Log a message */ void pw_log_log(enum spa_log_level level, const char *file, int line, const char *func, const char *fmt, ...) SPA_PRINTF_FUNC(5, 6); +/** Log a message */ void pw_log_logv(enum spa_log_level level, const char *file, diff --git a/src/pipewire/pipewire.c b/src/pipewire/pipewire.c index 5b7070c37..ee879a5b9 100644 --- a/src/pipewire/pipewire.c +++ b/src/pipewire/pipewire.c @@ -382,19 +382,24 @@ void pw_init(int *argc, char **argv[]) spa_list_init(&global_registry.plugins); support->registry = &global_registry; - n_items = 0; - items[n_items++] = SPA_DICT_ITEM_INIT(SPA_KEY_LOG_COLORS, "true"); - items[n_items++] = SPA_DICT_ITEM_INIT(SPA_KEY_LOG_TIMESTAMP, "true"); - items[n_items++] = SPA_DICT_ITEM_INIT(SPA_KEY_LOG_LINE, "true"); - snprintf(level, sizeof(level), "%d", pw_log_level); - items[n_items++] = SPA_DICT_ITEM_INIT(SPA_KEY_LOG_LEVEL, level); - if ((str = getenv("PIPEWIRE_LOG")) != NULL) - items[n_items++] = SPA_DICT_ITEM_INIT(SPA_KEY_LOG_FILE, str); - info = SPA_DICT_INIT(items, n_items); + if (pw_log_is_default()) { + n_items = 0; + items[n_items++] = SPA_DICT_ITEM_INIT(SPA_KEY_LOG_COLORS, "true"); + items[n_items++] = SPA_DICT_ITEM_INIT(SPA_KEY_LOG_TIMESTAMP, "true"); + items[n_items++] = SPA_DICT_ITEM_INIT(SPA_KEY_LOG_LINE, "true"); + snprintf(level, sizeof(level), "%d", pw_log_level); + items[n_items++] = SPA_DICT_ITEM_INIT(SPA_KEY_LOG_LEVEL, level); + if ((str = getenv("PIPEWIRE_LOG")) != NULL) + items[n_items++] = SPA_DICT_ITEM_INIT(SPA_KEY_LOG_FILE, str); + info = SPA_DICT_INIT(items, n_items); - log = add_interface(support, SPA_NAME_SUPPORT_LOG, SPA_TYPE_INTERFACE_Log, &info); - if (log) - pw_log_set(log); + log = add_interface(support, SPA_NAME_SUPPORT_LOG, SPA_TYPE_INTERFACE_Log, &info); + if (log) + pw_log_set(log); + } else { + support->support[support->n_support++] = + SPA_SUPPORT_INIT(SPA_TYPE_INTERFACE_Log, pw_log_get()); + } n_items = 0; if ((str = getenv("PIPEWIRE_CPU"))) diff --git a/src/pipewire/private.h b/src/pipewire/private.h index 6ac36f48b..5b268de34 100644 --- a/src/pipewire/private.h +++ b/src/pipewire/private.h @@ -1104,6 +1104,8 @@ void pw_log_log_object(enum spa_log_level level, const char *file, int line, #define pw_log_pod(lev,pod) pw_log_object(lev,PW_LOG_OBJECT_POD,pod) #define pw_log_format(lev,pod) pw_log_object(lev,PW_LOG_OBJECT_POD,pod) +bool pw_log_is_default(void); + /** \endcond */ #ifdef __cplusplus