mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-04 13:30:12 -05:00
pulse-server: make some modules load-once
Add mechanism for allowing some modules to be loaded only once. Mark always-sink, raop-discover, switch-on-connect, zeroconf-discover as such.
This commit is contained in:
parent
f5d47c079e
commit
01a83a1362
2 changed files with 41 additions and 22 deletions
|
|
@ -260,30 +260,30 @@ bool module_args_parse_bool(const char *v)
|
||||||
#include "modules/registry.h"
|
#include "modules/registry.h"
|
||||||
|
|
||||||
static const struct module_info module_list[] = {
|
static const struct module_info module_list[] = {
|
||||||
{ "module-always-sink", create_module_always_sink, },
|
{ "module-always-sink", 1, create_module_always_sink, },
|
||||||
{ "module-combine-sink", create_module_combine_sink, },
|
{ "module-combine-sink", 0, create_module_combine_sink, },
|
||||||
{ "module-echo-cancel", create_module_echo_cancel, },
|
{ "module-echo-cancel", 0, create_module_echo_cancel, },
|
||||||
{ "module-ladspa-sink", create_module_ladspa_sink, },
|
{ "module-ladspa-sink", 0, create_module_ladspa_sink, },
|
||||||
{ "module-ladspa-source", create_module_ladspa_source, },
|
{ "module-ladspa-source", 0, create_module_ladspa_source, },
|
||||||
{ "module-loopback", create_module_loopback, },
|
{ "module-loopback", 0, create_module_loopback, },
|
||||||
{ "module-null-sink", create_module_null_sink, },
|
{ "module-null-sink", 0, create_module_null_sink, },
|
||||||
{ "module-native-protocol-tcp", create_module_native_protocol_tcp, },
|
{ "module-native-protocol-tcp", 0, create_module_native_protocol_tcp, },
|
||||||
{ "module-pipe-source", create_module_pipe_source, },
|
{ "module-pipe-source", 0, create_module_pipe_source, },
|
||||||
{ "module-pipe-sink", create_module_pipe_sink, },
|
{ "module-pipe-sink", 0, create_module_pipe_sink, },
|
||||||
{ "module-raop-discover", create_module_raop_discover, },
|
{ "module-raop-discover", 1, create_module_raop_discover, },
|
||||||
{ "module-remap-sink", create_module_remap_sink, },
|
{ "module-remap-sink", 0, create_module_remap_sink, },
|
||||||
{ "module-remap-source", create_module_remap_source, },
|
{ "module-remap-source", 0, create_module_remap_source, },
|
||||||
{ "module-simple-protocol-tcp", create_module_simple_protocol_tcp, },
|
{ "module-simple-protocol-tcp", 0, create_module_simple_protocol_tcp, },
|
||||||
{ "module-switch-on-connect", create_module_switch_on_connect, },
|
{ "module-switch-on-connect", 1, create_module_switch_on_connect, },
|
||||||
{ "module-tunnel-sink", create_module_tunnel_sink, },
|
{ "module-tunnel-sink", 0, create_module_tunnel_sink, },
|
||||||
{ "module-tunnel-source", create_module_tunnel_source, },
|
{ "module-tunnel-source", 0, create_module_tunnel_source, },
|
||||||
{ "module-zeroconf-discover", create_module_zeroconf_discover, },
|
{ "module-zeroconf-discover", 1, create_module_zeroconf_discover, },
|
||||||
#ifdef HAVE_AVAHI
|
#ifdef HAVE_AVAHI
|
||||||
{ "module-zeroconf-publish", create_module_zeroconf_publish, },
|
{ "module-zeroconf-publish", 0, create_module_zeroconf_publish, },
|
||||||
#endif
|
#endif
|
||||||
{ "module-roc-sink", create_module_roc_sink, },
|
{ "module-roc-sink", 0, create_module_roc_sink, },
|
||||||
{ "module-roc-source", create_module_roc_source, },
|
{ "module-roc-source", 0, create_module_roc_source, },
|
||||||
{ "module-x11-bell", create_module_x11_bell, },
|
{ "module-x11-bell", 0, create_module_x11_bell, },
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct module_info *find_module_info(const char *name)
|
static const struct module_info *find_module_info(const char *name)
|
||||||
|
|
@ -298,6 +298,13 @@ static const struct module_info *find_module_info(const char *name)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int find_module_by_name(void *item_data, void *data)
|
||||||
|
{
|
||||||
|
const char *name = data;
|
||||||
|
const struct module *module = item_data;
|
||||||
|
return spa_streq(module->name, name) ? 1 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
struct module *module_create(struct client *client, const char *name, const char *args)
|
struct module *module_create(struct client *client, const char *name, const char *args)
|
||||||
{
|
{
|
||||||
struct impl *impl = client->impl;
|
struct impl *impl = client->impl;
|
||||||
|
|
@ -309,6 +316,17 @@ struct module *module_create(struct client *client, const char *name, const char
|
||||||
errno = ENOENT;
|
errno = ENOENT;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (info->load_once) {
|
||||||
|
int exists;
|
||||||
|
exists = pw_map_for_each(&impl->modules, find_module_by_name,
|
||||||
|
(void *)name);
|
||||||
|
if (exists) {
|
||||||
|
errno = EEXIST;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
module = info->create(impl, args);
|
module = info->create(impl, args);
|
||||||
if (module == NULL)
|
if (module == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
|
||||||
|
|
@ -37,6 +37,7 @@ struct pw_properties;
|
||||||
|
|
||||||
struct module_info {
|
struct module_info {
|
||||||
const char *name;
|
const char *name;
|
||||||
|
unsigned int load_once:1;
|
||||||
struct module *(*create) (struct impl *impl, const char *args);
|
struct module *(*create) (struct impl *impl, const char *args);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue