module-roc: forward roc-toolkit logs to pipewire logs

Roc-toolkit log records are captured via a callback and
written to PipeWire log with corresponding verbosity level.
The log.level config parameter limits record verbosity at
the roc-toolkit level.
This commit is contained in:
Misha Baranov 2026-02-16 22:35:14 +01:00 committed by Wim Taymans
parent 88cbe24201
commit b9922d8ed5
5 changed files with 127 additions and 6 deletions

View file

@ -0,0 +1,21 @@
#include <pipewire/log.h>
#include <roc/log.h>
#include "common.h"
PW_LOG_TOPIC(roc_log_topic, "mod.roc.lib");
void pw_roc_log_init(void)
{
roc_log_set_handler(pw_roc_log_handler, NULL);
roc_log_set_level(pw_roc_log_level_pw_2_roc(roc_log_topic->has_custom_level ? roc_log_topic->level : pw_log_level));
}
void pw_roc_log_handler(const roc_log_message *message, void *argument)
{
const enum spa_log_level log_level = pw_roc_log_level_roc_2_pw(message->level);
if (SPA_UNLIKELY(pw_log_topic_enabled(log_level, roc_log_topic))) {
pw_log_logt(log_level, roc_log_topic, message->file, message->line, message->module, message->text, "");
}
}

View file

@ -3,8 +3,10 @@
#include <roc/config.h>
#include <roc/endpoint.h>
#include <roc/log.h>
#include <spa/utils/string.h>
#include <spa/support/log.h>
#define PW_ROC_DEFAULT_IP "0.0.0.0"
#define PW_ROC_DEFAULT_SOURCE_PORT 10001
@ -18,6 +20,9 @@
#define PW_ROC_MULTITRACK_ENCODING_ID 100
#define PW_ROC_STEREO_POSITIONS "[ FL FR ]"
void pw_roc_log_init(void);
void pw_roc_log_handler(const roc_log_message *message, void *argument);
static inline int pw_roc_parse_fec_encoding(roc_fec_encoding *out, const char *str)
{
if (!str || !*str || spa_streq(str, "default"))
@ -132,4 +137,62 @@ static inline void pw_roc_fec_encoding_to_proto(roc_fec_encoding fec_code, roc_p
}
}
static inline roc_log_level pw_roc_log_level_pw_2_roc(const enum spa_log_level pw_log_level)
{
switch (pw_log_level) {
case SPA_LOG_LEVEL_NONE:
return ROC_LOG_NONE;
case SPA_LOG_LEVEL_ERROR:
return ROC_LOG_ERROR;
case SPA_LOG_LEVEL_WARN:
return ROC_LOG_ERROR;
case SPA_LOG_LEVEL_INFO:
return ROC_LOG_INFO;
case SPA_LOG_LEVEL_DEBUG:
return ROC_LOG_DEBUG;
case SPA_LOG_LEVEL_TRACE:
return ROC_LOG_TRACE;
default:
return ROC_LOG_NONE;
}
}
static inline enum spa_log_level pw_roc_log_level_roc_2_pw(const roc_log_level roc_log_level)
{
switch (roc_log_level) {
case ROC_LOG_NONE:
return SPA_LOG_LEVEL_NONE;
case ROC_LOG_ERROR:
return SPA_LOG_LEVEL_ERROR;
case ROC_LOG_INFO:
return SPA_LOG_LEVEL_INFO;
case ROC_LOG_DEBUG:
return SPA_LOG_LEVEL_DEBUG;
case ROC_LOG_TRACE:
return SPA_LOG_LEVEL_TRACE;
default:
return SPA_LOG_LEVEL_NONE;
}
}
static inline int pw_roc_parse_log_level(roc_log_level *loglevel, const char *str,
roc_log_level default_level)
{
if (spa_streq(str, "DEFAULT"))
*loglevel = default_level;
else if (spa_streq(str, "NONE"))
*loglevel = ROC_LOG_NONE;
else if (spa_streq(str, "ERROR"))
*loglevel = ROC_LOG_ERROR;
else if (spa_streq(str, "INFO"))
*loglevel = ROC_LOG_INFO;
else if (spa_streq(str, "DEBUG"))
*loglevel = ROC_LOG_DEBUG;
else if (spa_streq(str, "TRACE"))
*loglevel = ROC_LOG_TRACE;
else
return -EINVAL;
return 0;
}
#endif /* MODULE_ROC_COMMON_H */