From 205828a244b672361d0b2cea01a8f8315f27b4bf Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Tue, 3 Mar 2020 12:15:49 +0100 Subject: [PATCH] daemon: add create-object command Add a command to create an object from a factory. Add some example lines in the config file on how to wrap an audiotestsrc in an adapter with this. --- src/daemon/command.c | 58 +++++++++++++++++++++++++++++++++++++ src/daemon/pipewire.conf.in | 4 +++ 2 files changed, 62 insertions(+) diff --git a/src/daemon/command.c b/src/daemon/command.c index 12c5a05dc..d185d5584 100644 --- a/src/daemon/command.c +++ b/src/daemon/command.c @@ -40,6 +40,7 @@ static struct pw_command *parse_command_help(struct pw_properties *properties, c static struct pw_command *parse_command_set_prop(struct pw_properties *properties, const char *line, char **err); static struct pw_command *parse_command_add_spa_lib(struct pw_properties *properties, const char *line, char **err); static struct pw_command *parse_command_module_load(struct pw_properties *properties, const char *line, char **err); +static struct pw_command *parse_command_create_object(struct pw_properties *properties, const char *line, char **err); static struct pw_command *parse_command_exec(struct pw_properties *properties, const char *line, char **err); struct impl { @@ -60,6 +61,7 @@ static const struct command_parse parsers[] = { {"set-prop", "Set a property", parse_command_set_prop}, {"add-spa-lib", "Add a library that provides a spa factory name regex", parse_command_add_spa_lib}, {"load-module", "Load a module", parse_command_module_load}, + {"create-object", "Create an object from a factory", parse_command_create_object}, {"exec", "Execute a program", parse_command_exec}, {NULL, NULL, NULL } }; @@ -129,6 +131,7 @@ static struct pw_command *parse_command_set_prop(struct pw_properties *propertie error_arguments: *err = spa_aprintf("%s requires ", this->args[0]); pw_free_strv(this->args); + free(impl); return NULL; error_alloc: *err = spa_aprintf("alloc failed: %m"); @@ -169,6 +172,7 @@ static struct pw_command *parse_command_add_spa_lib(struct pw_properties *proper no_library: *err = spa_aprintf("%s requires ", this->args[0]); pw_free_strv(this->args); + free(impl); return NULL; no_mem: *err = spa_aprintf("alloc failed: %m"); @@ -238,6 +242,59 @@ static struct pw_command *parse_command_module_load(struct pw_properties *proper no_module: *err = spa_aprintf("%s requires a module name", this->args[0]); pw_free_strv(this->args); + free(impl); + return NULL; +no_mem: + *err = spa_aprintf("alloc failed: %m"); + return NULL; +} + +static int +execute_command_create_object(struct pw_command *command, struct pw_context *context, char **err) +{ + struct pw_impl_factory *factory; + void *obj; + + factory = pw_context_find_factory(context, command->args[1]); + if (factory == NULL) { + pw_log_error("can't find factory %s", command->args[1]); + return -ENOENT; + } + + obj = pw_impl_factory_create_object(factory, + NULL, NULL, 0, + pw_properties_new_string(command->args[2]), + SPA_ID_INVALID); + if (obj == NULL) { + pw_log_error("can't create object from factory %s: %m", command->args[1]); + return -errno; + } + + return 0; +} + +static struct pw_command *parse_command_create_object(struct pw_properties *properties, const char *line, char **err) +{ + struct impl *impl; + struct pw_command *this; + + impl = calloc(1, sizeof(struct impl)); + if (impl == NULL) + goto no_mem; + + this = &impl->this; + this->func = execute_command_create_object; + this->args = pw_split_strv(line, whitespace, 3, &this->n_args); + + if (this->n_args < 3) + goto no_factory; + + return this; + +no_factory: + *err = spa_aprintf("%s requires [= ...]", this->args[0]); + pw_free_strv(this->args); + free(impl); return NULL; no_mem: *err = spa_aprintf("alloc failed: %m"); @@ -289,6 +346,7 @@ static struct pw_command *parse_command_exec(struct pw_properties *properties, c no_executable: *err = spa_aprintf("requires an executable name"); pw_free_strv(this->args); + free(impl); return NULL; no_mem: *err = spa_aprintf("alloc failed: %m"); diff --git a/src/daemon/pipewire.conf.in b/src/daemon/pipewire.conf.in index 4da3a5411..8c6fcdb1f 100644 --- a/src/daemon/pipewire.conf.in +++ b/src/daemon/pipewire.conf.in @@ -21,6 +21,7 @@ add-spa-lib api.bluez5.* bluez5/libspa-bluez5 add-spa-lib api.vulkan.* vulkan/libspa-vulkan add-spa-lib api.jack.* jack/libspa-jack #add-spa-lib videotestsrc videotestsrc/libspa-videotestsrc +#add-spa-lib audiotestsrc audiotestsrc/libspa-audiotestsrc #load-module -ifexists libpipewire-module-spa-device api.jack.device #load-module libpipewire-module-spa-device api.alsa.enum.udev @@ -39,4 +40,7 @@ load-module libpipewire-module-access load-module libpipewire-module-adapter load-module libpipewire-module-link-factory load-module libpipewire-module-session-manager + +#create-object adapter node.name=my-test factory.name=audiotestsrc + exec pipewire-media-session