diff --git a/src/modules/module-adapter.c b/src/modules/module-adapter.c index 897dc9356..cf24fc96a 100644 --- a/src/modules/module-adapter.c +++ b/src/modules/module-adapter.c @@ -53,6 +53,7 @@ struct factory_data { struct spa_list node_list; + struct pw_core *core; struct pw_module *module; struct spa_hook module_listener; }; @@ -98,15 +99,11 @@ static void *create_object(void *_data, uint32_t new_id) { struct factory_data *d = _data; - struct pw_client *client = pw_resource_get_client(resource); + struct pw_client *client; struct pw_node *adapter, *slave; const char *factory_name; int res; struct node_data *nd; - struct pw_resource *bound_resource; - - if (resource == NULL) - goto error_resource; if (properties == NULL) goto error_properties; @@ -115,7 +112,7 @@ static void *create_object(void *_data, if (factory_name == NULL) goto error_properties; - slave = pw_spa_node_load(client->core, + slave = pw_spa_node_load(d->core, NULL, pw_factory_get_global(d->this), factory_name, @@ -144,29 +141,30 @@ static void *create_object(void *_data, nd->adapter = adapter; spa_list_append(&d->node_list, &nd->link); - client = pw_resource_get_client(resource); - - pw_node_register(adapter, client, pw_module_get_global(d->module), NULL); pw_node_add_listener(adapter, &nd->adapter_listener, &node_events, nd); - res = pw_global_bind(pw_node_get_global(adapter), client, - PW_PERM_RWX, PW_VERSION_NODE_PROXY, new_id); - if (res < 0) - goto error_bind; + client = resource ? pw_resource_get_client(resource): NULL; - if ((bound_resource = pw_client_find_resource(client, new_id)) == NULL) - goto error_bind; + pw_node_register(adapter, client, pw_module_get_global(d->module), NULL); - pw_resource_add_listener(bound_resource, &nd->resource_listener, &resource_events, nd); + if (client) { + struct pw_resource *bound_resource; + + res = pw_global_bind(pw_node_get_global(adapter), client, + PW_PERM_RWX, PW_VERSION_NODE_PROXY, new_id); + if (res < 0) + goto error_bind; + + if ((bound_resource = pw_client_find_resource(client, new_id)) == NULL) + goto error_bind; + + pw_resource_add_listener(bound_resource, &nd->resource_listener, &resource_events, nd); + } pw_node_set_active(adapter, true); return adapter; -error_resource: - res = -EINVAL; - pw_log_error("adapter needs a resource"); - goto error_cleanup; error_properties: res = -EINVAL; pw_log_error("factory %p: usage: " FACTORY_USAGE, d->this); @@ -234,6 +232,7 @@ static int module_init(struct pw_module *module, struct pw_properties *propertie data = pw_factory_get_user_data(factory); data->this = factory; + data->core = core; data->module = module; spa_list_init(&data->node_list); diff --git a/src/modules/module-adapter/adapter.c b/src/modules/module-adapter/adapter.c index 5cc18d4e8..634a9d42e 100644 --- a/src/modules/module-adapter/adapter.c +++ b/src/modules/module-adapter/adapter.c @@ -79,6 +79,8 @@ struct node { struct pw_node *node; struct spa_hook node_listener; + struct pw_node *slave; + void *user_data; enum pw_direction direction; struct pw_properties *props; @@ -160,13 +162,14 @@ static void node_destroy(void *data) struct node *n = data; struct port *p, *tmp; - pw_properties_free(n->props); spa_list_for_each_safe(p, tmp, &n->ports, link) { pw_port_set_mix(p->port, NULL, 0); spa_list_remove(&p->link); spa_handle_clear(p->spa_handle); free(p); } + pw_node_destroy(n->slave); + pw_properties_free(n->props); } static void node_port_init(void *data, struct pw_port *port) @@ -318,6 +321,7 @@ struct pw_node *pw_adapter_new(struct pw_core *core, n = pw_spa_node_get_user_data(node); n->core = core; n->node = node; + n->slave = slave; n->direction = direction; n->props = props; spa_list_init(&n->ports); diff --git a/src/modules/module-adapter/floatmix.c b/src/modules/module-adapter/floatmix.c index 5e665b9f3..eb65ef0d7 100644 --- a/src/modules/module-adapter/floatmix.c +++ b/src/modules/module-adapter/floatmix.c @@ -619,6 +619,9 @@ impl_node_port_set_io(void *object, port = GET_PORT(this, direction, port_id); + spa_log_debug(this->log, NAME " %p: port %d:%d io %d %p/%zd", this, + direction, port_id, id, data, size); + switch (id) { case SPA_IO_Buffers: port->io = data;