mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-07 13:30:09 -05:00
core: add method to add and find spa factory libraries
Make a method to add a mapping between a factory name regex and the library it is in. Add a method to find the library for a given factory name.
This commit is contained in:
parent
80488dba4a
commit
b9d9042695
3 changed files with 60 additions and 0 deletions
|
|
@ -25,6 +25,7 @@
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <regex.h>
|
||||||
|
|
||||||
#include <pipewire/log.h>
|
#include <pipewire/log.h>
|
||||||
|
|
||||||
|
|
@ -57,6 +58,11 @@ struct resource_data {
|
||||||
struct spa_hook object_listener;
|
struct spa_hook object_listener;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct factory_entry {
|
||||||
|
regex_t regex;
|
||||||
|
char *lib;
|
||||||
|
};
|
||||||
|
|
||||||
/** \endcond */
|
/** \endcond */
|
||||||
static void * registry_bind(void *object, uint32_t id,
|
static void * registry_bind(void *object, uint32_t id,
|
||||||
uint32_t type, uint32_t version, size_t user_data_size)
|
uint32_t type, uint32_t version, size_t user_data_size)
|
||||||
|
|
@ -466,6 +472,7 @@ struct pw_core *pw_core_new(struct pw_loop *main_loop,
|
||||||
this->data_loop = pw_data_loop_get_loop(this->data_loop_impl);
|
this->data_loop = pw_data_loop_get_loop(this->data_loop_impl);
|
||||||
this->main_loop = main_loop;
|
this->main_loop = main_loop;
|
||||||
|
|
||||||
|
pw_array_init(&this->factory_lib, 32);
|
||||||
pw_map_init(&this->globals, 128, 32);
|
pw_map_init(&this->globals, 128, 32);
|
||||||
|
|
||||||
this->support[0] = SPA_SUPPORT_INIT(SPA_TYPE_INTERFACE_DataLoop, this->data_loop->loop);
|
this->support[0] = SPA_SUPPORT_INIT(SPA_TYPE_INTERFACE_DataLoop, this->data_loop->loop);
|
||||||
|
|
@ -562,6 +569,7 @@ void pw_core_destroy(struct pw_core *core)
|
||||||
struct pw_remote *remote;
|
struct pw_remote *remote;
|
||||||
struct pw_resource *resource;
|
struct pw_resource *resource;
|
||||||
struct pw_node *node;
|
struct pw_node *node;
|
||||||
|
struct factory_entry *entry;
|
||||||
|
|
||||||
pw_log_debug("core %p: destroy", core);
|
pw_log_debug("core %p: destroy", core);
|
||||||
pw_core_emit_destroy(core);
|
pw_core_emit_destroy(core);
|
||||||
|
|
@ -596,6 +604,12 @@ void pw_core_destroy(struct pw_core *core)
|
||||||
if (impl->dbus_handle)
|
if (impl->dbus_handle)
|
||||||
pw_unload_spa_handle(impl->dbus_handle);
|
pw_unload_spa_handle(impl->dbus_handle);
|
||||||
|
|
||||||
|
pw_array_for_each(entry, &core->factory_lib) {
|
||||||
|
regfree(&entry->regex);
|
||||||
|
free(entry->lib);
|
||||||
|
}
|
||||||
|
pw_array_clear(&core->factory_lib);
|
||||||
|
|
||||||
pw_map_clear(&core->globals);
|
pw_map_clear(&core->globals);
|
||||||
|
|
||||||
free(core);
|
free(core);
|
||||||
|
|
@ -1050,3 +1064,42 @@ int pw_core_recalc_graph(struct pw_core *core)
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SPA_EXPORT
|
||||||
|
int pw_core_add_spa_lib(struct pw_core *core,
|
||||||
|
const char *factory_regexp, const char *lib)
|
||||||
|
{
|
||||||
|
struct factory_entry *entry;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
entry = pw_array_add(&core->factory_lib, sizeof(*entry));
|
||||||
|
if (entry == NULL)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
if ((err = regcomp(&entry->regex, factory_regexp, REG_EXTENDED | REG_NOSUB)) != 0) {
|
||||||
|
char errbuf[1024];
|
||||||
|
regerror(err, &entry->regex, errbuf, sizeof(errbuf));
|
||||||
|
pw_log_error("can compile regex: %s", errbuf);
|
||||||
|
|
||||||
|
pw_array_remove(&core->factory_lib, entry);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
entry->lib = strdup(lib);
|
||||||
|
pw_log_debug("core %p: map factory regex '%s' to '%s", core,
|
||||||
|
factory_regexp, lib);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
SPA_EXPORT
|
||||||
|
const char *pw_core_find_spa_lib(struct pw_core *core, const char *factory_name)
|
||||||
|
{
|
||||||
|
struct factory_entry *entry;
|
||||||
|
|
||||||
|
pw_array_for_each(entry, &core->factory_lib) {
|
||||||
|
if (regexec(&entry->regex, factory_name, 0, NULL, 0) == 0)
|
||||||
|
return entry->lib;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -147,6 +147,12 @@ struct pw_factory *
|
||||||
pw_core_find_factory(struct pw_core *core /**< the core */,
|
pw_core_find_factory(struct pw_core *core /**< the core */,
|
||||||
const char *name /**< the factory name */);
|
const char *name /**< the factory name */);
|
||||||
|
|
||||||
|
/** add a spa library for the given factory_name regex */
|
||||||
|
int pw_core_add_spa_lib(struct pw_core *core, const char *factory_regex, const char *lib);
|
||||||
|
|
||||||
|
/** find the library name for a spa factory */
|
||||||
|
const char * pw_core_find_spa_lib(struct pw_core *core, const char *factory_name);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -235,6 +235,7 @@ struct pw_core {
|
||||||
|
|
||||||
struct spa_support support[16]; /**< support for spa plugins */
|
struct spa_support support[16]; /**< support for spa plugins */
|
||||||
uint32_t n_support; /**< number of support items */
|
uint32_t n_support; /**< number of support items */
|
||||||
|
struct pw_array factory_lib; /**< mapping of factory_name regexp to library */
|
||||||
|
|
||||||
struct pw_client *current_client; /**< client currently executing code in mainloop */
|
struct pw_client *current_client; /**< client currently executing code in mainloop */
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue