From d4def56bcb6e0d91ef68a521b29e03730c5f8bd4 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Fri, 31 May 2019 16:06:14 +0200 Subject: [PATCH] spa: don't pass library around Don't pass the library in the methods, we use the factory_name to find the object. Make it possible to override the default library with a property. --- src/modules/module-audio-dsp/audio-dsp.c | 2 +- src/modules/module-link-factory.c | 9 +++++++- src/modules/spa/module-device-factory.c | 21 +++++++----------- src/modules/spa/module-device.c | 17 +++++++------- src/modules/spa/module-monitor.c | 23 +++++++++---------- src/modules/spa/module-node-factory.c | 21 +++++++----------- src/modules/spa/module-node.c | 15 ++++++++----- src/modules/spa/spa-device.c | 22 +++++++++++++------ src/modules/spa/spa-device.h | 1 - src/modules/spa/spa-monitor.c | 28 +++++++++++++----------- src/modules/spa/spa-monitor.h | 3 --- src/modules/spa/spa-node.c | 22 ++++++++++++------- src/modules/spa/spa-node.h | 1 - 13 files changed, 99 insertions(+), 86 deletions(-) diff --git a/src/modules/module-audio-dsp/audio-dsp.c b/src/modules/module-audio-dsp/audio-dsp.c index 64d4aacea..9ce459ee3 100644 --- a/src/modules/module-audio-dsp/audio-dsp.c +++ b/src/modules/module-audio-dsp/audio-dsp.c @@ -304,9 +304,9 @@ struct pw_node *pw_audio_dsp_new(struct pw_core *core, } pw_properties_set(pr, "factory.mode", factory); factory = "audioconvert"; + pw_properties_set(pr, "spa.library.name", "audioconvert/libspa-audioconvert"); node = pw_spa_node_load(core, NULL, NULL, - "audioconvert/libspa-audioconvert", factory, node_name, PW_SPA_NODE_FLAG_ACTIVATE | PW_SPA_NODE_FLAG_NO_REGISTER, diff --git a/src/modules/module-link-factory.c b/src/modules/module-link-factory.c index ad9a465f7..a9c3b04b5 100644 --- a/src/modules/module-link-factory.c +++ b/src/modules/module-link-factory.c @@ -32,6 +32,13 @@ #include #include "pipewire/private.h" +#define FACTORY_USAGE PW_KEY_LINK_OUTPUT_NODE"= " \ + "["PW_KEY_LINK_OUTPUT_PORT"=] " \ + PW_KEY_LINK_INPUT_NODE"=] " \ + "["PW_KEY_OBJECT_LINGER"=] " \ + "["PW_KEY_LINK_PASSIVE"=]" + static const struct spa_dict_item module_props[] = { { PW_KEY_MODULE_AUTHOR, "Wim Taymans " }, { PW_KEY_MODULE_DESCRIPTION, "Allow clients to create links" }, @@ -244,7 +251,7 @@ static void *create_object(void *_data, return link; no_properties: - pw_log_error("link-factory needs properties"); + pw_log_error("link-factory usage:" FACTORY_USAGE); pw_resource_error(resource, -EINVAL, "no properties"); goto done; no_output: diff --git a/src/modules/spa/module-device-factory.c b/src/modules/spa/module-device-factory.c index 170b01e41..7f09ea552 100644 --- a/src/modules/spa/module-device-factory.c +++ b/src/modules/spa/module-device-factory.c @@ -33,6 +33,9 @@ #include "spa-device.h" +#define FACTORY_USAGE "spa.factory.name= " \ + "[spa.library.name=]" + static const struct spa_dict_item module_props[] = { { PW_KEY_MODULE_AUTHOR, "Wim Taymans " }, { PW_KEY_MODULE_DESCRIPTION, "Provide a factory to make SPA devices" }, @@ -78,28 +81,23 @@ static void *create_object(void *_data, struct factory_data *data = _data; struct pw_core *core = data->core; struct pw_device *device; - const char *lib, *factory_name, *name; + const char *factory_name, *name; struct device_data *nd; if (properties == NULL) goto no_properties; - lib = pw_properties_get(properties, "spa.library.name"); factory_name = pw_properties_get(properties, "spa.factory.name"); - name = pw_properties_get(properties, "name"); - - if (lib == NULL && factory_name != NULL) - lib = pw_core_find_spa_lib(core, factory_name); - if (lib == NULL || factory_name == NULL) + if (factory_name == NULL) goto no_properties; + name = pw_properties_get(properties, "name"); if (name == NULL) name = "spa-device"; device = pw_spa_device_load(core, NULL, pw_factory_get_global(data->this), - lib, factory_name, name, 0, @@ -123,12 +121,9 @@ static void *create_object(void *_data, return device; no_properties: - pw_log_error("needed properties: [spa.library.name=] spa.factory.name="); + pw_log_error("factory %p: usage: " FACTORY_USAGE, data->this); if (resource) { - pw_resource_error(resource, -EINVAL, - "needed properties: " - "[spa.library.name=] " - "spa.factory.name="); + pw_resource_error(resource, -EINVAL, "usage: " FACTORY_USAGE); } return NULL; no_mem: diff --git a/src/modules/spa/module-device.c b/src/modules/spa/module-device.c index c03dcc401..4c47a5188 100644 --- a/src/modules/spa/module-device.c +++ b/src/modules/spa/module-device.c @@ -38,16 +38,18 @@ #include "spa-monitor.h" #include "spa-device.h" +#define MODULE_USAGE " [key=value ...]" + static const struct spa_dict_item module_props[] = { { PW_KEY_MODULE_AUTHOR, "Wim Taymans " }, { PW_KEY_MODULE_DESCRIPTION, "Load and manage an SPA device" }, + { PW_KEY_MODULE_USAGE, MODULE_USAGE }, { PW_KEY_MODULE_VERSION, PACKAGE_VERSION }, }; struct device_data { struct pw_device *this; struct pw_core *core; - struct pw_properties *properties; struct spa_hook module_listener; }; @@ -76,12 +78,12 @@ int pipewire__module_init(struct pw_module *module, const char *args) if (args == NULL) goto wrong_arguments; - argv = pw_split_strv(args, " \t", 4, &n_tokens); - if (n_tokens < 3) + argv = pw_split_strv(args, " \t", 3, &n_tokens); + if (n_tokens < 2) goto not_enough_arguments; - if (n_tokens == 4) { - props = pw_properties_new_string(argv[3]); + if (n_tokens == 3) { + props = pw_properties_new_string(argv[2]); if (props == NULL) return -ENOMEM; } @@ -89,7 +91,7 @@ int pipewire__module_init(struct pw_module *module, const char *args) device = pw_spa_device_load(core, NULL, pw_module_get_global(module), - argv[0], argv[1], argv[2], + argv[0], argv[1], 0, props, sizeof(struct device_data)); @@ -102,7 +104,6 @@ int pipewire__module_init(struct pw_module *module, const char *args) data = pw_spa_device_get_user_data(device); data->this = device; data->core = core; - data->properties = props; pw_log_debug("module %p: new", module); pw_module_add_listener(module, &data->module_listener, &module_events, data); @@ -114,6 +115,6 @@ int pipewire__module_init(struct pw_module *module, const char *args) not_enough_arguments: pw_free_strv(argv); wrong_arguments: - pw_log_error("usage: module-spa-device [key=value ...]"); + pw_log_error("usage: module-spa-device " MODULE_USAGE); return -EINVAL; } diff --git a/src/modules/spa/module-monitor.c b/src/modules/spa/module-monitor.c index 5d20912cf..e728206ed 100644 --- a/src/modules/spa/module-monitor.c +++ b/src/modules/spa/module-monitor.c @@ -39,9 +39,12 @@ #include "spa-monitor.h" +#define MODULE_USAGE " [key=value ...]" + static const struct spa_dict_item module_props[] = { { PW_KEY_MODULE_AUTHOR, "Wim Taymans " }, { PW_KEY_MODULE_DESCRIPTION, "Manage SPA monitors" }, + { PW_KEY_MODULE_USAGE, MODULE_USAGE }, { PW_KEY_MODULE_VERSION, PACKAGE_VERSION }, }; @@ -68,7 +71,7 @@ SPA_EXPORT int pipewire__module_init(struct pw_module *module, const char *args) { struct pw_core *core = pw_module_get_core(module); - const char *dir, *lib; + struct pw_properties *props = NULL; char **argv; int n_tokens; struct pw_spa_monitor *monitor; @@ -81,18 +84,16 @@ int pipewire__module_init(struct pw_module *module, const char *args) if (n_tokens < 2) goto not_enough_arguments; - if ((dir = getenv("SPA_PLUGIN_DIR")) == NULL) - dir = PLUGINDIR; - - if (n_tokens < 3) - lib = pw_core_find_spa_lib(core, argv[0]); - else - lib = argv[2]; + if (n_tokens == 3) { + props = pw_properties_new_string(argv[2]); + if (props == NULL) + return -ENOMEM; + } monitor = pw_spa_monitor_load(core, pw_module_get_global(module), - dir, lib, argv[0], argv[1], - NULL, + argv[0], argv[1], + props, sizeof(struct data)); if (monitor == NULL) return -ENOMEM; @@ -111,6 +112,6 @@ int pipewire__module_init(struct pw_module *module, const char *args) not_enough_arguments: pw_free_strv(argv); wrong_arguments: - pw_log_error("usage: module-spa-monitor []"); + pw_log_error("usage: module-spa-monitor " MODULE_USAGE); return -EINVAL; } diff --git a/src/modules/spa/module-node-factory.c b/src/modules/spa/module-node-factory.c index 180035b71..c2de801a3 100644 --- a/src/modules/spa/module-node-factory.c +++ b/src/modules/spa/module-node-factory.c @@ -33,6 +33,9 @@ #include "spa-node.h" +#define FACTORY_USAGE "spa.factory.name= " \ + "[spa.library.name=]" + static const struct spa_dict_item module_props[] = { { PW_KEY_MODULE_AUTHOR, "Wim Taymans " }, { PW_KEY_MODULE_DESCRIPTION, "Provide a factory to make SPA nodes" }, @@ -78,28 +81,23 @@ static void *create_object(void *_data, struct factory_data *data = _data; struct pw_core *core = data->core; struct pw_node *node; - const char *lib, *factory_name, *name; + const char *factory_name, *name; struct node_data *nd; if (properties == NULL) goto no_properties; - lib = pw_properties_get(properties, "spa.library.name"); factory_name = pw_properties_get(properties, "spa.factory.name"); - name = pw_properties_get(properties, "name"); - - if (lib == NULL && factory_name != NULL) - lib = pw_core_find_spa_lib(core, factory_name); - if (lib == NULL || factory_name == NULL) + if (factory_name == NULL) goto no_properties; + name = pw_properties_get(properties, "name"); if (name == NULL) name = "spa-node"; node = pw_spa_node_load(core, NULL, pw_factory_get_global(data->this), - lib, factory_name, name, PW_SPA_NODE_FLAG_ACTIVATE, @@ -123,12 +121,9 @@ static void *create_object(void *_data, return node; no_properties: - pw_log_error("needed properties: [spa.library.name=] spa.factory.name="); + pw_log_error("factory %p: usage: " FACTORY_USAGE, data->this); if (resource) { - pw_resource_error(resource, -EINVAL, - "needed properties: " - "[spa.library.name=] " - "spa.factory.name="); + pw_resource_error(resource, -EINVAL, "usage: " FACTORY_USAGE); } return NULL; no_mem: diff --git a/src/modules/spa/module-node.c b/src/modules/spa/module-node.c index bdff2605a..96250fb07 100644 --- a/src/modules/spa/module-node.c +++ b/src/modules/spa/module-node.c @@ -40,9 +40,12 @@ #include "spa-monitor.h" #include "spa-node.h" +#define MODULE_USAGE " [key=value ...]" + static const struct spa_dict_item module_props[] = { { PW_KEY_MODULE_AUTHOR, "Wim Taymans " }, { PW_KEY_MODULE_DESCRIPTION, "Load and manage an SPA node" }, + { PW_KEY_MODULE_USAGE, MODULE_USAGE }, { PW_KEY_MODULE_VERSION, PACKAGE_VERSION }, }; @@ -78,12 +81,12 @@ int pipewire__module_init(struct pw_module *module, const char *args) if (args == NULL) goto wrong_arguments; - argv = pw_split_strv(args, " \t", 4, &n_tokens); - if (n_tokens < 3) + argv = pw_split_strv(args, " \t", 3, &n_tokens); + if (n_tokens < 2) goto not_enough_arguments; - if (n_tokens == 4) { - props = pw_properties_new_string(argv[3]); + if (n_tokens == 3) { + props = pw_properties_new_string(argv[2]); if (props == NULL) return -ENOMEM; } @@ -91,7 +94,7 @@ int pipewire__module_init(struct pw_module *module, const char *args) node = pw_spa_node_load(core, NULL, pw_module_get_global(module), - argv[0], argv[1], argv[2], + argv[0], argv[1], PW_SPA_NODE_FLAG_ACTIVATE, props, sizeof(struct node_data)); @@ -116,6 +119,6 @@ int pipewire__module_init(struct pw_module *module, const char *args) not_enough_arguments: pw_free_strv(argv); wrong_arguments: - pw_log_error("usage: module-spa-node [key=value ...]"); + pw_log_error("usage: module-spa-node " MODULE_USAGE); return -EINVAL; } diff --git a/src/modules/spa/spa-device.c b/src/modules/spa/spa-device.c index 552eab707..2756b9696 100644 --- a/src/modules/spa/spa-device.c +++ b/src/modules/spa/spa-device.c @@ -52,7 +52,6 @@ struct impl { void *unload; struct spa_handle *handle; struct spa_device *device; - char *lib; char *factory_name; struct spa_hook device_listener; @@ -70,7 +69,6 @@ static void device_destroy(void *data) spa_hook_remove(&impl->device_listener); if (impl->handle) pw_unload_spa_handle(impl->handle); - free(impl->lib); free(impl->factory_name); } @@ -126,7 +124,6 @@ void *pw_spa_device_get_user_data(struct pw_device *device) struct pw_device *pw_spa_device_load(struct pw_core *core, struct pw_client *owner, struct pw_global *parent, - const char *lib, const char *factory_name, const char *name, enum pw_spa_device_flags flags, @@ -137,31 +134,42 @@ struct pw_device *pw_spa_device_load(struct pw_core *core, struct impl *impl; struct spa_handle *handle; const struct spa_support *support; + const char *lib = NULL; uint32_t n_support; void *iface; int res; support = pw_core_get_support(core, &n_support); + if (lib == NULL && properties) + lib = pw_properties_get(properties, "spa.library.name"); + if (lib == NULL) + lib = pw_core_find_spa_lib(core, factory_name); + if (lib == NULL) + goto exit; + handle = pw_load_spa_handle(lib, factory_name, properties ? &properties->dict : NULL, n_support, support); if (handle == NULL) - goto open_failed; + goto exit; if ((res = spa_handle_get_interface(handle, SPA_TYPE_INTERFACE_Device, &iface)) < 0) { pw_log_error("can't get device interface %d\n", res); - goto open_failed; + goto exit_unload; } this = pw_spa_device_new(core, owner, parent, name, flags, iface, handle, properties, user_data_size); + if (this == NULL) + goto exit; impl = this->user_data; - impl->lib = strdup(lib); impl->factory_name = strdup(factory_name); return this; - open_failed: +exit_unload: + pw_unload_spa_handle(handle); +exit: return NULL; } diff --git a/src/modules/spa/spa-device.h b/src/modules/spa/spa-device.h index b187180d3..90508f258 100644 --- a/src/modules/spa/spa-device.h +++ b/src/modules/spa/spa-device.h @@ -54,7 +54,6 @@ struct pw_device * pw_spa_device_load(struct pw_core *core, struct pw_client *owner, /**< optional owner */ struct pw_global *parent, /**< optional parent */ - const char *lib, const char *factory_name, const char *name, enum pw_spa_device_flags flags, diff --git a/src/modules/spa/spa-monitor.c b/src/modules/spa/spa-monitor.c index 435d15354..16c794250 100644 --- a/src/modules/spa/spa-monitor.c +++ b/src/modules/spa/spa-monitor.c @@ -264,8 +264,6 @@ static const struct spa_monitor_callbacks callbacks = { struct pw_spa_monitor *pw_spa_monitor_load(struct pw_core *core, struct pw_global *parent, - const char *dir, - const char *lib, const char *factory_name, const char *system_name, struct pw_properties *properties, @@ -274,13 +272,18 @@ struct pw_spa_monitor *pw_spa_monitor_load(struct pw_core *core, struct impl *impl; struct pw_spa_monitor *this; struct spa_handle *handle; + const char *lib = NULL; int res; void *iface; - char *filename; const struct spa_support *support; uint32_t n_support; - asprintf(&filename, "%s/%s.so", dir, lib); + if (lib == NULL && properties) + lib = pw_properties_get(properties, "spa.library.name"); + if (lib == NULL) + lib = pw_core_find_spa_lib(core, factory_name); + if (lib == NULL) + goto exit; support = pw_core_get_support(core, &n_support); @@ -289,20 +292,23 @@ struct pw_spa_monitor *pw_spa_monitor_load(struct pw_core *core, properties ? &properties->dict : NULL, n_support, support); if (handle == NULL) - goto no_mem; + goto exit; if ((res = spa_handle_get_interface(handle, SPA_TYPE_INTERFACE_Monitor, &iface)) < 0) { pw_log_error("can't get MONITOR interface: %d", res); - goto interface_failed; + goto exit_unload; } impl = calloc(1, sizeof(struct impl) + user_data_size); + if (impl == NULL) + goto exit_unload; + impl->core = core; impl->parent = parent; + spa_list_init(&impl->item_list); this = &impl->this; this->monitor = iface; - this->lib = filename; this->factory_name = strdup(factory_name); this->system_name = strdup(system_name); this->handle = handle; @@ -313,16 +319,13 @@ struct pw_spa_monitor *pw_spa_monitor_load(struct pw_core *core, update_monitor(core, this->system_name); - spa_list_init(&impl->item_list); - spa_monitor_set_callbacks(this->monitor, &callbacks, impl); return this; - interface_failed: +exit_unload: pw_unload_spa_handle(handle); - no_mem: - free(filename); +exit: return NULL; } @@ -338,7 +341,6 @@ void pw_spa_monitor_destroy(struct pw_spa_monitor *monitor) destroy_object(obj); pw_unload_spa_handle(monitor->handle); - free(monitor->lib); free(monitor->factory_name); free(monitor->system_name); if (monitor->properties) diff --git a/src/modules/spa/spa-monitor.h b/src/modules/spa/spa-monitor.h index a69610009..a55b36f7a 100644 --- a/src/modules/spa/spa-monitor.h +++ b/src/modules/spa/spa-monitor.h @@ -36,7 +36,6 @@ extern "C" { struct pw_spa_monitor { struct spa_monitor *monitor; - char *lib; char *factory_name; char *system_name; struct spa_handle *handle; @@ -48,8 +47,6 @@ struct pw_spa_monitor { struct pw_spa_monitor * pw_spa_monitor_load(struct pw_core *core, struct pw_global *parent, - const char *dir, - const char *lib, const char *factory_name, const char *system_name, struct pw_properties *properties, diff --git a/src/modules/spa/spa-node.c b/src/modules/spa/spa-node.c index 29091beee..0e587700a 100644 --- a/src/modules/spa/spa-node.c +++ b/src/modules/spa/spa-node.c @@ -53,7 +53,6 @@ struct impl { struct spa_handle *handle; struct spa_node *node; /**< handle to SPA node */ - char *lib; char *factory_name; struct spa_hook node_listener; @@ -75,7 +74,6 @@ static void spa_node_free(void *data) if (impl->handle) { pw_unload_spa_handle(impl->handle); } - free(impl->lib); free(impl->factory_name); } @@ -242,7 +240,6 @@ setup_props(struct pw_core *core, struct spa_node *spa_node, struct pw_propertie struct pw_node *pw_spa_node_load(struct pw_core *core, struct pw_client *owner, struct pw_global *parent, - const char *lib, const char *factory_name, const char *name, enum pw_spa_node_flags flags, @@ -252,12 +249,20 @@ struct pw_node *pw_spa_node_load(struct pw_core *core, struct pw_node *this; struct impl *impl; struct spa_node *spa_node; + const char *lib = NULL; int res; struct spa_handle *handle; void *iface; const struct spa_support *support; uint32_t n_support; + if (lib == NULL && properties) + lib = pw_properties_get(properties, "spa.library.name"); + if (lib == NULL) + lib = pw_core_find_spa_lib(core, factory_name); + if (lib == NULL) + goto exit; + support = pw_core_get_support(core, &n_support); handle = pw_load_spa_handle(lib, @@ -265,11 +270,11 @@ struct pw_node *pw_spa_node_load(struct pw_core *core, properties ? &properties->dict : NULL, n_support, support); if (handle == NULL) - goto no_mem; + goto exit; if ((res = spa_handle_get_interface(handle, SPA_TYPE_INTERFACE_Node, &iface)) < 0) { pw_log_error("can't get node interface %d", res); - goto interface_failed; + goto exit_unload; } if (SPA_RESULT_IS_ASYNC(res)) flags |= PW_SPA_NODE_FLAG_ASYNC; @@ -284,16 +289,17 @@ struct pw_node *pw_spa_node_load(struct pw_core *core, this = pw_spa_node_new(core, owner, parent, name, flags, spa_node, handle, properties, user_data_size); + if (this == NULL) + goto exit; impl = this->user_data; impl->handle = handle; - impl->lib = strdup(lib); impl->factory_name = strdup(factory_name); return this; - interface_failed: +exit_unload: pw_unload_spa_handle(handle); - no_mem: +exit: return NULL; } diff --git a/src/modules/spa/spa-node.h b/src/modules/spa/spa-node.h index 6f07bb30b..70eb85475 100644 --- a/src/modules/spa/spa-node.h +++ b/src/modules/spa/spa-node.h @@ -55,7 +55,6 @@ struct pw_node * pw_spa_node_load(struct pw_core *core, struct pw_client *owner, /**< optional owner */ struct pw_global *parent, /**< optional parent */ - const char *lib, const char *factory_name, const char *name, enum pw_spa_node_flags flags,