From 5a894270e64b36bbe411247b773ba71eeb6fa5fd Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Fri, 26 Sep 2025 10:55:10 +0200 Subject: [PATCH] pulse-server: add a pipewire-pulse:list-modules message It list all available module names, which you can then describe further. Make a little module_info iterator function for this. --- .../module-protocol-pulse/message-handler.c | 10 ++++++++++ src/modules/module-protocol-pulse/module.c | 20 +++++++++++++------ src/modules/module-protocol-pulse/module.h | 1 + 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/src/modules/module-protocol-pulse/message-handler.c b/src/modules/module-protocol-pulse/message-handler.c index 47b14ab21..ca1c17cf5 100644 --- a/src/modules/module-protocol-pulse/message-handler.c +++ b/src/modules/module-protocol-pulse/message-handler.c @@ -118,6 +118,16 @@ static int core_object_message_handler(struct client *client, struct pw_manager_ } else if (spa_streq(message, "pipewire-pulse:log-level")) { int res = pw_log_set_level_string(params); fprintf(response, "%d", res); + } else if (spa_streq(message, "pipewire-pulse:list-modules")) { + bool first = true; + const struct module_info *i = NULL; + fputc('[', response); + while ((i = module_info_next(client->impl, i)) != NULL) { + fprintf(response, "%s{\"name\":\"%s\"}", + first ? "" : ",\n", i->name); + first = false; + } + fputc(']', response); } else if (spa_streq(message, "pipewire-pulse:describe-module")) { const struct module_info *i = module_info_find(client->impl, params); diff --git a/src/modules/module-protocol-pulse/module.c b/src/modules/module-protocol-pulse/module.c index fe4b346d9..a0de01d0d 100644 --- a/src/modules/module-protocol-pulse/module.c +++ b/src/modules/module-protocol-pulse/module.c @@ -293,20 +293,28 @@ void audioinfo_to_properties(struct spa_audio_info_raw *info, struct pw_properti } } -const struct module_info *module_info_find(struct impl *impl, const char *name) +const struct module_info *module_info_next(struct impl *impl, const struct module_info *info) { extern const struct module_info __start_pw_mod_pulse_modules[]; extern const struct module_info __stop_pw_mod_pulse_modules[]; - const struct module_info *info = __start_pw_mod_pulse_modules; + if (info == NULL) + info = __start_pw_mod_pulse_modules; + else + info++; + if (info == __stop_pw_mod_pulse_modules) + return NULL; + return info; +} - for (; info < __stop_pw_mod_pulse_modules; info++) { +const struct module_info *module_info_find(struct impl *impl, const char *name) +{ + const struct module_info *info = NULL; + + while ((info = module_info_next(impl, info)) != NULL) { if (spa_streq(info->name, name)) return info; } - - spa_assert(info == __stop_pw_mod_pulse_modules); - return NULL; } diff --git a/src/modules/module-protocol-pulse/module.h b/src/modules/module-protocol-pulse/module.h index fdc45e46e..6bae8d9a5 100644 --- a/src/modules/module-protocol-pulse/module.h +++ b/src/modules/module-protocol-pulse/module.h @@ -62,6 +62,7 @@ struct module { #define module_emit_loaded(m,r) spa_hook_list_call(&m->listener_list, struct module_events, loaded, 0, r) #define module_emit_destroy(m) spa_hook_list_call(&(m)->listener_list, struct module_events, destroy, 0) +const struct module_info *module_info_next(struct impl *impl, const struct module_info *info); const struct module_info *module_info_find(struct impl *impl, const char *name); struct module *module_create(struct impl *impl, const char *name, const char *args);