core: remove parent_id from the global event

Remove the parent_id from the global event. Remove the parent
and owner from the global object.

Use properties instead to mark parents and owners of objects.

Properties are easier to control for client exported objects and
usually a simple parent/child is not enough. For example, a client
exported node has the client as a parent but also the factory that
created the node.
This commit is contained in:
Wim Taymans 2019-08-16 22:11:42 +02:00
parent 32ce5c4deb
commit 8db4a797aa
58 changed files with 482 additions and 464 deletions

View file

@ -33,6 +33,8 @@
#include "spa-device.h"
#define NAME "spa-device-factory"
#define FACTORY_USAGE SPA_KEY_FACTORY_NAME"=<factory-name> " \
"["SPA_KEY_LIBRARY_NAME"=<library-name>]"
@ -44,8 +46,8 @@ static const struct spa_dict_item module_props[] = {
struct factory_data {
struct pw_core *core;
struct pw_module *module;
struct pw_factory *this;
struct pw_properties *properties;
struct spa_hook factory_listener;
struct spa_hook module_listener;
@ -93,8 +95,6 @@ static void *create_object(void *_data,
goto error_properties;
device = pw_spa_device_load(core,
NULL,
pw_factory_get_global(data->this),
factory_name,
0,
properties,
@ -148,9 +148,6 @@ static void factory_destroy(void *_data)
spa_list_consume(nd, &data->device_list, link)
pw_device_destroy(nd->device);
if (data->properties)
pw_properties_free(data->properties);
}
static const struct pw_factory_events factory_events = {
@ -164,17 +161,36 @@ static void module_destroy(void *_data)
pw_factory_destroy(data->this);
}
static void module_registered(void *data)
{
struct factory_data *d = data;
struct pw_module *module = d->module;
struct pw_factory *factory = d->this;
struct spa_dict_item items[1];
char id[16];
int res;
snprintf(id, sizeof(id), "%d", pw_global_get_id(pw_module_get_global(module)));
items[0] = SPA_DICT_ITEM_INIT(PW_KEY_MODULE_ID, id);
pw_factory_update_properties(factory, &SPA_DICT_INIT(items, 1));
if ((res = pw_factory_register(factory, NULL)) < 0) {
pw_log_error(NAME" %p: can't register factory: %s", factory, spa_strerror(res));
}
}
static const struct pw_module_events module_events = {
PW_VERSION_MODULE_EVENTS,
.destroy = module_destroy,
.registered = module_registered,
};
static int module_init(struct pw_module *module, struct pw_properties *properties)
SPA_EXPORT
int pipewire__module_init(struct pw_module *module, const char *args)
{
struct pw_core *core = pw_module_get_core(module);
struct pw_factory *factory;
struct factory_data *data;
int res;
factory = pw_factory_new(core,
"spa-device-factory",
@ -187,33 +203,17 @@ static int module_init(struct pw_module *module, struct pw_properties *propertie
data = pw_factory_get_user_data(factory);
data->this = factory;
data->module = module;
data->core = core;
data->properties = properties;
spa_list_init(&data->device_list);
pw_factory_add_listener(factory, &data->factory_listener, &factory_events, data);
pw_factory_set_implementation(factory, &factory_impl, data);
pw_log_debug("module %p: new", module);
pw_module_add_listener(module, &data->module_listener, &module_events, data);
pw_module_update_properties(module, &SPA_DICT_INIT_ARRAY(module_props));
if ((res = pw_factory_register(factory,
NULL,
pw_module_get_global(module),
NULL)) < 0)
goto error_register;
pw_module_add_listener(module, &data->module_listener, &module_events, data);
return 0;
error_register:
pw_factory_destroy(factory);
return res;
}
SPA_EXPORT
int pipewire__module_init(struct pw_module *module, const char *args)
{
return module_init(module, NULL);
}

View file

@ -95,8 +95,6 @@ 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],
0,
props,

View file

@ -93,7 +93,6 @@ int pipewire__module_init(struct pw_module *module, const char *args)
}
monitor = pw_spa_monitor_load(core,
pw_module_get_global(module),
argv[0], argv[1],
props,
sizeof(struct data));

View file

@ -33,6 +33,8 @@
#include "spa-node.h"
#define NAME "spa-node-factory"
#define FACTORY_USAGE SPA_KEY_FACTORY_NAME"=<factory-name> " \
"["SPA_KEY_LIBRARY_NAME"=<library-name>]"
@ -45,7 +47,7 @@ static const struct spa_dict_item module_props[] = {
struct factory_data {
struct pw_core *core;
struct pw_factory *this;
struct pw_properties *properties;
struct pw_module *module;
struct spa_hook factory_listener;
struct spa_hook module_listener;
@ -110,9 +112,10 @@ static void *create_object(void *_data,
if (factory_name == NULL)
goto error_properties;
pw_properties_setf(properties, PW_KEY_FACTORY_ID, "%d",
pw_global_get_id(pw_factory_get_global(data->this)));
node = pw_spa_node_load(core,
NULL,
pw_factory_get_global(data->this),
factory_name,
PW_SPA_NODE_FLAG_ACTIVATE,
properties,
@ -183,9 +186,6 @@ static void factory_destroy(void *_data)
spa_list_consume(nd, &data->node_list, link)
pw_node_destroy(nd->node);
if (data->properties)
pw_properties_free(data->properties);
}
static const struct pw_factory_events factory_events = {
@ -199,17 +199,36 @@ static void module_destroy(void *_data)
pw_factory_destroy(data->this);
}
static void module_registered(void *data)
{
struct factory_data *d = data;
struct pw_module *module = d->module;
struct pw_factory *factory = d->this;
struct spa_dict_item items[1];
char id[16];
int res;
snprintf(id, sizeof(id), "%d", pw_global_get_id(pw_module_get_global(module)));
items[0] = SPA_DICT_ITEM_INIT(PW_KEY_MODULE_ID, id);
pw_factory_update_properties(factory, &SPA_DICT_INIT(items, 1));
if ((res = pw_factory_register(factory, NULL)) < 0) {
pw_log_error(NAME" %p: can't register factory: %s", factory, spa_strerror(res));
}
}
static const struct pw_module_events module_events = {
PW_VERSION_MODULE_EVENTS,
.destroy = module_destroy,
.registered = module_registered,
};
static int module_init(struct pw_module *module, struct pw_properties *properties)
SPA_EXPORT
int pipewire__module_init(struct pw_module *module, const char *args)
{
struct pw_core *core = pw_module_get_core(module);
struct pw_factory *factory;
struct factory_data *data;
int res;
factory = pw_factory_new(core,
"spa-node-factory",
@ -223,7 +242,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->properties = properties;
data->module = module;
spa_list_init(&data->node_list);
pw_factory_add_listener(factory, &data->factory_listener, &factory_events, data);
@ -234,19 +253,5 @@ static int module_init(struct pw_module *module, struct pw_properties *propertie
pw_module_update_properties(module, &SPA_DICT_INIT_ARRAY(module_props));
if ((res = pw_factory_register(factory,
NULL, pw_module_get_global(module), NULL)) < 0)
goto error_register;
return 0;
error_register:
pw_factory_destroy(factory);
return res;
}
SPA_EXPORT
int pipewire__module_init(struct pw_module *module, const char *args)
{
return module_init(module, NULL);
}

View file

@ -95,8 +95,6 @@ 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],
PW_SPA_NODE_FLAG_ACTIVATE,
props,

View file

@ -44,9 +44,6 @@
struct impl {
struct pw_device *this;
struct pw_client *owner;
struct pw_global *parent;
enum pw_spa_device_flags flags;
void *unload;
@ -77,8 +74,6 @@ static const struct pw_device_events device_events = {
struct pw_device *
pw_spa_device_new(struct pw_core *core,
struct pw_client *owner,
struct pw_global *parent,
enum pw_spa_device_flags flags,
struct spa_device *device,
struct spa_handle *handle,
@ -95,8 +90,6 @@ pw_spa_device_new(struct pw_core *core,
impl = this->user_data;
impl->this = this;
impl->owner = owner;
impl->parent = parent;
impl->device = device;
impl->handle = handle;
impl->flags = flags;
@ -108,7 +101,7 @@ pw_spa_device_new(struct pw_core *core,
pw_device_set_implementation(this, impl->device);
if (!SPA_FLAG_CHECK(impl->flags, PW_SPA_DEVICE_FLAG_NO_REGISTER)) {
if ((res = pw_device_register(this, impl->owner, impl->parent, NULL)) < 0)
if ((res = pw_device_register(this, NULL)) < 0)
goto error_register;
}
return this;
@ -126,8 +119,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 *factory_name,
enum pw_spa_device_flags flags,
struct pw_properties *properties,
@ -146,7 +137,7 @@ struct pw_device *pw_spa_device_load(struct pw_core *core,
if ((res = spa_handle_get_interface(handle, SPA_TYPE_INTERFACE_Device, &iface)) < 0)
goto error_interface;
this = pw_spa_device_new(core, owner, parent, flags,
this = pw_spa_device_new(core, flags,
iface, handle, properties, user_data_size);
if (this == NULL)
goto error_device;

View file

@ -41,8 +41,6 @@ enum pw_spa_device_flags {
struct pw_device *
pw_spa_device_new(struct pw_core *core,
struct pw_client *owner, /**< optional owner */
struct pw_global *parent, /**< optional parent */
enum pw_spa_device_flags flags,
struct spa_device *device,
struct spa_handle *handle,
@ -51,8 +49,6 @@ pw_spa_device_new(struct pw_core *core,
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 *factory_name,
enum pw_spa_device_flags flags,
struct pw_properties *properties,

View file

@ -62,7 +62,6 @@ struct impl {
struct pw_spa_monitor this;
struct pw_core *core;
struct pw_global *parent;
struct spa_list item_list;
};
@ -139,7 +138,7 @@ static struct monitor_object *add_object(struct pw_spa_monitor *this, uint32_t i
case SPA_TYPE_INTERFACE_Device:
{
struct pw_device *device;
device = pw_spa_device_new(core, NULL, impl->parent,
device = pw_spa_device_new(core,
0, iface, handle, props, 0);
pw_device_add_listener(device, &obj->object_listener,
&device_events, obj);
@ -262,7 +261,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 *factory_name,
const char *system_name,
struct pw_properties *properties,
@ -294,7 +292,6 @@ struct pw_spa_monitor *pw_spa_monitor_load(struct pw_core *core,
}
impl->core = core;
impl->parent = parent;
spa_list_init(&impl->item_list);
this = &impl->this;

View file

@ -46,7 +46,6 @@ struct pw_spa_monitor {
struct pw_spa_monitor *
pw_spa_monitor_load(struct pw_core *core,
struct pw_global *parent,
const char *factory_name,
const char *system_name,
struct pw_properties *properties,

View file

@ -46,9 +46,6 @@
struct impl {
struct pw_node *this;
struct pw_client *owner;
struct pw_global *parent;
enum pw_spa_node_flags flags;
struct spa_handle *handle;
@ -86,7 +83,7 @@ static void complete_init(struct impl *impl)
pw_node_set_active(this, true);
if (!SPA_FLAG_CHECK(impl->flags, PW_SPA_NODE_FLAG_NO_REGISTER))
pw_node_register(this, impl->owner, impl->parent, NULL);
pw_node_register(this, NULL);
else
pw_node_initialized(this);
}
@ -110,8 +107,6 @@ static const struct pw_node_events node_events = {
struct pw_node *
pw_spa_node_new(struct pw_core *core,
struct pw_client *owner,
struct pw_global *parent,
enum pw_spa_node_flags flags,
struct spa_node *node,
struct spa_handle *handle,
@ -130,8 +125,6 @@ pw_spa_node_new(struct pw_core *core,
impl = this->user_data;
impl->this = this;
impl->owner = owner;
impl->parent = parent;
impl->node = node;
impl->handle = handle;
impl->flags = flags;
@ -242,8 +235,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 *factory_name,
enum pw_spa_node_flags flags,
struct pw_properties *properties,
@ -279,7 +270,7 @@ struct pw_node *pw_spa_node_load(struct pw_core *core,
}
}
this = pw_spa_node_new(core, owner, parent, flags,
this = pw_spa_node_new(core, flags,
spa_node, handle, properties, user_data_size);
if (this == NULL) {
res = -errno;

View file

@ -42,8 +42,6 @@ enum pw_spa_node_flags {
struct pw_node *
pw_spa_node_new(struct pw_core *core,
struct pw_client *owner, /**< optional owner */
struct pw_global *parent, /**< optional parent */
enum pw_spa_node_flags flags,
struct spa_node *node,
struct spa_handle *handle,
@ -52,8 +50,6 @@ pw_spa_node_new(struct pw_core *core,
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 *factory_name,
enum pw_spa_node_flags flags,
struct pw_properties *properties,