mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-12-17 08:56:49 -05:00
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.
This commit is contained in:
parent
11fc529fa0
commit
205828a244
2 changed files with 62 additions and 0 deletions
|
|
@ -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_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_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_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);
|
static struct pw_command *parse_command_exec(struct pw_properties *properties, const char *line, char **err);
|
||||||
|
|
||||||
struct impl {
|
struct impl {
|
||||||
|
|
@ -60,6 +61,7 @@ static const struct command_parse parsers[] = {
|
||||||
{"set-prop", "Set a property", parse_command_set_prop},
|
{"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},
|
{"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},
|
{"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},
|
{"exec", "Execute a program", parse_command_exec},
|
||||||
{NULL, NULL, NULL }
|
{NULL, NULL, NULL }
|
||||||
};
|
};
|
||||||
|
|
@ -129,6 +131,7 @@ static struct pw_command *parse_command_set_prop(struct pw_properties *propertie
|
||||||
error_arguments:
|
error_arguments:
|
||||||
*err = spa_aprintf("%s requires <property-name> <value>", this->args[0]);
|
*err = spa_aprintf("%s requires <property-name> <value>", this->args[0]);
|
||||||
pw_free_strv(this->args);
|
pw_free_strv(this->args);
|
||||||
|
free(impl);
|
||||||
return NULL;
|
return NULL;
|
||||||
error_alloc:
|
error_alloc:
|
||||||
*err = spa_aprintf("alloc failed: %m");
|
*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:
|
no_library:
|
||||||
*err = spa_aprintf("%s requires <factory-regex> <library-name>", this->args[0]);
|
*err = spa_aprintf("%s requires <factory-regex> <library-name>", this->args[0]);
|
||||||
pw_free_strv(this->args);
|
pw_free_strv(this->args);
|
||||||
|
free(impl);
|
||||||
return NULL;
|
return NULL;
|
||||||
no_mem:
|
no_mem:
|
||||||
*err = spa_aprintf("alloc failed: %m");
|
*err = spa_aprintf("alloc failed: %m");
|
||||||
|
|
@ -238,6 +242,59 @@ static struct pw_command *parse_command_module_load(struct pw_properties *proper
|
||||||
no_module:
|
no_module:
|
||||||
*err = spa_aprintf("%s requires a module name", this->args[0]);
|
*err = spa_aprintf("%s requires a module name", this->args[0]);
|
||||||
pw_free_strv(this->args);
|
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 <factory-name> [<key>=<value> ...]", this->args[0]);
|
||||||
|
pw_free_strv(this->args);
|
||||||
|
free(impl);
|
||||||
return NULL;
|
return NULL;
|
||||||
no_mem:
|
no_mem:
|
||||||
*err = spa_aprintf("alloc failed: %m");
|
*err = spa_aprintf("alloc failed: %m");
|
||||||
|
|
@ -289,6 +346,7 @@ static struct pw_command *parse_command_exec(struct pw_properties *properties, c
|
||||||
no_executable:
|
no_executable:
|
||||||
*err = spa_aprintf("requires an executable name");
|
*err = spa_aprintf("requires an executable name");
|
||||||
pw_free_strv(this->args);
|
pw_free_strv(this->args);
|
||||||
|
free(impl);
|
||||||
return NULL;
|
return NULL;
|
||||||
no_mem:
|
no_mem:
|
||||||
*err = spa_aprintf("alloc failed: %m");
|
*err = spa_aprintf("alloc failed: %m");
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,7 @@ add-spa-lib api.bluez5.* bluez5/libspa-bluez5
|
||||||
add-spa-lib api.vulkan.* vulkan/libspa-vulkan
|
add-spa-lib api.vulkan.* vulkan/libspa-vulkan
|
||||||
add-spa-lib api.jack.* jack/libspa-jack
|
add-spa-lib api.jack.* jack/libspa-jack
|
||||||
#add-spa-lib videotestsrc videotestsrc/libspa-videotestsrc
|
#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 -ifexists libpipewire-module-spa-device api.jack.device
|
||||||
#load-module libpipewire-module-spa-device api.alsa.enum.udev
|
#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-adapter
|
||||||
load-module libpipewire-module-link-factory
|
load-module libpipewire-module-link-factory
|
||||||
load-module libpipewire-module-session-manager
|
load-module libpipewire-module-session-manager
|
||||||
|
|
||||||
|
#create-object adapter node.name=my-test factory.name=audiotestsrc
|
||||||
|
|
||||||
exec pipewire-media-session
|
exec pipewire-media-session
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue