mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-12-21 08:56:56 -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