mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	node_factory -> factory
Rename the node-factory to a more generic object factory. Add type and version to create objects from a factory Start on factory introspection
This commit is contained in:
		
							parent
							
								
									3c1957fd9d
								
							
						
					
					
						commit
						7f20e04803
					
				
					 24 changed files with 472 additions and 325 deletions
				
			
		| 
						 | 
				
			
			@ -34,36 +34,54 @@
 | 
			
		|||
struct pw_protocol *pw_protocol_native_ext_client_node_init(struct pw_core *core);
 | 
			
		||||
 | 
			
		||||
struct factory_data {
 | 
			
		||||
	struct pw_node_factory *this;
 | 
			
		||||
	struct pw_factory *this;
 | 
			
		||||
	struct pw_properties *properties;
 | 
			
		||||
 | 
			
		||||
	struct spa_hook module_listener;
 | 
			
		||||
	uint32_t type_client_node;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static struct pw_node *create_node(void *_data,
 | 
			
		||||
				   struct pw_resource *resource,
 | 
			
		||||
				   const char *name,
 | 
			
		||||
				   struct pw_properties *properties)
 | 
			
		||||
static void *create_object(void *_data,
 | 
			
		||||
			   struct pw_resource *resource,
 | 
			
		||||
			   uint32_t type,
 | 
			
		||||
			   uint32_t version,
 | 
			
		||||
			   struct pw_properties *properties,
 | 
			
		||||
			   uint32_t new_id)
 | 
			
		||||
{
 | 
			
		||||
	struct pw_client_node *node;
 | 
			
		||||
	struct pw_resource *node_resource;
 | 
			
		||||
 | 
			
		||||
	node = pw_client_node_new(resource, name, properties);
 | 
			
		||||
	if (resource == NULL)
 | 
			
		||||
		goto no_resource;
 | 
			
		||||
 | 
			
		||||
	node_resource = pw_resource_new(pw_resource_get_client(resource),
 | 
			
		||||
					new_id, PW_PERM_RWX, type, version, 0);
 | 
			
		||||
	if (node_resource == NULL)
 | 
			
		||||
		goto no_mem;
 | 
			
		||||
 | 
			
		||||
	node = pw_client_node_new(node_resource, properties);
 | 
			
		||||
	if (node == NULL)
 | 
			
		||||
		goto no_mem;
 | 
			
		||||
 | 
			
		||||
	return node->node;
 | 
			
		||||
	return node;
 | 
			
		||||
 | 
			
		||||
      no_resource:
 | 
			
		||||
	pw_log_error("client-node needs a resource");
 | 
			
		||||
	pw_resource_error(resource, SPA_RESULT_INVALID_ARGUMENTS, "no resource");
 | 
			
		||||
	goto done;
 | 
			
		||||
      no_mem:
 | 
			
		||||
	pw_log_error("can't create node");
 | 
			
		||||
	pw_resource_error(resource, SPA_RESULT_NO_MEMORY, "no memory");
 | 
			
		||||
	goto done;
 | 
			
		||||
      done:
 | 
			
		||||
	if (properties)
 | 
			
		||||
		pw_properties_free(properties);
 | 
			
		||||
	return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static const struct pw_node_factory_implementation impl_factory = {
 | 
			
		||||
	PW_VERSION_NODE_FACRORY_IMPLEMENTATION,
 | 
			
		||||
	.create_node = create_node,
 | 
			
		||||
static const struct pw_factory_implementation impl_factory = {
 | 
			
		||||
	PW_VERSION_FACTORY_IMPLEMENTATION,
 | 
			
		||||
	.create_object = create_object,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static void module_destroy(void *data)
 | 
			
		||||
| 
						 | 
				
			
			@ -75,7 +93,7 @@ static void module_destroy(void *data)
 | 
			
		|||
	if (d->properties)
 | 
			
		||||
		pw_properties_free(d->properties);
 | 
			
		||||
 | 
			
		||||
	pw_node_factory_destroy(d->this);
 | 
			
		||||
	pw_factory_destroy(d->this);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const struct pw_module_events module_events = {
 | 
			
		||||
| 
						 | 
				
			
			@ -86,26 +104,36 @@ const struct pw_module_events module_events = {
 | 
			
		|||
static bool module_init(struct pw_module *module, struct pw_properties *properties)
 | 
			
		||||
{
 | 
			
		||||
	struct pw_core *core = pw_module_get_core(module);
 | 
			
		||||
	struct pw_node_factory *factory;
 | 
			
		||||
	struct pw_type *t = pw_core_get_type(core);
 | 
			
		||||
	struct pw_factory *factory;
 | 
			
		||||
	struct factory_data *data;
 | 
			
		||||
	uint32_t type_client_node;
 | 
			
		||||
 | 
			
		||||
	factory = pw_node_factory_new(core, "client-node", sizeof(*data));
 | 
			
		||||
        type_client_node = spa_type_map_get_id(t->map, PW_TYPE_INTERFACE__ClientNode);
 | 
			
		||||
 | 
			
		||||
	factory = pw_factory_new(core,
 | 
			
		||||
				 "client-node",
 | 
			
		||||
				 type_client_node,
 | 
			
		||||
				 PW_VERSION_CLIENT_NODE,
 | 
			
		||||
				 NULL,
 | 
			
		||||
				 sizeof(*data));
 | 
			
		||||
	if (factory == NULL)
 | 
			
		||||
		return false;
 | 
			
		||||
 | 
			
		||||
	data = pw_node_factory_get_user_data(factory);
 | 
			
		||||
	data = pw_factory_get_user_data(factory);
 | 
			
		||||
	data->this = factory;
 | 
			
		||||
	data->properties = properties;
 | 
			
		||||
	data->type_client_node = type_client_node;
 | 
			
		||||
 | 
			
		||||
	pw_log_debug("module %p: new", module);
 | 
			
		||||
 | 
			
		||||
	pw_node_factory_set_implementation(factory,
 | 
			
		||||
					   &impl_factory,
 | 
			
		||||
					   data);
 | 
			
		||||
	pw_factory_set_implementation(factory,
 | 
			
		||||
				      &impl_factory,
 | 
			
		||||
				      data);
 | 
			
		||||
 | 
			
		||||
	pw_protocol_native_ext_client_node_init(core);
 | 
			
		||||
 | 
			
		||||
	pw_node_factory_export(factory, NULL, pw_module_get_global(module));
 | 
			
		||||
	pw_factory_register(factory, NULL, pw_module_get_global(module));
 | 
			
		||||
 | 
			
		||||
	pw_module_add_listener(module, &data->module_listener, &module_events, data);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1133,7 +1133,6 @@ static const struct pw_resource_events resource_events = {
 | 
			
		|||
 * \memberof pw_client_node
 | 
			
		||||
 */
 | 
			
		||||
struct pw_client_node *pw_client_node_new(struct pw_resource *resource,
 | 
			
		||||
					  const char *name,
 | 
			
		||||
					  struct pw_properties *properties)
 | 
			
		||||
{
 | 
			
		||||
	struct impl *impl;
 | 
			
		||||
| 
						 | 
				
			
			@ -1142,7 +1141,7 @@ struct pw_client_node *pw_client_node_new(struct pw_resource *resource,
 | 
			
		|||
	struct pw_core *core = pw_client_get_core(client);
 | 
			
		||||
	const struct spa_support *support;
 | 
			
		||||
	uint32_t n_support;
 | 
			
		||||
 | 
			
		||||
	const char *name = "client-node";
 | 
			
		||||
 | 
			
		||||
	impl = calloc(1, sizeof(struct impl));
 | 
			
		||||
	if (impl == NULL)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -39,7 +39,6 @@ struct pw_client_node {
 | 
			
		|||
 | 
			
		||||
struct pw_client_node *
 | 
			
		||||
pw_client_node_new(struct pw_resource *resource,
 | 
			
		||||
		   const char *name,
 | 
			
		||||
		   struct pw_properties *properties);
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -77,7 +77,6 @@ struct async_pending {
 | 
			
		|||
	bool handled;
 | 
			
		||||
	char *handle;
 | 
			
		||||
	char *factory_name;
 | 
			
		||||
	char *name;
 | 
			
		||||
	uint32_t type;
 | 
			
		||||
	uint32_t version;
 | 
			
		||||
	struct pw_properties *properties;
 | 
			
		||||
| 
						 | 
				
			
			@ -135,7 +134,6 @@ static void free_pending(struct async_pending *p)
 | 
			
		|||
	spa_list_remove(&p->link);
 | 
			
		||||
	free(p->handle);
 | 
			
		||||
	free(p->factory_name);
 | 
			
		||||
	free(p->name);
 | 
			
		||||
	if (p->properties)
 | 
			
		||||
		pw_properties_free(p->properties);
 | 
			
		||||
	free(p);
 | 
			
		||||
| 
						 | 
				
			
			@ -305,9 +303,8 @@ portal_response(DBusConnection *connection, DBusMessage *msg, void *user_data)
 | 
			
		|||
			pw_resource_do_parent(p->resource->resource,
 | 
			
		||||
					      &p->resource->override,
 | 
			
		||||
					      struct pw_core_proxy_methods,
 | 
			
		||||
					      create_node,
 | 
			
		||||
					      create_object,
 | 
			
		||||
					      p->factory_name,
 | 
			
		||||
					      p->name,
 | 
			
		||||
					      p->type,
 | 
			
		||||
					      p->version,
 | 
			
		||||
					      &p->properties->dict,
 | 
			
		||||
| 
						 | 
				
			
			@ -325,13 +322,12 @@ portal_response(DBusConnection *connection, DBusMessage *msg, void *user_data)
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void do_create_node(void *data,
 | 
			
		||||
			   const char *factory_name,
 | 
			
		||||
			   const char *name,
 | 
			
		||||
			   uint32_t type,
 | 
			
		||||
			   uint32_t version,
 | 
			
		||||
			   const struct spa_dict *props,
 | 
			
		||||
			   uint32_t new_id)
 | 
			
		||||
static void do_create_object(void *data,
 | 
			
		||||
			     const char *factory_name,
 | 
			
		||||
			     uint32_t type,
 | 
			
		||||
			     uint32_t version,
 | 
			
		||||
			     const struct spa_dict *props,
 | 
			
		||||
			     uint32_t new_id)
 | 
			
		||||
{
 | 
			
		||||
	struct resource *resource = data;
 | 
			
		||||
	struct client_info *cinfo = resource->cinfo;
 | 
			
		||||
| 
						 | 
				
			
			@ -350,9 +346,8 @@ static void do_create_node(void *data,
 | 
			
		|||
		pw_resource_do_parent(resource->resource,
 | 
			
		||||
				      &resource->override,
 | 
			
		||||
				      struct pw_core_proxy_methods,
 | 
			
		||||
				      create_node,
 | 
			
		||||
				      create_object,
 | 
			
		||||
				      factory_name,
 | 
			
		||||
				      name,
 | 
			
		||||
				      type,
 | 
			
		||||
				      version,
 | 
			
		||||
				      props,
 | 
			
		||||
| 
						 | 
				
			
			@ -411,7 +406,6 @@ static void do_create_node(void *data,
 | 
			
		|||
	p->handle = strdup(handle);
 | 
			
		||||
	p->handled = false;
 | 
			
		||||
	p->factory_name = strdup(factory_name);
 | 
			
		||||
	p->name = strdup(name);
 | 
			
		||||
	p->type = type;
 | 
			
		||||
	p->version = version;
 | 
			
		||||
	p->properties = props ? pw_properties_new_dict(props) : NULL;
 | 
			
		||||
| 
						 | 
				
			
			@ -479,7 +473,7 @@ do_create_link(void *data,
 | 
			
		|||
 | 
			
		||||
static const struct pw_core_proxy_methods core_override = {
 | 
			
		||||
	PW_VERSION_CORE_PROXY_METHODS,
 | 
			
		||||
	.create_node = do_create_node,
 | 
			
		||||
	.create_object = do_create_object,
 | 
			
		||||
	.create_link = do_create_link,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -82,10 +82,10 @@ static void core_marshal_get_registry(void *object, uint32_t version, uint32_t n
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
core_marshal_create_node(void *object,
 | 
			
		||||
			 const char *factory_name, const char *name,
 | 
			
		||||
			 uint32_t type, uint32_t version,
 | 
			
		||||
			 const struct spa_dict *props, uint32_t new_id)
 | 
			
		||||
core_marshal_create_object(void *object,
 | 
			
		||||
			   const char *factory_name,
 | 
			
		||||
			   uint32_t type, uint32_t version,
 | 
			
		||||
			   const struct spa_dict *props, uint32_t new_id)
 | 
			
		||||
{
 | 
			
		||||
	struct pw_proxy *proxy = object;
 | 
			
		||||
	struct spa_pod_builder *b;
 | 
			
		||||
| 
						 | 
				
			
			@ -99,7 +99,6 @@ core_marshal_create_node(void *object,
 | 
			
		|||
	spa_pod_builder_add(b,
 | 
			
		||||
			    SPA_POD_TYPE_STRUCT, &f,
 | 
			
		||||
			    SPA_POD_TYPE_STRING, factory_name,
 | 
			
		||||
			    SPA_POD_TYPE_STRING, name,
 | 
			
		||||
			    SPA_POD_TYPE_ID, type,
 | 
			
		||||
			    SPA_POD_TYPE_INT, version,
 | 
			
		||||
			    SPA_POD_TYPE_INT, n_items, 0);
 | 
			
		||||
| 
						 | 
				
			
			@ -430,18 +429,17 @@ static bool core_demarshal_get_registry(void *object, void *data, size_t size)
 | 
			
		|||
	return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static bool core_demarshal_create_node(void *object, void *data, size_t size)
 | 
			
		||||
static bool core_demarshal_create_object(void *object, void *data, size_t size)
 | 
			
		||||
{
 | 
			
		||||
	struct pw_resource *resource = object;
 | 
			
		||||
	struct spa_pod_iter it;
 | 
			
		||||
	uint32_t version, type, new_id, i;
 | 
			
		||||
	const char *factory_name, *name;
 | 
			
		||||
	const char *factory_name;
 | 
			
		||||
	struct spa_dict props;
 | 
			
		||||
 | 
			
		||||
	if (!spa_pod_iter_struct(&it, data, size) ||
 | 
			
		||||
	    !spa_pod_iter_get(&it,
 | 
			
		||||
			      SPA_POD_TYPE_STRING, &factory_name,
 | 
			
		||||
			      SPA_POD_TYPE_STRING, &name,
 | 
			
		||||
			      SPA_POD_TYPE_ID, &type,
 | 
			
		||||
			      SPA_POD_TYPE_INT, &version,
 | 
			
		||||
			      SPA_POD_TYPE_INT, &props.n_items, 0))
 | 
			
		||||
| 
						 | 
				
			
			@ -458,7 +456,7 @@ static bool core_demarshal_create_node(void *object, void *data, size_t size)
 | 
			
		|||
			      SPA_POD_TYPE_INT, &new_id, 0))
 | 
			
		||||
		return false;
 | 
			
		||||
 | 
			
		||||
	pw_resource_do(resource, struct pw_core_proxy_methods, create_node, factory_name, name,
 | 
			
		||||
	pw_resource_do(resource, struct pw_core_proxy_methods, create_object, factory_name,
 | 
			
		||||
								      type, version,
 | 
			
		||||
								      &props, new_id);
 | 
			
		||||
	return true;
 | 
			
		||||
| 
						 | 
				
			
			@ -904,7 +902,7 @@ static const struct pw_core_proxy_methods pw_protocol_native_core_method_marshal
 | 
			
		|||
	&core_marshal_sync,
 | 
			
		||||
	&core_marshal_get_registry,
 | 
			
		||||
	&core_marshal_client_update,
 | 
			
		||||
	&core_marshal_create_node,
 | 
			
		||||
	&core_marshal_create_object,
 | 
			
		||||
	&core_marshal_create_link
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -913,7 +911,7 @@ static const struct pw_protocol_native_demarshal pw_protocol_native_core_method_
 | 
			
		|||
	{ &core_demarshal_sync, 0, },
 | 
			
		||||
	{ &core_demarshal_get_registry, 0, },
 | 
			
		||||
	{ &core_demarshal_client_update, 0, },
 | 
			
		||||
	{ &core_demarshal_create_node, PW_PROTOCOL_NATIVE_REMAP, },
 | 
			
		||||
	{ &core_demarshal_create_object, PW_PROTOCOL_NATIVE_REMAP, },
 | 
			
		||||
	{ &core_demarshal_create_link, PW_PROTOCOL_NATIVE_REMAP, }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -33,28 +33,34 @@
 | 
			
		|||
 | 
			
		||||
struct factory_data {
 | 
			
		||||
	struct pw_core *core;
 | 
			
		||||
	struct pw_node_factory *this;
 | 
			
		||||
	struct pw_factory *this;
 | 
			
		||||
	struct pw_properties *properties;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static struct pw_node *create_node(void *_data,
 | 
			
		||||
				   struct pw_resource *resource,
 | 
			
		||||
				   const char *name,
 | 
			
		||||
				   struct pw_properties *properties)
 | 
			
		||||
static void *create_object(void *_data,
 | 
			
		||||
			   struct pw_resource *resource,
 | 
			
		||||
			   uint32_t type,
 | 
			
		||||
			   uint32_t version,
 | 
			
		||||
			   struct pw_properties *properties,
 | 
			
		||||
			   uint32_t new_id)
 | 
			
		||||
{
 | 
			
		||||
	struct factory_data *data = _data;
 | 
			
		||||
	struct pw_node *node;
 | 
			
		||||
	const char *lib, *factory_name;
 | 
			
		||||
	const char *lib, *factory_name, *name;
 | 
			
		||||
 | 
			
		||||
	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)
 | 
			
		||||
		goto no_properties;
 | 
			
		||||
 | 
			
		||||
	if (name == NULL)
 | 
			
		||||
		name = "spa-node";
 | 
			
		||||
 | 
			
		||||
	node = pw_spa_node_load(data->core,
 | 
			
		||||
				NULL,
 | 
			
		||||
				NULL,
 | 
			
		||||
| 
						 | 
				
			
			@ -65,6 +71,12 @@ static struct pw_node *create_node(void *_data,
 | 
			
		|||
	if (node == NULL)
 | 
			
		||||
		goto no_mem;
 | 
			
		||||
 | 
			
		||||
	if (resource)
 | 
			
		||||
		pw_global_bind(pw_node_get_global(node),
 | 
			
		||||
			       pw_resource_get_client(resource),
 | 
			
		||||
			       PW_PERM_RWX,
 | 
			
		||||
			       version, new_id);
 | 
			
		||||
 | 
			
		||||
	return node;
 | 
			
		||||
 | 
			
		||||
      no_properties:
 | 
			
		||||
| 
						 | 
				
			
			@ -84,33 +96,39 @@ static struct pw_node *create_node(void *_data,
 | 
			
		|||
	return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static const struct pw_node_factory_implementation impl_factory = {
 | 
			
		||||
	PW_VERSION_NODE_FACRORY_IMPLEMENTATION,
 | 
			
		||||
	.create_node = create_node,
 | 
			
		||||
static const struct pw_factory_implementation impl_factory = {
 | 
			
		||||
	PW_VERSION_FACTORY_IMPLEMENTATION,
 | 
			
		||||
	.create_object = create_object,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static bool module_init(struct pw_module *module, struct pw_properties *properties)
 | 
			
		||||
{
 | 
			
		||||
	struct pw_core *core = pw_module_get_core(module);
 | 
			
		||||
	struct pw_node_factory *factory;
 | 
			
		||||
	struct pw_type *t = pw_core_get_type(core);
 | 
			
		||||
	struct pw_factory *factory;
 | 
			
		||||
	struct factory_data *data;
 | 
			
		||||
 | 
			
		||||
	factory = pw_node_factory_new(core, "spa-node-factory", sizeof(*data));
 | 
			
		||||
	factory = pw_factory_new(core,
 | 
			
		||||
				 "spa-node-factory",
 | 
			
		||||
				 t->node,
 | 
			
		||||
				 PW_VERSION_NODE,
 | 
			
		||||
				 NULL,
 | 
			
		||||
				 sizeof(*data));
 | 
			
		||||
	if (factory == NULL)
 | 
			
		||||
		return false;
 | 
			
		||||
 | 
			
		||||
	data = pw_node_factory_get_user_data(factory);
 | 
			
		||||
	data = pw_factory_get_user_data(factory);
 | 
			
		||||
	data->this = factory;
 | 
			
		||||
	data->core = core;
 | 
			
		||||
	data->properties = properties;
 | 
			
		||||
 | 
			
		||||
	pw_log_debug("module %p: new", module);
 | 
			
		||||
 | 
			
		||||
	pw_node_factory_set_implementation(factory,
 | 
			
		||||
					   &impl_factory,
 | 
			
		||||
					   data);
 | 
			
		||||
	pw_factory_set_implementation(factory,
 | 
			
		||||
				      &impl_factory,
 | 
			
		||||
				      data);
 | 
			
		||||
 | 
			
		||||
	pw_node_factory_export(factory, NULL, pw_module_get_global(module));
 | 
			
		||||
	pw_factory_register(factory, NULL, pw_module_get_global(module));
 | 
			
		||||
 | 
			
		||||
	return true;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue