[pulseaudio-discuss] [PATCH 2/2] cli: add commands to manipulate categories

Deng Zhengrong dzrongg at gmail.com
Wed Jun 6 13:17:40 PDT 2012


---
 src/pulsecore/cli-command.c |   58 +++++++++++++++++++++++++++++++++++++++++++
 src/pulsecore/log.c         |   16 ++++++++++++
 src/pulsecore/log.h         |    2 +
 3 files changed, 76 insertions(+), 0 deletions(-)

diff --git a/src/pulsecore/cli-command.c b/src/pulsecore/cli-command.c
index 0f7b634..bc20620 100644
--- a/src/pulsecore/cli-command.c
+++ b/src/pulsecore/cli-command.c
@@ -130,6 +130,8 @@ static int pa_cli_command_log_level(pa_core *c, pa_tokenizer *t, pa_strbuf *buf,
 static int pa_cli_command_log_meta(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, pa_bool_t *fail);
 static int pa_cli_command_log_time(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, pa_bool_t *fail);
 static int pa_cli_command_log_backtrace(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, pa_bool_t *fail);
+static int pa_cli_command_hide_category(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, pa_bool_t *fail);
+static int pa_cli_command_set_category_level(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, pa_bool_t *fail);
 static int pa_cli_command_update_sink_proplist(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, pa_bool_t *fail);
 static int pa_cli_command_update_source_proplist(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, pa_bool_t *fail);
 static int pa_cli_command_update_sink_input_proplist(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, pa_bool_t *fail);
@@ -193,6 +195,8 @@ static const struct command commands[] = {
     { "set-log-meta",            pa_cli_command_log_meta,           "Show source code location in log messages (args: bool)", 2},
     { "set-log-time",            pa_cli_command_log_time,           "Show timestamps in log messages (args: bool)", 2},
     { "set-log-backtrace",       pa_cli_command_log_backtrace,      "Show backtrace in log messages (args: frames)", 2},
+    { "hide-category",           pa_cli_command_hide_category,      "Hide all the logs from the corresponding category (args: category)", 2},
+    { "set-category-level",      pa_cli_command_set_category_level, "Change the category's log level (args: category level)", 3},
     { "play-file",               pa_cli_command_play_file,          "Play a sound file (args: filename, sink|index)", 3},
     { "dump",                    pa_cli_command_dump,               "Dump daemon configuration", 1},
     { "dump-volumes",            pa_cli_command_dump_volumes,       "Debug: Show the state of all volumes", 1 },
@@ -1629,6 +1633,60 @@ static int pa_cli_command_log_backtrace(pa_core *c, pa_tokenizer *t, pa_strbuf *
     return 0;
 }
 
+static int pa_cli_command_hide_category(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, pa_bool_t *fail) {
+    const char *category_name;
+
+    pa_core_assert_ref(c);
+    pa_assert(t);
+    pa_assert(buf);
+    pa_assert(fail);
+
+    if (!(category_name = pa_tokenizer_get(t, 1))) {
+        pa_strbuf_puts(buf, "You need to specify a category name.\n");
+        return -1;
+    }
+
+    if (!pa_log_category_set_level(category_name, (pa_log_level_t) 0)) {
+        pa_strbuf_puts(buf, "Failed to set the corresponding level.\n");
+        return -1;
+    }
+
+    return 0;
+}
+
+static int pa_cli_command_set_category_level(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, pa_bool_t *fail) {
+    const char *category_name;
+    const char *level_string;
+    pa_log_level_t level;
+
+    pa_core_assert_ref(c);
+    pa_assert(t);
+    pa_assert(buf);
+    pa_assert(fail);
+
+    if (!(category_name = pa_tokenizer_get(t, 1))) {
+        pa_strbuf_puts(buf, "You need to specify a category name.\n");
+        return -1;
+    }
+
+    if (!(level_string = pa_tokenizer_get(t, 2))) {
+        pa_strbuf_puts(buf, "You need to specify the level for the category.\n");
+        return -1;
+    }
+
+    if (pa_atou(level_string, &level) < 0 || level >= PA_LOG_LEVEL_MAX) {
+        pa_strbuf_puts(buf, "Failed to parse log level.\n");
+        return -1;
+    }
+
+    if (!pa_log_category_set_level(category_name, level)) {
+        pa_strbuf_puts(buf, "Failed to set the corresponding level.\n");
+        return -1;
+    }
+
+    return 0;
+}
+
 static int pa_cli_command_card_profile(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, pa_bool_t *fail) {
     const char *n, *p;
     pa_card *card;
diff --git a/src/pulsecore/log.c b/src/pulsecore/log.c
index 86df681..637287f 100644
--- a/src/pulsecore/log.c
+++ b/src/pulsecore/log.c
@@ -542,3 +542,19 @@ pa_bool_t pa_log_ratelimit(pa_log_level_t level) {
 
     return pa_ratelimit_test(&ratelimit, level);
 }
+
+pa_bool_t pa_log_category_set_level(const char *name, pa_log_level_t level) {
+    pa_log_category_t *category;
+
+    if (level >= PA_LOG_LEVEL_MAX)
+        return FALSE;
+
+    if (!(category = pa_log_category_get(name)))
+        return FALSE;
+
+    pa_mutex_lock(categories_mutex);
+    category->threshold = level;
+    pa_mutex_unlock(categories_mutex);
+
+    return TRUE;
+}
diff --git a/src/pulsecore/log.h b/src/pulsecore/log.h
index d5432e6..a53130e 100644
--- a/src/pulsecore/log.h
+++ b/src/pulsecore/log.h
@@ -151,4 +151,6 @@ LOG_FUNC(error, PA_LOG_ERROR)
 
 pa_bool_t pa_log_ratelimit(pa_log_level_t level);
 
+pa_bool_t pa_log_category_set_level(const char *name, pa_log_level_t level);
+
 #endif
-- 
1.7.7.6



More information about the pulseaudio-discuss mailing list