From 1bca1b15ea41bf43b3549e44eabce23dabc50bbe Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Mon, 16 Dec 2019 10:28:18 +0100 Subject: [PATCH] context: add object store Add method to set and get typed objects from the context. This can be used to pass around context objects between modules without having to register them. --- src/examples/media-session/media-session.c | 2 + src/examples/media-session/media-session.h | 2 + src/pipewire/context.c | 51 ++++++++++++++++++++++ src/pipewire/context.h | 5 +++ src/pipewire/private.h | 2 + 5 files changed, 62 insertions(+) diff --git a/src/examples/media-session/media-session.c b/src/examples/media-session/media-session.c index c1928571a..1d4b40345 100644 --- a/src/examples/media-session/media-session.c +++ b/src/examples/media-session/media-session.c @@ -1639,6 +1639,8 @@ int main(int argc, char *argv[]) pw_context_add_spa_lib(impl.this.context, "api.alsa.*", "alsa/libspa-alsa"); pw_context_add_spa_lib(impl.this.context, "api.v4l2.*", "v4l2/libspa-v4l2"); + pw_context_set_object(impl.this.context, SM_TYPE_MEDIA_SESSION, &impl); + pw_map_init(&impl.globals, 64, 64); spa_list_init(&impl.global_list); pw_map_init(&impl.endpoint_links, 64, 64); diff --git a/src/examples/media-session/media-session.h b/src/examples/media-session/media-session.h index 0a84ab730..0a33b5829 100644 --- a/src/examples/media-session/media-session.h +++ b/src/examples/media-session/media-session.h @@ -32,6 +32,8 @@ extern "C" { #endif +#define SM_TYPE_MEDIA_SESSION PW_TYPE_INFO_OBJECT_BASE "SessionManager" + struct sm_media_session; struct sm_object_events { diff --git a/src/pipewire/context.c b/src/pipewire/context.c index 904970905..a596abf0c 100644 --- a/src/pipewire/context.c +++ b/src/pipewire/context.c @@ -203,6 +203,7 @@ struct pw_context *pw_context_new(struct pw_loop *main_loop, this->n_support = n_support; pw_array_init(&this->factory_lib, 32); + pw_array_init(&this->objects, 32); pw_map_init(&this->globals, 128, 32); spa_list_init(&this->core_impl_list); @@ -317,6 +318,8 @@ void pw_context_destroy(struct pw_context *context) } pw_array_clear(&context->factory_lib); + pw_array_clear(&context->objects); + pw_map_clear(&context->globals); free(context); @@ -889,3 +892,51 @@ const struct pw_export_type *pw_context_find_export_type(struct pw_context *cont } return NULL; } + +struct object_entry { + const char *type; + void *value; +}; + +static struct object_entry *find_object(struct pw_context *context, const char *type) +{ + struct object_entry *entry; + pw_array_for_each(entry, &context->objects) { + if (strcmp(entry->type, type) == 0) + return entry; + } + return NULL; +} + +SPA_EXPORT +int pw_context_set_object(struct pw_context *context, const char *type, void *value) +{ + struct object_entry *entry; + + entry = find_object(context, type); + + if (value == NULL) { + if (entry) + pw_array_remove(&context->objects, entry); + } else { + if (entry == NULL) { + entry = pw_array_add(&context->objects, sizeof(*entry)); + if (entry == NULL) + return -errno; + entry->type = type; + } + entry->value = value; + } + return 0; +} + +SPA_EXPORT +void *pw_context_get_object(struct pw_context *context, const char *type) +{ + struct object_entry *entry; + + if ((entry = find_object(context, type)) != NULL) + return entry->value; + + return NULL; +} diff --git a/src/pipewire/context.h b/src/pipewire/context.h index 05b3259e4..192b148b6 100644 --- a/src/pipewire/context.h +++ b/src/pipewire/context.h @@ -160,6 +160,11 @@ int pw_context_register_export_type(struct pw_context *context, struct pw_export /** find information about registered export type */ const struct pw_export_type *pw_context_find_export_type(struct pw_context *context, uint32_t type); +/** add an object to the context */ +int pw_context_set_object(struct pw_context *context, const char *type, void *value); +/** get an object from the context */ +void *pw_context_get_object(struct pw_context *context, const char *type); + #ifdef __cplusplus } #endif diff --git a/src/pipewire/private.h b/src/pipewire/private.h index 407f5c55d..53a99fb1f 100644 --- a/src/pipewire/private.h +++ b/src/pipewire/private.h @@ -258,6 +258,8 @@ struct pw_context { uint32_t n_support; /**< number of support items */ struct pw_array factory_lib; /**< mapping of factory_name regexp to library */ + struct pw_array objects; /**< objects */ + struct pw_impl_client *current_client; /**< client currently executing code in mainloop */ long sc_pagesize;