mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	pulse-server: pass already created module object to module_info::create()
				
					
				
			All modules need to manually create a `module` object and check if it was successfully created. The same with argument parsing. To simplify modules, move the module object creation and argument parsing into `module_create()`, and pass the already initialized module to `module_info::create()`. The semantics of `module_info::create()` are kept, that is, if it fails, `module_info::unload()` will not be called.
This commit is contained in:
		
							parent
							
								
									5ad52bb88a
								
							
						
					
					
						commit
						fa3a28ab68
					
				
					 25 changed files with 210 additions and 548 deletions
				
			
		| 
						 | 
				
			
			@ -59,16 +59,17 @@ void module_schedule_unload(struct module *module)
 | 
			
		|||
	module->unloading = true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct module *module_new(struct impl *impl, size_t user_data)
 | 
			
		||||
static struct module *module_new(struct impl *impl, const struct module_info *info)
 | 
			
		||||
{
 | 
			
		||||
	struct module *module;
 | 
			
		||||
 | 
			
		||||
	module = calloc(1, sizeof(struct module) + user_data);
 | 
			
		||||
	module = calloc(1, sizeof(*module) + info->data_size);
 | 
			
		||||
	if (module == NULL)
 | 
			
		||||
		return NULL;
 | 
			
		||||
 | 
			
		||||
	module->index = SPA_ID_INVALID;
 | 
			
		||||
	module->impl = impl;
 | 
			
		||||
	module->info = info;
 | 
			
		||||
	spa_hook_list_init(&module->listener_list);
 | 
			
		||||
	module->user_data = SPA_PTROFF(module, sizeof(*module), void);
 | 
			
		||||
	module->loaded = false;
 | 
			
		||||
| 
						 | 
				
			
			@ -304,17 +305,34 @@ struct module *module_create(struct client *client, const char *name, const char
 | 
			
		|||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	module = info->create(impl, args);
 | 
			
		||||
	module = module_new(impl, info);
 | 
			
		||||
	if (module == NULL)
 | 
			
		||||
		return NULL;
 | 
			
		||||
 | 
			
		||||
	module->info = info;
 | 
			
		||||
	module->props = pw_properties_new(NULL, NULL);
 | 
			
		||||
	if (module->props == NULL) {
 | 
			
		||||
		module_free(module);
 | 
			
		||||
		return NULL;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (args)
 | 
			
		||||
		module_args_add_props(module->props, args);
 | 
			
		||||
 | 
			
		||||
	int res = module->info->create(module);
 | 
			
		||||
	if (res < 0) {
 | 
			
		||||
		module_free(module);
 | 
			
		||||
		errno = -res;
 | 
			
		||||
		return NULL;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	module->index = pw_map_insert_new(&impl->modules, module);
 | 
			
		||||
	if (module->index == SPA_ID_INVALID) {
 | 
			
		||||
		module_unload(module);
 | 
			
		||||
		return NULL;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	module->args = args ? strdup(args) : NULL;
 | 
			
		||||
	module->index |= MODULE_FLAG;
 | 
			
		||||
 | 
			
		||||
	return module;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -40,11 +40,12 @@ struct module_info {
 | 
			
		|||
 | 
			
		||||
	unsigned int load_once:1;
 | 
			
		||||
 | 
			
		||||
	struct module *(*create) (struct impl *impl, const char *args);
 | 
			
		||||
	int (*create) (struct module *module);
 | 
			
		||||
	int (*load) (struct client *client, struct module *module);
 | 
			
		||||
	int (*unload) (struct module *module);
 | 
			
		||||
 | 
			
		||||
	const struct spa_dict *properties;
 | 
			
		||||
	size_t data_size;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define DEFINE_MODULE_INFO(name)					\
 | 
			
		||||
| 
						 | 
				
			
			@ -79,7 +80,6 @@ struct module {
 | 
			
		|||
 | 
			
		||||
struct module *module_create(struct client *client, const char *name, const char *args);
 | 
			
		||||
void module_free(struct module *module);
 | 
			
		||||
struct module *module_new(struct impl *impl, size_t user_data);
 | 
			
		||||
int module_load(struct client *client, struct module *module);
 | 
			
		||||
int module_unload(struct module *module);
 | 
			
		||||
void module_schedule_unload(struct module *module);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -101,34 +101,14 @@ static const struct spa_dict_item module_always_sink_info[] = {
 | 
			
		|||
	{ PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct module *create_module_always_sink(struct impl *impl, const char *argument)
 | 
			
		||||
int create_module_always_sink(struct module * const module)
 | 
			
		||||
{
 | 
			
		||||
	struct module *module;
 | 
			
		||||
	struct pw_properties *props = NULL;
 | 
			
		||||
	int res;
 | 
			
		||||
 | 
			
		||||
	PW_LOG_TOPIC_INIT(mod_topic);
 | 
			
		||||
 | 
			
		||||
	props = pw_properties_new(NULL, NULL);
 | 
			
		||||
	if (props == NULL) {
 | 
			
		||||
		res = -EINVAL;
 | 
			
		||||
		goto out;
 | 
			
		||||
	}
 | 
			
		||||
	if (argument)
 | 
			
		||||
		module_args_add_props(props, argument);
 | 
			
		||||
	struct module_always_sink_data * const data = module->user_data;
 | 
			
		||||
	data->module = module;
 | 
			
		||||
 | 
			
		||||
	module = module_new(impl, sizeof(struct module_always_sink_data));
 | 
			
		||||
	if (module == NULL) {
 | 
			
		||||
		res = -errno;
 | 
			
		||||
		goto out;
 | 
			
		||||
	}
 | 
			
		||||
	module->props = props;
 | 
			
		||||
 | 
			
		||||
	return module;
 | 
			
		||||
out:
 | 
			
		||||
	pw_properties_free(props);
 | 
			
		||||
	errno = -res;
 | 
			
		||||
	return NULL;
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
DEFINE_MODULE_INFO(module_always_sink) = {
 | 
			
		||||
| 
						 | 
				
			
			@ -138,4 +118,5 @@ DEFINE_MODULE_INFO(module_always_sink) = {
 | 
			
		|||
	.load = module_always_sink_load,
 | 
			
		||||
	.unload = module_always_sink_unload,
 | 
			
		||||
	.properties = &SPA_DICT_INIT_ARRAY(module_always_sink_info),
 | 
			
		||||
	.data_size = sizeof(struct module_always_sink_data),
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -499,11 +499,10 @@ static int module_combine_sink_unload(struct module *module)
 | 
			
		|||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct module *create_module_combine_sink(struct impl *impl, const char *argument)
 | 
			
		||||
int create_module_combine_sink(struct module * const module)
 | 
			
		||||
{
 | 
			
		||||
	struct module *module;
 | 
			
		||||
	struct module_combine_sink_data *d;
 | 
			
		||||
	struct pw_properties *props = NULL;
 | 
			
		||||
	struct module_combine_sink_data * const d = module->user_data;
 | 
			
		||||
	struct pw_properties * const props = module->props;
 | 
			
		||||
	const char *str;
 | 
			
		||||
	char *sink_name = NULL, **sink_names = NULL;
 | 
			
		||||
	struct spa_audio_info_raw info = { 0 };
 | 
			
		||||
| 
						 | 
				
			
			@ -512,14 +511,6 @@ struct module *create_module_combine_sink(struct impl *impl, const char *argumen
 | 
			
		|||
 | 
			
		||||
	PW_LOG_TOPIC_INIT(mod_topic);
 | 
			
		||||
 | 
			
		||||
	props = pw_properties_new(NULL, NULL);
 | 
			
		||||
	if (!props) {
 | 
			
		||||
		res = -EINVAL;
 | 
			
		||||
		goto out;
 | 
			
		||||
	}
 | 
			
		||||
	if (argument)
 | 
			
		||||
		module_args_add_props(props, argument);
 | 
			
		||||
 | 
			
		||||
	if ((str = pw_properties_get(props, "sink_name")) != NULL) {
 | 
			
		||||
		sink_name = strdup(str);
 | 
			
		||||
		pw_properties_set(props, "sink_name", NULL);
 | 
			
		||||
| 
						 | 
				
			
			@ -542,19 +533,11 @@ struct module *create_module_combine_sink(struct impl *impl, const char *argumen
 | 
			
		|||
		pw_properties_set(props, "resample_method", NULL);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (module_args_to_audioinfo(impl, props, &info) < 0) {
 | 
			
		||||
	if (module_args_to_audioinfo(module->impl, props, &info) < 0) {
 | 
			
		||||
		res = -EINVAL;
 | 
			
		||||
		goto out;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	module = module_new(impl, sizeof(*d));
 | 
			
		||||
	if (module == NULL) {
 | 
			
		||||
		res = -errno;
 | 
			
		||||
		goto out;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	module->props = props;
 | 
			
		||||
	d = module->user_data;
 | 
			
		||||
	d->module = module;
 | 
			
		||||
	d->info = info;
 | 
			
		||||
	d->sink_name = sink_name;
 | 
			
		||||
| 
						 | 
				
			
			@ -565,13 +548,12 @@ struct module *create_module_combine_sink(struct impl *impl, const char *argumen
 | 
			
		|||
		d->streams[i].cleanup = false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return module;
 | 
			
		||||
	return 0;
 | 
			
		||||
out:
 | 
			
		||||
	pw_properties_free(props);
 | 
			
		||||
	free(sink_name);
 | 
			
		||||
	pw_free_strv(sink_names);
 | 
			
		||||
	errno = -res;
 | 
			
		||||
	return NULL;
 | 
			
		||||
 | 
			
		||||
	return res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
DEFINE_MODULE_INFO(module_combine_sink) = {
 | 
			
		||||
| 
						 | 
				
			
			@ -580,4 +562,5 @@ DEFINE_MODULE_INFO(module_combine_sink) = {
 | 
			
		|||
	.load = module_combine_sink_load,
 | 
			
		||||
	.unload = module_combine_sink_unload,
 | 
			
		||||
	.properties = &SPA_DICT_INIT_ARRAY(module_combine_sink_info),
 | 
			
		||||
	.data_size = sizeof(struct module_combine_sink_data),
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -155,27 +155,24 @@ static const struct spa_dict_item module_echo_cancel_info[] = {
 | 
			
		|||
	{ PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct module *create_module_echo_cancel(struct impl *impl, const char *argument)
 | 
			
		||||
int create_module_echo_cancel(struct module * const module)
 | 
			
		||||
{
 | 
			
		||||
	struct module *module;
 | 
			
		||||
	struct module_echo_cancel_data *d;
 | 
			
		||||
	struct pw_properties *props = NULL, *aec_props = NULL, *sink_props = NULL, *source_props = NULL;
 | 
			
		||||
	struct module_echo_cancel_data * const d = module->user_data;
 | 
			
		||||
	struct pw_properties * const props = module->props;
 | 
			
		||||
	struct pw_properties *aec_props = NULL, *sink_props = NULL, *source_props = NULL;
 | 
			
		||||
	const char *str;
 | 
			
		||||
	struct spa_audio_info_raw info = { 0 };
 | 
			
		||||
	int res;
 | 
			
		||||
 | 
			
		||||
	PW_LOG_TOPIC_INIT(mod_topic);
 | 
			
		||||
 | 
			
		||||
	props = pw_properties_new(NULL, NULL);
 | 
			
		||||
	aec_props = pw_properties_new(NULL, NULL);
 | 
			
		||||
	source_props = pw_properties_new(NULL, NULL);
 | 
			
		||||
	sink_props = pw_properties_new(NULL, NULL);
 | 
			
		||||
	if (!props ||!aec_props || !source_props || !sink_props) {
 | 
			
		||||
	if (!aec_props || !source_props || !sink_props) {
 | 
			
		||||
		res = -EINVAL;
 | 
			
		||||
		goto out;
 | 
			
		||||
	}
 | 
			
		||||
	if (argument)
 | 
			
		||||
		module_args_add_props(props, argument);
 | 
			
		||||
 | 
			
		||||
	if ((str = pw_properties_get(props, "source_name")) != NULL) {
 | 
			
		||||
		pw_properties_set(source_props, PW_KEY_NODE_NAME, str);
 | 
			
		||||
| 
						 | 
				
			
			@ -208,7 +205,7 @@ struct module *create_module_echo_cancel(struct impl *impl, const char *argument
 | 
			
		|||
		pw_properties_set(props, "sink_master", NULL);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (module_args_to_audioinfo(impl, props, &info) < 0) {
 | 
			
		||||
	if (module_args_to_audioinfo(module->impl, props, &info) < 0) {
 | 
			
		||||
		res = -EINVAL;
 | 
			
		||||
		goto out;
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -233,29 +230,19 @@ struct module *create_module_echo_cancel(struct impl *impl, const char *argument
 | 
			
		|||
		pw_properties_set(props, "aec_args", NULL);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	module = module_new(impl, sizeof(*d));
 | 
			
		||||
	if (module == NULL) {
 | 
			
		||||
		res = -errno;
 | 
			
		||||
		goto out;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	module->props = props;
 | 
			
		||||
	d = module->user_data;
 | 
			
		||||
	d->module = module;
 | 
			
		||||
	d->props = aec_props;
 | 
			
		||||
	d->source_props = source_props;
 | 
			
		||||
	d->sink_props = sink_props;
 | 
			
		||||
	d->info = info;
 | 
			
		||||
 | 
			
		||||
	return module;
 | 
			
		||||
	return 0;
 | 
			
		||||
out:
 | 
			
		||||
	pw_properties_free(props);
 | 
			
		||||
	pw_properties_free(aec_props);
 | 
			
		||||
	pw_properties_free(sink_props);
 | 
			
		||||
	pw_properties_free(source_props);
 | 
			
		||||
	errno = -res;
 | 
			
		||||
 | 
			
		||||
	return NULL;
 | 
			
		||||
	return res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
DEFINE_MODULE_INFO(module_echo_cancel) = {
 | 
			
		||||
| 
						 | 
				
			
			@ -264,4 +251,5 @@ DEFINE_MODULE_INFO(module_echo_cancel) = {
 | 
			
		|||
	.load = module_echo_cancel_load,
 | 
			
		||||
	.unload = module_echo_cancel_unload,
 | 
			
		||||
	.properties = &SPA_DICT_INIT_ARRAY(module_echo_cancel_info),
 | 
			
		||||
	.data_size = sizeof(struct module_echo_cancel_data),
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -177,11 +177,11 @@ static void position_to_props(struct spa_audio_info_raw *info, struct pw_propert
 | 
			
		|||
	pw_properties_set(props, SPA_KEY_AUDIO_POSITION, s);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct module *create_module_ladspa_sink(struct impl *impl, const char *argument)
 | 
			
		||||
int create_module_ladspa_sink(struct module * const module)
 | 
			
		||||
{
 | 
			
		||||
	struct module *module;
 | 
			
		||||
	struct module_ladspa_sink_data *d;
 | 
			
		||||
	struct pw_properties *props = NULL, *playback_props = NULL, *capture_props = NULL;
 | 
			
		||||
	struct module_ladspa_sink_data * const d = module->user_data;
 | 
			
		||||
	struct pw_properties * const props = module->props;
 | 
			
		||||
	struct pw_properties *playback_props = NULL, *capture_props = NULL;
 | 
			
		||||
	const char *str;
 | 
			
		||||
	struct spa_audio_info_raw capture_info = { 0 };
 | 
			
		||||
	struct spa_audio_info_raw playback_info = { 0 };
 | 
			
		||||
| 
						 | 
				
			
			@ -189,15 +189,12 @@ struct module *create_module_ladspa_sink(struct impl *impl, const char *argument
 | 
			
		|||
 | 
			
		||||
	PW_LOG_TOPIC_INIT(mod_topic);
 | 
			
		||||
 | 
			
		||||
	props = pw_properties_new(NULL, NULL);
 | 
			
		||||
	capture_props = pw_properties_new(NULL, NULL);
 | 
			
		||||
	playback_props = pw_properties_new(NULL, NULL);
 | 
			
		||||
	if (!props || !capture_props || !playback_props) {
 | 
			
		||||
	if (!capture_props || !playback_props) {
 | 
			
		||||
		res = -EINVAL;
 | 
			
		||||
		goto out;
 | 
			
		||||
	}
 | 
			
		||||
	if (argument)
 | 
			
		||||
		module_args_add_props(props, argument);
 | 
			
		||||
 | 
			
		||||
	if ((str = pw_properties_get(props, "sink_name")) != NULL) {
 | 
			
		||||
		pw_properties_set(capture_props, PW_KEY_NODE_NAME, str);
 | 
			
		||||
| 
						 | 
				
			
			@ -226,7 +223,7 @@ struct module *create_module_ladspa_sink(struct impl *impl, const char *argument
 | 
			
		|||
		pw_properties_set(props, "master", NULL);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (module_args_to_audioinfo(impl, props, &capture_info) < 0) {
 | 
			
		||||
	if (module_args_to_audioinfo(module->impl, props, &capture_info) < 0) {
 | 
			
		||||
		res = -EINVAL;
 | 
			
		||||
		goto out;
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -238,25 +235,16 @@ struct module *create_module_ladspa_sink(struct impl *impl, const char *argument
 | 
			
		|||
	if (pw_properties_get(playback_props, PW_KEY_NODE_PASSIVE) == NULL)
 | 
			
		||||
		pw_properties_set(playback_props, PW_KEY_NODE_PASSIVE, "true");
 | 
			
		||||
 | 
			
		||||
	module = module_new(impl, sizeof(*d));
 | 
			
		||||
	if (module == NULL) {
 | 
			
		||||
		res = -errno;
 | 
			
		||||
		goto out;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	module->props = props;
 | 
			
		||||
	d = module->user_data;
 | 
			
		||||
	d->module = module;
 | 
			
		||||
	d->capture_props = capture_props;
 | 
			
		||||
	d->playback_props = playback_props;
 | 
			
		||||
 | 
			
		||||
	return module;
 | 
			
		||||
	return 0;
 | 
			
		||||
out:
 | 
			
		||||
	pw_properties_free(props);
 | 
			
		||||
	pw_properties_free(playback_props);
 | 
			
		||||
	pw_properties_free(capture_props);
 | 
			
		||||
	errno = -res;
 | 
			
		||||
	return NULL;
 | 
			
		||||
 | 
			
		||||
	return res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
DEFINE_MODULE_INFO(module_ladspa_sink) = {
 | 
			
		||||
| 
						 | 
				
			
			@ -265,4 +253,5 @@ DEFINE_MODULE_INFO(module_ladspa_sink) = {
 | 
			
		|||
	.load = module_ladspa_sink_load,
 | 
			
		||||
	.unload = module_ladspa_sink_unload,
 | 
			
		||||
	.properties = &SPA_DICT_INIT_ARRAY(module_ladspa_sink_info),
 | 
			
		||||
	.data_size = sizeof(struct module_ladspa_sink_data),
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -177,11 +177,11 @@ static void position_to_props(struct spa_audio_info_raw *info, struct pw_propert
 | 
			
		|||
	pw_properties_set(props, SPA_KEY_AUDIO_POSITION, s);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct module *create_module_ladspa_source(struct impl *impl, const char *argument)
 | 
			
		||||
int create_module_ladspa_source(struct module * const module)
 | 
			
		||||
{
 | 
			
		||||
	struct module *module;
 | 
			
		||||
	struct module_ladspa_source_data *d;
 | 
			
		||||
	struct pw_properties *props = NULL, *playback_props = NULL, *capture_props = NULL;
 | 
			
		||||
	struct module_ladspa_source_data * const d = module->user_data;
 | 
			
		||||
	struct pw_properties * const props = module->props;
 | 
			
		||||
	struct pw_properties *playback_props = NULL, *capture_props = NULL;
 | 
			
		||||
	const char *str;
 | 
			
		||||
	struct spa_audio_info_raw capture_info = { 0 };
 | 
			
		||||
	struct spa_audio_info_raw playback_info = { 0 };
 | 
			
		||||
| 
						 | 
				
			
			@ -189,15 +189,12 @@ struct module *create_module_ladspa_source(struct impl *impl, const char *argume
 | 
			
		|||
 | 
			
		||||
	PW_LOG_TOPIC_INIT(mod_topic);
 | 
			
		||||
 | 
			
		||||
	props = pw_properties_new(NULL, NULL);
 | 
			
		||||
	capture_props = pw_properties_new(NULL, NULL);
 | 
			
		||||
	playback_props = pw_properties_new(NULL, NULL);
 | 
			
		||||
	if (!props || !capture_props || !playback_props) {
 | 
			
		||||
	if (!capture_props || !playback_props) {
 | 
			
		||||
		res = -EINVAL;
 | 
			
		||||
		goto out;
 | 
			
		||||
	}
 | 
			
		||||
	if (argument)
 | 
			
		||||
		module_args_add_props(props, argument);
 | 
			
		||||
 | 
			
		||||
	if ((str = pw_properties_get(props, "source_name")) != NULL) {
 | 
			
		||||
		pw_properties_set(playback_props, PW_KEY_NODE_NAME, str);
 | 
			
		||||
| 
						 | 
				
			
			@ -226,7 +223,7 @@ struct module *create_module_ladspa_source(struct impl *impl, const char *argume
 | 
			
		|||
		pw_properties_set(props, "master", NULL);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (module_args_to_audioinfo(impl, props, &playback_info) < 0) {
 | 
			
		||||
	if (module_args_to_audioinfo(module->impl, props, &playback_info) < 0) {
 | 
			
		||||
		res = -EINVAL;
 | 
			
		||||
		goto out;
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -238,25 +235,16 @@ struct module *create_module_ladspa_source(struct impl *impl, const char *argume
 | 
			
		|||
	if (pw_properties_get(capture_props, PW_KEY_NODE_PASSIVE) == NULL)
 | 
			
		||||
		pw_properties_set(capture_props, PW_KEY_NODE_PASSIVE, "true");
 | 
			
		||||
 | 
			
		||||
	module = module_new(impl, sizeof(*d));
 | 
			
		||||
	if (module == NULL) {
 | 
			
		||||
		res = -errno;
 | 
			
		||||
		goto out;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	module->props = props;
 | 
			
		||||
	d = module->user_data;
 | 
			
		||||
	d->module = module;
 | 
			
		||||
	d->capture_props = capture_props;
 | 
			
		||||
	d->playback_props = playback_props;
 | 
			
		||||
 | 
			
		||||
	return module;
 | 
			
		||||
	return 0;
 | 
			
		||||
out:
 | 
			
		||||
	pw_properties_free(props);
 | 
			
		||||
	pw_properties_free(playback_props);
 | 
			
		||||
	pw_properties_free(capture_props);
 | 
			
		||||
	errno = -res;
 | 
			
		||||
	return NULL;
 | 
			
		||||
 | 
			
		||||
	return res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
DEFINE_MODULE_INFO(module_ladspa_source) = {
 | 
			
		||||
| 
						 | 
				
			
			@ -265,4 +253,5 @@ DEFINE_MODULE_INFO(module_ladspa_source) = {
 | 
			
		|||
	.load = module_ladspa_source_load,
 | 
			
		||||
	.unload = module_ladspa_source_unload,
 | 
			
		||||
	.properties = &SPA_DICT_INIT_ARRAY(module_ladspa_source_info),
 | 
			
		||||
	.data_size = sizeof(struct module_ladspa_source_data),
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -143,26 +143,23 @@ static const struct spa_dict_item module_loopback_info[] = {
 | 
			
		|||
	{ PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct module *create_module_loopback(struct impl *impl, const char *argument)
 | 
			
		||||
int create_module_loopback(struct module * const module)
 | 
			
		||||
{
 | 
			
		||||
	struct module *module;
 | 
			
		||||
	struct module_loopback_data *d;
 | 
			
		||||
	struct pw_properties *props = NULL, *playback_props = NULL, *capture_props = NULL;
 | 
			
		||||
	struct module_loopback_data * const d = module->user_data;
 | 
			
		||||
	struct pw_properties * const props = module->props;
 | 
			
		||||
	struct pw_properties *playback_props = NULL, *capture_props = NULL;
 | 
			
		||||
	const char *str;
 | 
			
		||||
	struct spa_audio_info_raw info = { 0 };
 | 
			
		||||
	int res;
 | 
			
		||||
 | 
			
		||||
	PW_LOG_TOPIC_INIT(mod_topic);
 | 
			
		||||
 | 
			
		||||
	props = pw_properties_new(NULL, NULL);
 | 
			
		||||
	capture_props = pw_properties_new(NULL, NULL);
 | 
			
		||||
	playback_props = pw_properties_new(NULL, NULL);
 | 
			
		||||
	if (!props || !capture_props || !playback_props) {
 | 
			
		||||
	if (!capture_props || !playback_props) {
 | 
			
		||||
		res = -EINVAL;
 | 
			
		||||
		goto out;
 | 
			
		||||
	}
 | 
			
		||||
	if (argument)
 | 
			
		||||
		module_args_add_props(props, argument);
 | 
			
		||||
 | 
			
		||||
	/* The following modargs are not implemented:
 | 
			
		||||
	 * adjust_time, max_latency_msec, fast_adjust_threshold_msec: these are just not relevant
 | 
			
		||||
| 
						 | 
				
			
			@ -185,7 +182,7 @@ struct module *create_module_loopback(struct impl *impl, const char *argument)
 | 
			
		|||
		pw_properties_set(props, "sink", NULL);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (module_args_to_audioinfo(impl, props, &info) < 0) {
 | 
			
		||||
	if (module_args_to_audioinfo(module->impl, props, &info) < 0) {
 | 
			
		||||
		res = -EINVAL;
 | 
			
		||||
		goto out;
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -227,27 +224,17 @@ struct module *create_module_loopback(struct impl *impl, const char *argument)
 | 
			
		|||
		pw_properties_set(props, "source_output_properties", NULL);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	module = module_new(impl, sizeof(*d));
 | 
			
		||||
	if (module == NULL) {
 | 
			
		||||
		res = -errno;
 | 
			
		||||
		goto out;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	module->props = props;
 | 
			
		||||
	d = module->user_data;
 | 
			
		||||
	d->module = module;
 | 
			
		||||
	d->capture_props = capture_props;
 | 
			
		||||
	d->playback_props = playback_props;
 | 
			
		||||
	d->info = info;
 | 
			
		||||
 | 
			
		||||
	return module;
 | 
			
		||||
	return 0;
 | 
			
		||||
out:
 | 
			
		||||
	pw_properties_free(props);
 | 
			
		||||
	pw_properties_free(playback_props);
 | 
			
		||||
	pw_properties_free(capture_props);
 | 
			
		||||
	errno = -res;
 | 
			
		||||
 | 
			
		||||
	return NULL;
 | 
			
		||||
	return res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
DEFINE_MODULE_INFO(module_loopback) = {
 | 
			
		||||
| 
						 | 
				
			
			@ -256,4 +243,5 @@ DEFINE_MODULE_INFO(module_loopback) = {
 | 
			
		|||
	.load = module_loopback_load,
 | 
			
		||||
	.unload = module_loopback_unload,
 | 
			
		||||
	.properties = &SPA_DICT_INIT_ARRAY(module_loopback_info),
 | 
			
		||||
	.data_size = sizeof(struct module_loopback_data),
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -79,27 +79,17 @@ static const struct spa_dict_item module_native_protocol_tcp_info[] = {
 | 
			
		|||
	{ PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct module *create_module_native_protocol_tcp(struct impl *impl, const char *argument)
 | 
			
		||||
int create_module_native_protocol_tcp(struct module * const module)
 | 
			
		||||
{
 | 
			
		||||
	struct module *module;
 | 
			
		||||
	struct module_native_protocol_tcp_data *d;
 | 
			
		||||
	struct pw_properties *props = NULL;
 | 
			
		||||
	struct module_native_protocol_tcp_data * const d = module->user_data;
 | 
			
		||||
	struct pw_properties * const props = module->props;
 | 
			
		||||
	const char *port, *listen, *auth;
 | 
			
		||||
	FILE *f;
 | 
			
		||||
	char *args;
 | 
			
		||||
	size_t size;
 | 
			
		||||
	int res;
 | 
			
		||||
 | 
			
		||||
	PW_LOG_TOPIC_INIT(mod_topic);
 | 
			
		||||
 | 
			
		||||
	props = pw_properties_new(NULL, NULL);
 | 
			
		||||
	if (props == NULL) {
 | 
			
		||||
		res = -errno;
 | 
			
		||||
		goto out;
 | 
			
		||||
	}
 | 
			
		||||
	if (argument)
 | 
			
		||||
		module_args_add_props(props, argument);
 | 
			
		||||
 | 
			
		||||
	if ((port = pw_properties_get(props, "port")) == NULL)
 | 
			
		||||
		port = SPA_STRINGIFY(PW_PROTOCOL_PULSE_DEFAULT_PORT);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -108,10 +98,8 @@ struct module *create_module_native_protocol_tcp(struct impl *impl, const char *
 | 
			
		|||
	auth = pw_properties_get(props, "auth-anonymous");
 | 
			
		||||
 | 
			
		||||
	f = open_memstream(&args, &size);
 | 
			
		||||
	if (f == NULL) {
 | 
			
		||||
		res = -errno;
 | 
			
		||||
		goto out;
 | 
			
		||||
	}
 | 
			
		||||
	if (f == NULL)
 | 
			
		||||
		return -errno;
 | 
			
		||||
 | 
			
		||||
	fprintf(f, "[ { ");
 | 
			
		||||
	fprintf(f, " \"address\": \"tcp:%s%s%s\" ",
 | 
			
		||||
| 
						 | 
				
			
			@ -124,21 +112,9 @@ struct module *create_module_native_protocol_tcp(struct impl *impl, const char *
 | 
			
		|||
	pw_properties_set(props, "pulse.tcp", args);
 | 
			
		||||
	free(args);
 | 
			
		||||
 | 
			
		||||
	module = module_new(impl, sizeof(*d));
 | 
			
		||||
	if (module == NULL) {
 | 
			
		||||
		res = -errno;
 | 
			
		||||
		goto out;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	module->props = props;
 | 
			
		||||
	d = module->user_data;
 | 
			
		||||
	d->module = module;
 | 
			
		||||
 | 
			
		||||
	return module;
 | 
			
		||||
out:
 | 
			
		||||
	pw_properties_free(props);
 | 
			
		||||
	errno = -res;
 | 
			
		||||
	return NULL;
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
DEFINE_MODULE_INFO(module_native_protocol_tcp) = {
 | 
			
		||||
| 
						 | 
				
			
			@ -147,4 +123,5 @@ DEFINE_MODULE_INFO(module_native_protocol_tcp) = {
 | 
			
		|||
	.load = module_native_protocol_tcp_load,
 | 
			
		||||
	.unload = module_native_protocol_tcp_unload,
 | 
			
		||||
	.properties = &SPA_DICT_INIT_ARRAY(module_native_protocol_tcp_info),
 | 
			
		||||
	.data_size = sizeof(struct module_native_protocol_tcp_data),
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -158,25 +158,15 @@ static const struct spa_dict_item module_null_sink_info[] = {
 | 
			
		|||
	{ PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct module *create_module_null_sink(struct impl *impl, const char *argument)
 | 
			
		||||
int create_module_null_sink(struct module * const module)
 | 
			
		||||
{
 | 
			
		||||
	struct module *module;
 | 
			
		||||
	struct pw_properties *props = NULL;
 | 
			
		||||
	struct pw_properties * const props = module->props;
 | 
			
		||||
	const char *str;
 | 
			
		||||
	struct spa_audio_info_raw info = { 0 };
 | 
			
		||||
	uint32_t i;
 | 
			
		||||
	int res;
 | 
			
		||||
 | 
			
		||||
	PW_LOG_TOPIC_INIT(mod_topic);
 | 
			
		||||
 | 
			
		||||
	props = pw_properties_new(NULL, NULL);
 | 
			
		||||
	if (props == NULL) {
 | 
			
		||||
		res = -EINVAL;
 | 
			
		||||
		goto out;
 | 
			
		||||
	}
 | 
			
		||||
	if (argument)
 | 
			
		||||
		module_args_add_props(props, argument);
 | 
			
		||||
 | 
			
		||||
	if ((str = pw_properties_get(props, "sink_name")) != NULL) {
 | 
			
		||||
		pw_properties_set(props, PW_KEY_NODE_NAME, str);
 | 
			
		||||
		pw_properties_set(props, "sink_name", NULL);
 | 
			
		||||
| 
						 | 
				
			
			@ -190,10 +180,8 @@ struct module *create_module_null_sink(struct impl *impl, const char *argument)
 | 
			
		|||
		pw_properties_set(props, "sink_properties", NULL);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (module_args_to_audioinfo(impl, props, &info) < 0) {
 | 
			
		||||
		res = -EINVAL;
 | 
			
		||||
		goto out;
 | 
			
		||||
	}
 | 
			
		||||
	if (module_args_to_audioinfo(module->impl, props, &info) < 0)
 | 
			
		||||
		return -EINVAL;
 | 
			
		||||
 | 
			
		||||
	if (info.rate)
 | 
			
		||||
		pw_properties_setf(props, SPA_KEY_AUDIO_RATE, "%u", info.rate);
 | 
			
		||||
| 
						 | 
				
			
			@ -227,18 +215,7 @@ struct module *create_module_null_sink(struct impl *impl, const char *argument)
 | 
			
		|||
	if (pw_properties_get(props, "monitor.channel-volumes") == NULL)
 | 
			
		||||
		pw_properties_set(props, "monitor.channel-volumes", "true");
 | 
			
		||||
 | 
			
		||||
	module = module_new(impl, sizeof(struct module_null_sink_data));
 | 
			
		||||
	if (module == NULL) {
 | 
			
		||||
		res = -errno;
 | 
			
		||||
		goto out;
 | 
			
		||||
	}
 | 
			
		||||
	module->props = props;
 | 
			
		||||
 | 
			
		||||
	return module;
 | 
			
		||||
out:
 | 
			
		||||
	pw_properties_free(props);
 | 
			
		||||
	errno = -res;
 | 
			
		||||
	return NULL;
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
DEFINE_MODULE_INFO(module_null_sink) = {
 | 
			
		||||
| 
						 | 
				
			
			@ -247,4 +224,5 @@ DEFINE_MODULE_INFO(module_null_sink) = {
 | 
			
		|||
	.load = module_null_sink_load,
 | 
			
		||||
	.unload = module_null_sink_unload,
 | 
			
		||||
	.properties = &SPA_DICT_INIT_ARRAY(module_null_sink_info),
 | 
			
		||||
	.data_size = sizeof(struct module_null_sink_data),
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -218,11 +218,11 @@ static const struct spa_dict_item module_pipe_sink_info[] = {
 | 
			
		|||
	{ PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct module *create_module_pipe_sink(struct impl *impl, const char *argument)
 | 
			
		||||
int create_module_pipe_sink(struct module * const module)
 | 
			
		||||
{
 | 
			
		||||
	struct module *module;
 | 
			
		||||
	struct module_pipesink_data *d;
 | 
			
		||||
	struct pw_properties *props = NULL, *capture_props = NULL;
 | 
			
		||||
	struct module_pipesink_data * const d = module->user_data;
 | 
			
		||||
	struct pw_properties * const props = module->props;
 | 
			
		||||
	struct pw_properties *capture_props = NULL;
 | 
			
		||||
	struct spa_audio_info_raw info = { 0 };
 | 
			
		||||
	struct stat st;
 | 
			
		||||
	const char *str;
 | 
			
		||||
| 
						 | 
				
			
			@ -233,16 +233,13 @@ struct module *create_module_pipe_sink(struct impl *impl, const char *argument)
 | 
			
		|||
 | 
			
		||||
	PW_LOG_TOPIC_INIT(mod_topic);
 | 
			
		||||
 | 
			
		||||
	props = pw_properties_new(NULL, NULL);
 | 
			
		||||
	capture_props = pw_properties_new(NULL, NULL);
 | 
			
		||||
	if (!props || !capture_props) {
 | 
			
		||||
	if (!capture_props) {
 | 
			
		||||
		res = -EINVAL;
 | 
			
		||||
		goto out;
 | 
			
		||||
	}
 | 
			
		||||
	if (argument)
 | 
			
		||||
		module_args_add_props(props, argument);
 | 
			
		||||
 | 
			
		||||
	if (module_args_to_audioinfo(impl, props, &info) < 0) {
 | 
			
		||||
	if (module_args_to_audioinfo(module->impl, props, &info) < 0) {
 | 
			
		||||
		res = -EINVAL;
 | 
			
		||||
		goto out;
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -302,14 +299,6 @@ struct module *create_module_pipe_sink(struct impl *impl, const char *argument)
 | 
			
		|||
		pw_properties_set(capture_props, PW_KEY_NODE_VIRTUAL, "true");
 | 
			
		||||
	pw_properties_set(capture_props, PW_KEY_MEDIA_CLASS, "Audio/Sink");
 | 
			
		||||
 | 
			
		||||
	module = module_new(impl, sizeof(*d));
 | 
			
		||||
	if (module == NULL) {
 | 
			
		||||
		res = -errno;
 | 
			
		||||
		goto out;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	module->props = props;
 | 
			
		||||
	d = module->user_data;
 | 
			
		||||
	d->module = module;
 | 
			
		||||
	d->capture_props = capture_props;
 | 
			
		||||
	d->info = info;
 | 
			
		||||
| 
						 | 
				
			
			@ -319,9 +308,8 @@ struct module *create_module_pipe_sink(struct impl *impl, const char *argument)
 | 
			
		|||
 | 
			
		||||
	pw_log_info("Successfully loaded module-pipe-sink");
 | 
			
		||||
 | 
			
		||||
	return module;
 | 
			
		||||
	return 0;
 | 
			
		||||
out:
 | 
			
		||||
	pw_properties_free(props);
 | 
			
		||||
	pw_properties_free(capture_props);
 | 
			
		||||
	if (filename) {
 | 
			
		||||
		if (do_unlink_fifo)
 | 
			
		||||
| 
						 | 
				
			
			@ -330,9 +318,8 @@ out:
 | 
			
		|||
	}
 | 
			
		||||
	if (fd >= 0)
 | 
			
		||||
		close(fd);
 | 
			
		||||
	errno = -res;
 | 
			
		||||
 | 
			
		||||
	return NULL;
 | 
			
		||||
	return res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
DEFINE_MODULE_INFO(module_pipe_sink) = {
 | 
			
		||||
| 
						 | 
				
			
			@ -341,4 +328,5 @@ DEFINE_MODULE_INFO(module_pipe_sink) = {
 | 
			
		|||
	.load = module_pipe_sink_load,
 | 
			
		||||
	.unload = module_pipe_sink_unload,
 | 
			
		||||
	.properties = &SPA_DICT_INIT_ARRAY(module_pipe_sink_info),
 | 
			
		||||
	.data_size = sizeof(struct module_pipesink_data),
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -238,11 +238,11 @@ static const struct spa_dict_item module_pipe_source_info[] = {
 | 
			
		|||
	{ PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct module *create_module_pipe_source(struct impl *impl, const char *argument)
 | 
			
		||||
int create_module_pipe_source(struct module * const module)
 | 
			
		||||
{
 | 
			
		||||
	struct module *module;
 | 
			
		||||
	struct module_pipesrc_data *d;
 | 
			
		||||
	struct pw_properties *props = NULL, *playback_props = NULL;
 | 
			
		||||
	struct module_pipesrc_data * const d = module->user_data;
 | 
			
		||||
	struct pw_properties * const props = module->props;
 | 
			
		||||
	struct pw_properties *playback_props = NULL;
 | 
			
		||||
	struct spa_audio_info_raw info = { 0 };
 | 
			
		||||
	struct stat st;
 | 
			
		||||
	const char *str;
 | 
			
		||||
| 
						 | 
				
			
			@ -253,16 +253,13 @@ struct module *create_module_pipe_source(struct impl *impl, const char *argument
 | 
			
		|||
 | 
			
		||||
	PW_LOG_TOPIC_INIT(mod_topic);
 | 
			
		||||
 | 
			
		||||
	props = pw_properties_new(NULL, NULL);
 | 
			
		||||
	playback_props = pw_properties_new(NULL, NULL);
 | 
			
		||||
	if (!props || !playback_props) {
 | 
			
		||||
	if (!playback_props) {
 | 
			
		||||
		res = -errno;
 | 
			
		||||
		goto out;
 | 
			
		||||
	}
 | 
			
		||||
	if (argument)
 | 
			
		||||
		module_args_add_props(props, argument);
 | 
			
		||||
 | 
			
		||||
	if (module_args_to_audioinfo(impl, props, &info) < 0) {
 | 
			
		||||
	if (module_args_to_audioinfo(module->impl, props, &info) < 0) {
 | 
			
		||||
		res = -EINVAL;
 | 
			
		||||
		goto out;
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -361,14 +358,6 @@ struct module *create_module_pipe_source(struct impl *impl, const char *argument
 | 
			
		|||
		pw_properties_set(playback_props, PW_KEY_NODE_VIRTUAL, "true");
 | 
			
		||||
	pw_properties_set(playback_props, PW_KEY_MEDIA_CLASS, "Audio/Source");
 | 
			
		||||
 | 
			
		||||
	module = module_new(impl, sizeof(*d) + stride);
 | 
			
		||||
	if (module == NULL) {
 | 
			
		||||
		res = -errno;
 | 
			
		||||
		goto out;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	module->props = props;
 | 
			
		||||
	d = module->user_data;
 | 
			
		||||
	d->module = module;
 | 
			
		||||
	d->playback_props = playback_props;
 | 
			
		||||
	d->info = info;
 | 
			
		||||
| 
						 | 
				
			
			@ -379,18 +368,16 @@ struct module *create_module_pipe_source(struct impl *impl, const char *argument
 | 
			
		|||
 | 
			
		||||
	pw_log_info("Successfully loaded module-pipe-source");
 | 
			
		||||
 | 
			
		||||
	return module;
 | 
			
		||||
	return 0;
 | 
			
		||||
out:
 | 
			
		||||
	pw_properties_free(props);
 | 
			
		||||
	pw_properties_free(playback_props);
 | 
			
		||||
	if (do_unlink)
 | 
			
		||||
		unlink(filename);
 | 
			
		||||
	free(filename);
 | 
			
		||||
	if (fd >= 0)
 | 
			
		||||
		close(fd);
 | 
			
		||||
	errno = -res;
 | 
			
		||||
 | 
			
		||||
	return NULL;
 | 
			
		||||
	return res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
DEFINE_MODULE_INFO(module_pipe_source) = {
 | 
			
		||||
| 
						 | 
				
			
			@ -399,4 +386,5 @@ DEFINE_MODULE_INFO(module_pipe_source) = {
 | 
			
		|||
	.load = module_pipe_source_load,
 | 
			
		||||
	.unload = module_pipe_source_unload,
 | 
			
		||||
	.properties = &SPA_DICT_INIT_ARRAY(module_pipe_source_info),
 | 
			
		||||
	.data_size = sizeof(struct module_pipesrc_data),
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -92,38 +92,14 @@ static const struct spa_dict_item module_raop_discover_info[] = {
 | 
			
		|||
	{ PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct module *create_module_raop_discover(struct impl *impl, const char *argument)
 | 
			
		||||
int create_module_raop_discover(struct module * const module)
 | 
			
		||||
{
 | 
			
		||||
	struct module *module;
 | 
			
		||||
	struct module_raop_discover_data *d;
 | 
			
		||||
	struct pw_properties *props = NULL;
 | 
			
		||||
	int res;
 | 
			
		||||
 | 
			
		||||
	PW_LOG_TOPIC_INIT(mod_topic);
 | 
			
		||||
 | 
			
		||||
	props = pw_properties_new(NULL, NULL);
 | 
			
		||||
	if (props == NULL) {
 | 
			
		||||
		res = -errno;
 | 
			
		||||
		goto out;
 | 
			
		||||
	}
 | 
			
		||||
	if (argument != NULL)
 | 
			
		||||
		module_args_add_props(props, argument);
 | 
			
		||||
	struct module_raop_discover_data * const data = module->user_data;
 | 
			
		||||
	data->module = module;
 | 
			
		||||
 | 
			
		||||
	module = module_new(impl, sizeof(*d));
 | 
			
		||||
	if (module == NULL) {
 | 
			
		||||
		res = -errno;
 | 
			
		||||
		goto out;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	module->props = props;
 | 
			
		||||
	d = module->user_data;
 | 
			
		||||
	d->module = module;
 | 
			
		||||
 | 
			
		||||
	return module;
 | 
			
		||||
out:
 | 
			
		||||
	pw_properties_free(props);
 | 
			
		||||
	errno = -res;
 | 
			
		||||
	return NULL;
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
DEFINE_MODULE_INFO(module_raop_discover) = {
 | 
			
		||||
| 
						 | 
				
			
			@ -133,4 +109,5 @@ DEFINE_MODULE_INFO(module_raop_discover) = {
 | 
			
		|||
	.load = module_raop_discover_load,
 | 
			
		||||
	.unload = module_raop_discover_unload,
 | 
			
		||||
	.properties = &SPA_DICT_INIT_ARRAY(module_raop_discover_info),
 | 
			
		||||
	.data_size = sizeof(struct module_raop_discover_data),
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -143,11 +143,11 @@ static void position_to_props(struct spa_audio_info_raw *info, struct pw_propert
 | 
			
		|||
	pw_properties_set(props, SPA_KEY_AUDIO_POSITION, s);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct module *create_module_remap_sink(struct impl *impl, const char *argument)
 | 
			
		||||
int create_module_remap_sink(struct module * const module)
 | 
			
		||||
{
 | 
			
		||||
	struct module *module;
 | 
			
		||||
	struct module_remap_sink_data *d;
 | 
			
		||||
	struct pw_properties *props = NULL, *playback_props = NULL, *capture_props = NULL;
 | 
			
		||||
	struct module_remap_sink_data * const d = module->user_data;
 | 
			
		||||
	struct pw_properties * const props = module->props;
 | 
			
		||||
	struct pw_properties *playback_props = NULL, *capture_props = NULL;
 | 
			
		||||
	const char *str, *master;
 | 
			
		||||
	struct spa_audio_info_raw capture_info = { 0 };
 | 
			
		||||
	struct spa_audio_info_raw playback_info = { 0 };
 | 
			
		||||
| 
						 | 
				
			
			@ -155,15 +155,12 @@ struct module *create_module_remap_sink(struct impl *impl, const char *argument)
 | 
			
		|||
 | 
			
		||||
	PW_LOG_TOPIC_INIT(mod_topic);
 | 
			
		||||
 | 
			
		||||
	props = pw_properties_new(NULL, NULL);
 | 
			
		||||
	capture_props = pw_properties_new(NULL, NULL);
 | 
			
		||||
	playback_props = pw_properties_new(NULL, NULL);
 | 
			
		||||
	if (!props || !capture_props || !playback_props) {
 | 
			
		||||
	if (!capture_props || !playback_props) {
 | 
			
		||||
		res = -EINVAL;
 | 
			
		||||
		goto out;
 | 
			
		||||
	}
 | 
			
		||||
	if (argument)
 | 
			
		||||
		module_args_add_props(props, argument);
 | 
			
		||||
 | 
			
		||||
	master = pw_properties_get(props, "master");
 | 
			
		||||
	if (pw_properties_get(props, "sink_name") == NULL) {
 | 
			
		||||
| 
						 | 
				
			
			@ -204,7 +201,7 @@ struct module *create_module_remap_sink(struct impl *impl, const char *argument)
 | 
			
		|||
		pw_properties_set(props, "master", NULL);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (module_args_to_audioinfo(impl, props, &capture_info) < 0) {
 | 
			
		||||
	if (module_args_to_audioinfo(module->impl, props, &capture_info) < 0) {
 | 
			
		||||
		res = -EINVAL;
 | 
			
		||||
		goto out;
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -235,25 +232,16 @@ struct module *create_module_remap_sink(struct impl *impl, const char *argument)
 | 
			
		|||
	if (pw_properties_get(playback_props, PW_KEY_NODE_PASSIVE) == NULL)
 | 
			
		||||
		pw_properties_set(playback_props, PW_KEY_NODE_PASSIVE, "true");
 | 
			
		||||
 | 
			
		||||
	module = module_new(impl, sizeof(*d));
 | 
			
		||||
	if (module == NULL) {
 | 
			
		||||
		res = -errno;
 | 
			
		||||
		goto out;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	module->props = props;
 | 
			
		||||
	d = module->user_data;
 | 
			
		||||
	d->module = module;
 | 
			
		||||
	d->capture_props = capture_props;
 | 
			
		||||
	d->playback_props = playback_props;
 | 
			
		||||
 | 
			
		||||
	return module;
 | 
			
		||||
	return 0;
 | 
			
		||||
out:
 | 
			
		||||
	pw_properties_free(props);
 | 
			
		||||
	pw_properties_free(playback_props);
 | 
			
		||||
	pw_properties_free(capture_props);
 | 
			
		||||
	errno = -res;
 | 
			
		||||
	return NULL;
 | 
			
		||||
 | 
			
		||||
	return res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
DEFINE_MODULE_INFO(module_remap_sink) = {
 | 
			
		||||
| 
						 | 
				
			
			@ -262,4 +250,5 @@ DEFINE_MODULE_INFO(module_remap_sink) = {
 | 
			
		|||
	.load = module_remap_sink_load,
 | 
			
		||||
	.unload = module_remap_sink_unload,
 | 
			
		||||
	.properties = &SPA_DICT_INIT_ARRAY(module_remap_sink_info),
 | 
			
		||||
	.data_size = sizeof(struct module_remap_sink_data),
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -143,11 +143,11 @@ static void position_to_props(struct spa_audio_info_raw *info, struct pw_propert
 | 
			
		|||
	pw_properties_set(props, SPA_KEY_AUDIO_POSITION, s);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct module *create_module_remap_source(struct impl *impl, const char *argument)
 | 
			
		||||
int create_module_remap_source(struct module * const module)
 | 
			
		||||
{
 | 
			
		||||
	struct module *module;
 | 
			
		||||
	struct module_remap_source_data *d;
 | 
			
		||||
	struct pw_properties *props = NULL, *playback_props = NULL, *capture_props = NULL;
 | 
			
		||||
	struct module_remap_source_data * const d = module->user_data;
 | 
			
		||||
	struct pw_properties * const props = module->props;
 | 
			
		||||
	struct pw_properties *playback_props = NULL, *capture_props = NULL;
 | 
			
		||||
	const char *str, *master;
 | 
			
		||||
	struct spa_audio_info_raw capture_info = { 0 };
 | 
			
		||||
	struct spa_audio_info_raw playback_info = { 0 };
 | 
			
		||||
| 
						 | 
				
			
			@ -155,15 +155,12 @@ struct module *create_module_remap_source(struct impl *impl, const char *argumen
 | 
			
		|||
 | 
			
		||||
	PW_LOG_TOPIC_INIT(mod_topic);
 | 
			
		||||
 | 
			
		||||
	props = pw_properties_new(NULL, NULL);
 | 
			
		||||
	capture_props = pw_properties_new(NULL, NULL);
 | 
			
		||||
	playback_props = pw_properties_new(NULL, NULL);
 | 
			
		||||
	if (!props || !capture_props || !playback_props) {
 | 
			
		||||
	if (!capture_props || !playback_props) {
 | 
			
		||||
		res = -EINVAL;
 | 
			
		||||
		goto out;
 | 
			
		||||
	}
 | 
			
		||||
	if (argument)
 | 
			
		||||
		module_args_add_props(props, argument);
 | 
			
		||||
 | 
			
		||||
	master = pw_properties_get(props, "master");
 | 
			
		||||
	if (pw_properties_get(props, "source_name") == NULL) {
 | 
			
		||||
| 
						 | 
				
			
			@ -204,7 +201,7 @@ struct module *create_module_remap_source(struct impl *impl, const char *argumen
 | 
			
		|||
		pw_properties_set(props, "master", NULL);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (module_args_to_audioinfo(impl, props, &playback_info) < 0) {
 | 
			
		||||
	if (module_args_to_audioinfo(module->impl, props, &playback_info) < 0) {
 | 
			
		||||
		res = -EINVAL;
 | 
			
		||||
		goto out;
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -235,25 +232,16 @@ struct module *create_module_remap_source(struct impl *impl, const char *argumen
 | 
			
		|||
	if (pw_properties_get(capture_props, PW_KEY_NODE_PASSIVE) == NULL)
 | 
			
		||||
		pw_properties_set(capture_props, PW_KEY_NODE_PASSIVE, "true");
 | 
			
		||||
 | 
			
		||||
	module = module_new(impl, sizeof(*d));
 | 
			
		||||
	if (module == NULL) {
 | 
			
		||||
		res = -errno;
 | 
			
		||||
		goto out;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	module->props = props;
 | 
			
		||||
	d = module->user_data;
 | 
			
		||||
	d->module = module;
 | 
			
		||||
	d->capture_props = capture_props;
 | 
			
		||||
	d->playback_props = playback_props;
 | 
			
		||||
 | 
			
		||||
	return module;
 | 
			
		||||
	return 0;
 | 
			
		||||
out:
 | 
			
		||||
	pw_properties_free(props);
 | 
			
		||||
	pw_properties_free(playback_props);
 | 
			
		||||
	pw_properties_free(capture_props);
 | 
			
		||||
	errno = -res;
 | 
			
		||||
	return NULL;
 | 
			
		||||
 | 
			
		||||
	return res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
DEFINE_MODULE_INFO(module_remap_source) = {
 | 
			
		||||
| 
						 | 
				
			
			@ -262,4 +250,5 @@ DEFINE_MODULE_INFO(module_remap_source) = {
 | 
			
		|||
	.load = module_remap_source_load,
 | 
			
		||||
	.unload = module_remap_source_unload,
 | 
			
		||||
	.properties = &SPA_DICT_INIT_ARRAY(module_remap_source_info),
 | 
			
		||||
	.data_size = sizeof(struct module_remap_source_data),
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -124,27 +124,23 @@ static const struct spa_dict_item module_roc_sink_input_info[] = {
 | 
			
		|||
	{ PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct module *create_module_roc_sink_input(struct impl *impl, const char *argument)
 | 
			
		||||
int create_module_roc_sink_input(struct module * const module)
 | 
			
		||||
{
 | 
			
		||||
	struct module *module;
 | 
			
		||||
	struct module_roc_sink_input_data *d;
 | 
			
		||||
	struct pw_properties *props = NULL, *source_props = NULL, *roc_props = NULL;
 | 
			
		||||
	struct module_roc_sink_input_data * const d = module->user_data;
 | 
			
		||||
	struct pw_properties * const props = module->props;
 | 
			
		||||
	struct pw_properties *source_props = NULL, *roc_props = NULL;
 | 
			
		||||
	const char *str;
 | 
			
		||||
	int res;
 | 
			
		||||
 | 
			
		||||
	PW_LOG_TOPIC_INIT(mod_topic);
 | 
			
		||||
 | 
			
		||||
	props = pw_properties_new(NULL, NULL);
 | 
			
		||||
	source_props = pw_properties_new(NULL, NULL);
 | 
			
		||||
	roc_props = pw_properties_new(NULL, NULL);
 | 
			
		||||
	if (!props || !source_props || !roc_props) {
 | 
			
		||||
	if (!source_props || !roc_props) {
 | 
			
		||||
		res = -errno;
 | 
			
		||||
		goto out;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (argument != NULL)
 | 
			
		||||
		module_args_add_props(props, argument);
 | 
			
		||||
 | 
			
		||||
	if ((str = pw_properties_get(props, "sink")) != NULL) {
 | 
			
		||||
		pw_properties_set(source_props, PW_KEY_TARGET_OBJECT, str);
 | 
			
		||||
		pw_properties_set(props, "sink", NULL);
 | 
			
		||||
| 
						 | 
				
			
			@ -184,25 +180,16 @@ struct module *create_module_roc_sink_input(struct impl *impl, const char *argum
 | 
			
		|||
		pw_properties_set(props, "fec_code", NULL);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	module = module_new(impl, sizeof(*d));
 | 
			
		||||
	if (module == NULL) {
 | 
			
		||||
		res = -errno;
 | 
			
		||||
		goto out;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	module->props = props;
 | 
			
		||||
	d = module->user_data;
 | 
			
		||||
	d->module = module;
 | 
			
		||||
	d->source_props = source_props;
 | 
			
		||||
	d->roc_props = roc_props;
 | 
			
		||||
 | 
			
		||||
	return module;
 | 
			
		||||
	return 0;
 | 
			
		||||
out:
 | 
			
		||||
	pw_properties_free(props);
 | 
			
		||||
	pw_properties_free(source_props);
 | 
			
		||||
	pw_properties_free(roc_props);
 | 
			
		||||
	errno = -res;
 | 
			
		||||
	return NULL;
 | 
			
		||||
 | 
			
		||||
	return res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
DEFINE_MODULE_INFO(module_roc_sink_input) = {
 | 
			
		||||
| 
						 | 
				
			
			@ -211,4 +198,5 @@ DEFINE_MODULE_INFO(module_roc_sink_input) = {
 | 
			
		|||
	.load = module_roc_sink_input_load,
 | 
			
		||||
	.unload = module_roc_sink_input_unload,
 | 
			
		||||
	.properties = &SPA_DICT_INIT_ARRAY(module_roc_sink_input_info),
 | 
			
		||||
	.data_size = sizeof(struct module_roc_sink_input_data),
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -123,25 +123,22 @@ static const struct spa_dict_item module_roc_sink_info[] = {
 | 
			
		|||
	{ PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct module *create_module_roc_sink(struct impl *impl, const char *argument)
 | 
			
		||||
int create_module_roc_sink(struct module * const module)
 | 
			
		||||
{
 | 
			
		||||
	struct module *module;
 | 
			
		||||
	struct module_roc_sink_data *d;
 | 
			
		||||
	struct pw_properties *props = NULL, *sink_props = NULL, *roc_props = NULL;
 | 
			
		||||
	struct module_roc_sink_data * const d = module->user_data;
 | 
			
		||||
	struct pw_properties * const props = module->props;
 | 
			
		||||
	struct pw_properties *sink_props = NULL, *roc_props = NULL;
 | 
			
		||||
	const char *str;
 | 
			
		||||
	int res;
 | 
			
		||||
 | 
			
		||||
	PW_LOG_TOPIC_INIT(mod_topic);
 | 
			
		||||
 | 
			
		||||
	props = pw_properties_new(NULL, NULL);
 | 
			
		||||
	sink_props = pw_properties_new(NULL, NULL);
 | 
			
		||||
	roc_props = pw_properties_new(NULL, NULL);
 | 
			
		||||
	if (!props || !sink_props || !roc_props) {
 | 
			
		||||
	if (!sink_props || !roc_props) {
 | 
			
		||||
		res = -errno;
 | 
			
		||||
		goto out;
 | 
			
		||||
	}
 | 
			
		||||
	if (argument != NULL)
 | 
			
		||||
		module_args_add_props(props, argument);
 | 
			
		||||
 | 
			
		||||
	if ((str = pw_properties_get(props, "sink_name")) != NULL) {
 | 
			
		||||
		pw_properties_set(sink_props, PW_KEY_NODE_NAME, str);
 | 
			
		||||
| 
						 | 
				
			
			@ -185,25 +182,16 @@ struct module *create_module_roc_sink(struct impl *impl, const char *argument)
 | 
			
		|||
		pw_properties_set(props, "fec_code", NULL);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	module = module_new(impl, sizeof(*d));
 | 
			
		||||
	if (module == NULL) {
 | 
			
		||||
		res = -errno;
 | 
			
		||||
		goto out;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	module->props = props;
 | 
			
		||||
	d = module->user_data;
 | 
			
		||||
	d->module = module;
 | 
			
		||||
	d->sink_props = sink_props;
 | 
			
		||||
	d->roc_props = roc_props;
 | 
			
		||||
 | 
			
		||||
	return module;
 | 
			
		||||
	return 0;
 | 
			
		||||
out:
 | 
			
		||||
	pw_properties_free(props);
 | 
			
		||||
	pw_properties_free(sink_props);
 | 
			
		||||
	pw_properties_free(roc_props);
 | 
			
		||||
	errno = -res;
 | 
			
		||||
	return NULL;
 | 
			
		||||
 | 
			
		||||
	return res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
DEFINE_MODULE_INFO(module_roc_sink) = {
 | 
			
		||||
| 
						 | 
				
			
			@ -212,4 +200,5 @@ DEFINE_MODULE_INFO(module_roc_sink) = {
 | 
			
		|||
	.load = module_roc_sink_load,
 | 
			
		||||
	.unload = module_roc_sink_unload,
 | 
			
		||||
	.properties = &SPA_DICT_INIT_ARRAY(module_roc_sink_info),
 | 
			
		||||
	.data_size = sizeof(struct module_roc_sink_data),
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -124,27 +124,23 @@ static const struct spa_dict_item module_roc_source_info[] = {
 | 
			
		|||
	{ PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct module *create_module_roc_source(struct impl *impl, const char *argument)
 | 
			
		||||
int create_module_roc_source(struct module * const module)
 | 
			
		||||
{
 | 
			
		||||
	struct module *module;
 | 
			
		||||
	struct module_roc_source_data *d;
 | 
			
		||||
	struct pw_properties *props = NULL, *source_props = NULL, *roc_props = NULL;
 | 
			
		||||
	struct module_roc_source_data * const d = module->user_data;
 | 
			
		||||
	struct pw_properties * const props = module->props;
 | 
			
		||||
	struct pw_properties *source_props = NULL, *roc_props = NULL;
 | 
			
		||||
	const char *str;
 | 
			
		||||
	int res;
 | 
			
		||||
 | 
			
		||||
	PW_LOG_TOPIC_INIT(mod_topic);
 | 
			
		||||
 | 
			
		||||
	props = pw_properties_new(NULL, NULL);
 | 
			
		||||
	source_props = pw_properties_new(NULL, NULL);
 | 
			
		||||
	roc_props = pw_properties_new(NULL, NULL);
 | 
			
		||||
	if (!props || !source_props || !roc_props) {
 | 
			
		||||
	if (!source_props || !roc_props) {
 | 
			
		||||
		res = -errno;
 | 
			
		||||
		goto out;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (argument != NULL)
 | 
			
		||||
		module_args_add_props(props, argument);
 | 
			
		||||
 | 
			
		||||
	if ((str = pw_properties_get(props, "source_name")) != NULL) {
 | 
			
		||||
		pw_properties_set(source_props, PW_KEY_NODE_NAME, str);
 | 
			
		||||
		pw_properties_set(props, "source_name", NULL);
 | 
			
		||||
| 
						 | 
				
			
			@ -189,25 +185,16 @@ struct module *create_module_roc_source(struct impl *impl, const char *argument)
 | 
			
		|||
		pw_properties_set(props, "fec_code", NULL);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	module = module_new(impl, sizeof(*d));
 | 
			
		||||
	if (module == NULL) {
 | 
			
		||||
		res = -errno;
 | 
			
		||||
		goto out;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	module->props = props;
 | 
			
		||||
	d = module->user_data;
 | 
			
		||||
	d->module = module;
 | 
			
		||||
	d->source_props = source_props;
 | 
			
		||||
	d->roc_props = roc_props;
 | 
			
		||||
 | 
			
		||||
	return module;
 | 
			
		||||
	return 0;
 | 
			
		||||
out:
 | 
			
		||||
	pw_properties_free(props);
 | 
			
		||||
	pw_properties_free(source_props);
 | 
			
		||||
	pw_properties_free(roc_props);
 | 
			
		||||
	errno = -res;
 | 
			
		||||
	return NULL;
 | 
			
		||||
 | 
			
		||||
	return res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
DEFINE_MODULE_INFO(module_roc_source) = {
 | 
			
		||||
| 
						 | 
				
			
			@ -216,4 +203,5 @@ DEFINE_MODULE_INFO(module_roc_source) = {
 | 
			
		|||
	.load = module_roc_source_load,
 | 
			
		||||
	.unload = module_roc_source_unload,
 | 
			
		||||
	.properties = &SPA_DICT_INIT_ARRAY(module_roc_source_info),
 | 
			
		||||
	.data_size = sizeof(struct module_roc_source_data),
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -130,25 +130,17 @@ static const struct spa_dict_item module_simple_protocol_tcp_info[] = {
 | 
			
		|||
	{ PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct module *create_module_simple_protocol_tcp(struct impl *impl, const char *argument)
 | 
			
		||||
int create_module_simple_protocol_tcp(struct module * const module)
 | 
			
		||||
{
 | 
			
		||||
	struct module *module;
 | 
			
		||||
	struct module_simple_protocol_tcp_data *d;
 | 
			
		||||
	struct pw_properties *props = NULL, *module_props = NULL;
 | 
			
		||||
	struct module_simple_protocol_tcp_data * const d = module->user_data;
 | 
			
		||||
	struct pw_properties * const props = module->props;
 | 
			
		||||
	struct pw_properties *module_props = NULL;
 | 
			
		||||
	const char *str, *port, *listen;
 | 
			
		||||
	struct spa_audio_info_raw info = { 0 };
 | 
			
		||||
	int res;
 | 
			
		||||
 | 
			
		||||
	PW_LOG_TOPIC_INIT(mod_topic);
 | 
			
		||||
 | 
			
		||||
	props = pw_properties_new(NULL, NULL);
 | 
			
		||||
	if (props == NULL) {
 | 
			
		||||
		res = -errno;
 | 
			
		||||
		goto out;
 | 
			
		||||
	}
 | 
			
		||||
	if (argument)
 | 
			
		||||
		module_args_add_props(props, argument);
 | 
			
		||||
 | 
			
		||||
	module_props = pw_properties_new(NULL, NULL);
 | 
			
		||||
	if (module_props == NULL) {
 | 
			
		||||
		res = -errno;
 | 
			
		||||
| 
						 | 
				
			
			@ -160,7 +152,7 @@ struct module *create_module_simple_protocol_tcp(struct impl *impl, const char *
 | 
			
		|||
				format_id2name(format_paname2id(str, strlen(str))));
 | 
			
		||||
		pw_properties_set(props, "format", NULL);
 | 
			
		||||
	}
 | 
			
		||||
	if (module_args_to_audioinfo(impl, props, &info) < 0) {
 | 
			
		||||
	if (module_args_to_audioinfo(module->impl, props, &info) < 0) {
 | 
			
		||||
		res = -EINVAL;
 | 
			
		||||
		goto out;
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -197,24 +189,15 @@ struct module *create_module_simple_protocol_tcp(struct impl *impl, const char *
 | 
			
		|||
	pw_properties_setf(module_props, "server.address", "[ \"tcp:%s%s%s\" ]",
 | 
			
		||||
			listen ? listen : "", listen ? ":" : "", port);
 | 
			
		||||
 | 
			
		||||
	module = module_new(impl, sizeof(*d));
 | 
			
		||||
	if (module == NULL) {
 | 
			
		||||
		res = -errno;
 | 
			
		||||
		goto out;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	module->props = props;
 | 
			
		||||
	d = module->user_data;
 | 
			
		||||
	d->module = module;
 | 
			
		||||
	d->module_props = module_props;
 | 
			
		||||
	d->info = info;
 | 
			
		||||
 | 
			
		||||
	return module;
 | 
			
		||||
	return 0;
 | 
			
		||||
out:
 | 
			
		||||
	pw_properties_free(module_props);
 | 
			
		||||
	pw_properties_free(props);
 | 
			
		||||
	errno = -res;
 | 
			
		||||
	return NULL;
 | 
			
		||||
 | 
			
		||||
	return res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
DEFINE_MODULE_INFO(module_simple_protocol_tcp) = {
 | 
			
		||||
| 
						 | 
				
			
			@ -223,4 +206,5 @@ DEFINE_MODULE_INFO(module_simple_protocol_tcp) = {
 | 
			
		|||
	.load = module_simple_protocol_tcp_load,
 | 
			
		||||
	.unload = module_simple_protocol_tcp_unload,
 | 
			
		||||
	.properties = &SPA_DICT_INIT_ARRAY(module_simple_protocol_tcp_info),
 | 
			
		||||
	.data_size = sizeof(struct module_simple_protocol_tcp_data),
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -245,11 +245,10 @@ static const struct spa_dict_item module_switch_on_connect_info[] = {
 | 
			
		|||
	{ PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct module *create_module_switch_on_connect(struct impl *impl, const char *argument)
 | 
			
		||||
int create_module_switch_on_connect(struct module * const module)
 | 
			
		||||
{
 | 
			
		||||
	struct module *module;
 | 
			
		||||
	struct module_switch_on_connect_data *d;
 | 
			
		||||
	struct pw_properties *props = NULL;
 | 
			
		||||
	struct module_switch_on_connect_data * const d = module->user_data;
 | 
			
		||||
	struct pw_properties * const props = module->props;
 | 
			
		||||
	regex_t *blocklist = NULL;
 | 
			
		||||
	bool only_from_unavailable = false, ignore_virtual = true;
 | 
			
		||||
	const char *str;
 | 
			
		||||
| 
						 | 
				
			
			@ -257,14 +256,6 @@ struct module *create_module_switch_on_connect(struct impl *impl, const char *ar
 | 
			
		|||
 | 
			
		||||
	PW_LOG_TOPIC_INIT(mod_topic);
 | 
			
		||||
 | 
			
		||||
	props = pw_properties_new(NULL, NULL);
 | 
			
		||||
	if (!props) {
 | 
			
		||||
		res = -EINVAL;
 | 
			
		||||
		goto out;
 | 
			
		||||
	}
 | 
			
		||||
	if (argument)
 | 
			
		||||
		module_args_add_props(props, argument);
 | 
			
		||||
 | 
			
		||||
	if ((str = pw_properties_get(props, "only_from_unavailable")) != NULL) {
 | 
			
		||||
		only_from_unavailable = module_args_parse_bool(str);
 | 
			
		||||
		pw_properties_set(props, "only_from_unavailable", NULL);
 | 
			
		||||
| 
						 | 
				
			
			@ -292,14 +283,6 @@ struct module *create_module_switch_on_connect(struct impl *impl, const char *ar
 | 
			
		|||
 | 
			
		||||
	pw_properties_set(props, "blocklist", NULL);
 | 
			
		||||
 | 
			
		||||
	module = module_new(impl, sizeof(*d));
 | 
			
		||||
	if (module == NULL) {
 | 
			
		||||
		res = -errno;
 | 
			
		||||
		goto out;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	module->props = props;
 | 
			
		||||
	d = module->user_data;
 | 
			
		||||
	d->module = module;
 | 
			
		||||
	d->blocklist = blocklist;
 | 
			
		||||
	d->ignore_virtual = ignore_virtual;
 | 
			
		||||
| 
						 | 
				
			
			@ -310,17 +293,15 @@ struct module *create_module_switch_on_connect(struct impl *impl, const char *ar
 | 
			
		|||
		pw_log_warn("only_from_unavailable is not implemented");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return module;
 | 
			
		||||
	return 0;
 | 
			
		||||
 | 
			
		||||
out:
 | 
			
		||||
	pw_properties_free(props);
 | 
			
		||||
	if (blocklist) {
 | 
			
		||||
		regfree(blocklist);
 | 
			
		||||
		free(blocklist);
 | 
			
		||||
	}
 | 
			
		||||
	errno = -res;
 | 
			
		||||
 | 
			
		||||
	return NULL;
 | 
			
		||||
	return res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
DEFINE_MODULE_INFO(module_switch_on_connect) = {
 | 
			
		||||
| 
						 | 
				
			
			@ -330,4 +311,5 @@ DEFINE_MODULE_INFO(module_switch_on_connect) = {
 | 
			
		|||
	.load = module_switch_on_connect_load,
 | 
			
		||||
	.unload = module_switch_on_connect_unload,
 | 
			
		||||
	.properties = &SPA_DICT_INIT_ARRAY(module_switch_on_connect_info),
 | 
			
		||||
	.data_size = sizeof(struct module_switch_on_connect_data),
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -149,25 +149,22 @@ static void audio_info_to_props(struct spa_audio_info_raw *info, struct pw_prope
 | 
			
		|||
	pw_properties_set(props, SPA_KEY_AUDIO_POSITION, s);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct module *create_module_tunnel_sink(struct impl *impl, const char *argument)
 | 
			
		||||
int create_module_tunnel_sink(struct module * const module)
 | 
			
		||||
{
 | 
			
		||||
	struct module *module;
 | 
			
		||||
	struct module_tunnel_sink_data *d;
 | 
			
		||||
	struct pw_properties *props = NULL, *stream_props = NULL;
 | 
			
		||||
	struct module_tunnel_sink_data * const d = module->user_data;
 | 
			
		||||
	struct pw_properties * const props = module->props;
 | 
			
		||||
	struct pw_properties *stream_props = NULL;
 | 
			
		||||
	const char *str, *server, *remote_sink_name;
 | 
			
		||||
	struct spa_audio_info_raw info = { 0 };
 | 
			
		||||
	int res;
 | 
			
		||||
 | 
			
		||||
	PW_LOG_TOPIC_INIT(mod_topic);
 | 
			
		||||
 | 
			
		||||
	props = pw_properties_new(NULL, NULL);
 | 
			
		||||
	stream_props = pw_properties_new(NULL, NULL);
 | 
			
		||||
	if (props == NULL || stream_props == NULL) {
 | 
			
		||||
	if (stream_props == NULL) {
 | 
			
		||||
		res = -ENOMEM;
 | 
			
		||||
		goto out;
 | 
			
		||||
	}
 | 
			
		||||
	if (argument)
 | 
			
		||||
		module_args_add_props(props, argument);
 | 
			
		||||
 | 
			
		||||
	remote_sink_name = pw_properties_get(props, "sink");
 | 
			
		||||
	if (remote_sink_name)
 | 
			
		||||
| 
						 | 
				
			
			@ -196,7 +193,7 @@ struct module *create_module_tunnel_sink(struct impl *impl, const char *argument
 | 
			
		|||
		module_args_add_props(stream_props, str);
 | 
			
		||||
		pw_properties_set(props, "sink_properties", NULL);
 | 
			
		||||
	}
 | 
			
		||||
	if (module_args_to_audioinfo(impl, props, &info) < 0) {
 | 
			
		||||
	if (module_args_to_audioinfo(module->impl, props, &info) < 0) {
 | 
			
		||||
		res = -EINVAL;
 | 
			
		||||
		goto out;
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -212,25 +209,16 @@ struct module *create_module_tunnel_sink(struct impl *impl, const char *argument
 | 
			
		|||
		pw_properties_set(stream_props, PW_KEY_AUDIO_FORMAT, format_id2name(id));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	module = module_new(impl, sizeof(*d));
 | 
			
		||||
	if (module == NULL) {
 | 
			
		||||
		res = -errno;
 | 
			
		||||
		goto out;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	module->props = props;
 | 
			
		||||
	d = module->user_data;
 | 
			
		||||
	d->module = module;
 | 
			
		||||
	d->stream_props = stream_props;
 | 
			
		||||
 | 
			
		||||
	pw_properties_fetch_uint32(props, "latency_msec", &d->latency_msec);
 | 
			
		||||
 | 
			
		||||
	return module;
 | 
			
		||||
	return 0;
 | 
			
		||||
out:
 | 
			
		||||
	pw_properties_free(props);
 | 
			
		||||
	pw_properties_free(stream_props);
 | 
			
		||||
	errno = -res;
 | 
			
		||||
	return NULL;
 | 
			
		||||
 | 
			
		||||
	return res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
DEFINE_MODULE_INFO(module_tunnel_sink) = {
 | 
			
		||||
| 
						 | 
				
			
			@ -239,4 +227,5 @@ DEFINE_MODULE_INFO(module_tunnel_sink) = {
 | 
			
		|||
	.load = module_tunnel_sink_load,
 | 
			
		||||
	.unload = module_tunnel_sink_unload,
 | 
			
		||||
	.properties = &SPA_DICT_INIT_ARRAY(module_tunnel_sink_info),
 | 
			
		||||
	.data_size = sizeof(struct module_tunnel_sink_data),
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -149,25 +149,22 @@ static void audio_info_to_props(struct spa_audio_info_raw *info, struct pw_prope
 | 
			
		|||
	pw_properties_set(props, SPA_KEY_AUDIO_POSITION, s);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct module *create_module_tunnel_source(struct impl *impl, const char *argument)
 | 
			
		||||
int create_module_tunnel_source(struct module * const module)
 | 
			
		||||
{
 | 
			
		||||
	struct module *module;
 | 
			
		||||
	struct module_tunnel_source_data *d;
 | 
			
		||||
	struct pw_properties *props = NULL, *stream_props = NULL;
 | 
			
		||||
	struct module_tunnel_source_data * const d = module->user_data;
 | 
			
		||||
	struct pw_properties * const props = module->props;
 | 
			
		||||
	struct pw_properties *stream_props = NULL;
 | 
			
		||||
	const char *str, *server, *remote_source_name;
 | 
			
		||||
	struct spa_audio_info_raw info = { 0 };
 | 
			
		||||
	int res;
 | 
			
		||||
 | 
			
		||||
	PW_LOG_TOPIC_INIT(mod_topic);
 | 
			
		||||
 | 
			
		||||
	props = pw_properties_new(NULL, NULL);
 | 
			
		||||
	stream_props = pw_properties_new(NULL, NULL);
 | 
			
		||||
	if (props == NULL || stream_props == NULL) {
 | 
			
		||||
	if (stream_props == NULL) {
 | 
			
		||||
		res = -ENOMEM;
 | 
			
		||||
		goto out;
 | 
			
		||||
	}
 | 
			
		||||
	if (argument)
 | 
			
		||||
		module_args_add_props(props, argument);
 | 
			
		||||
 | 
			
		||||
	remote_source_name = pw_properties_get(props, "source");
 | 
			
		||||
	if (remote_source_name)
 | 
			
		||||
| 
						 | 
				
			
			@ -195,32 +192,23 @@ struct module *create_module_tunnel_source(struct impl *impl, const char *argume
 | 
			
		|||
		module_args_add_props(stream_props, str);
 | 
			
		||||
		pw_properties_set(props, "source_properties", NULL);
 | 
			
		||||
	}
 | 
			
		||||
	if (module_args_to_audioinfo(impl, props, &info) < 0) {
 | 
			
		||||
	if (module_args_to_audioinfo(module->impl, props, &info) < 0) {
 | 
			
		||||
		res = -EINVAL;
 | 
			
		||||
		goto out;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	audio_info_to_props(&info, stream_props);
 | 
			
		||||
 | 
			
		||||
	module = module_new(impl, sizeof(*d));
 | 
			
		||||
	if (module == NULL) {
 | 
			
		||||
		res = -errno;
 | 
			
		||||
		goto out;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	module->props = props;
 | 
			
		||||
	d = module->user_data;
 | 
			
		||||
	d->module = module;
 | 
			
		||||
	d->stream_props = stream_props;
 | 
			
		||||
 | 
			
		||||
	pw_properties_fetch_uint32(props, "latency_msec", &d->latency_msec);
 | 
			
		||||
 | 
			
		||||
	return module;
 | 
			
		||||
	return 0;
 | 
			
		||||
out:
 | 
			
		||||
	pw_properties_free(props);
 | 
			
		||||
	pw_properties_free(stream_props);
 | 
			
		||||
	errno = -res;
 | 
			
		||||
	return NULL;
 | 
			
		||||
 | 
			
		||||
	return res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
DEFINE_MODULE_INFO(module_tunnel_source) = {
 | 
			
		||||
| 
						 | 
				
			
			@ -229,4 +217,5 @@ DEFINE_MODULE_INFO(module_tunnel_source) = {
 | 
			
		|||
	.load = module_tunnel_source_load,
 | 
			
		||||
	.unload = module_tunnel_source_unload,
 | 
			
		||||
	.properties = &SPA_DICT_INIT_ARRAY(module_tunnel_source_info),
 | 
			
		||||
	.data_size = sizeof(struct module_tunnel_source_data),
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -110,38 +110,14 @@ static const struct spa_dict_item module_x11_bell_info[] = {
 | 
			
		|||
	{ PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct module *create_module_x11_bell(struct impl *impl, const char *argument)
 | 
			
		||||
int create_module_x11_bell(struct module * const module)
 | 
			
		||||
{
 | 
			
		||||
	struct pw_properties *props = NULL;
 | 
			
		||||
	struct module_x11_bell_data *data;
 | 
			
		||||
	struct module *module;
 | 
			
		||||
	int res;
 | 
			
		||||
 | 
			
		||||
	PW_LOG_TOPIC_INIT(mod_topic);
 | 
			
		||||
 | 
			
		||||
	props = pw_properties_new(NULL, NULL);
 | 
			
		||||
	if (props == NULL) {
 | 
			
		||||
		res = -EINVAL;
 | 
			
		||||
		goto out;
 | 
			
		||||
	}
 | 
			
		||||
	if (argument)
 | 
			
		||||
		module_args_add_props(props, argument);
 | 
			
		||||
 | 
			
		||||
	module = module_new(impl, sizeof(struct module_x11_bell_data));
 | 
			
		||||
	if (module == NULL) {
 | 
			
		||||
		res = -errno;
 | 
			
		||||
		goto out;
 | 
			
		||||
	}
 | 
			
		||||
	module->props = props;
 | 
			
		||||
 | 
			
		||||
	data = module->user_data;
 | 
			
		||||
	struct module_x11_bell_data * const data = module->user_data;
 | 
			
		||||
	data->module = module;
 | 
			
		||||
 | 
			
		||||
	return module;
 | 
			
		||||
out:
 | 
			
		||||
	pw_properties_free(props);
 | 
			
		||||
	errno = -res;
 | 
			
		||||
	return NULL;
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
DEFINE_MODULE_INFO(module_x11_bell) = {
 | 
			
		||||
| 
						 | 
				
			
			@ -150,4 +126,5 @@ DEFINE_MODULE_INFO(module_x11_bell) = {
 | 
			
		|||
	.load = module_x11_bell_load,
 | 
			
		||||
	.unload = module_x11_bell_unload,
 | 
			
		||||
	.properties = &SPA_DICT_INIT_ARRAY(module_x11_bell_info),
 | 
			
		||||
	.data_size = sizeof(struct module_x11_bell_data),
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -92,38 +92,14 @@ static const struct spa_dict_item module_zeroconf_discover_info[] = {
 | 
			
		|||
	{ PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct module *create_module_zeroconf_discover(struct impl *impl, const char *argument)
 | 
			
		||||
int create_module_zeroconf_discover(struct module * const module)
 | 
			
		||||
{
 | 
			
		||||
	struct module *module;
 | 
			
		||||
	struct module_zeroconf_discover_data *d;
 | 
			
		||||
	struct pw_properties *props = NULL;
 | 
			
		||||
	int res;
 | 
			
		||||
 | 
			
		||||
	PW_LOG_TOPIC_INIT(mod_topic);
 | 
			
		||||
 | 
			
		||||
	props = pw_properties_new(NULL, NULL);
 | 
			
		||||
	if (props == NULL) {
 | 
			
		||||
		res = -errno;
 | 
			
		||||
		goto out;
 | 
			
		||||
	}
 | 
			
		||||
	if (argument != NULL)
 | 
			
		||||
		module_args_add_props(props, argument);
 | 
			
		||||
	struct module_zeroconf_discover_data * const data = module->user_data;
 | 
			
		||||
	data->module = module;
 | 
			
		||||
 | 
			
		||||
	module = module_new(impl, sizeof(*d));
 | 
			
		||||
	if (module == NULL) {
 | 
			
		||||
		res = -errno;
 | 
			
		||||
		goto out;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	module->props = props;
 | 
			
		||||
	d = module->user_data;
 | 
			
		||||
	d->module = module;
 | 
			
		||||
 | 
			
		||||
	return module;
 | 
			
		||||
out:
 | 
			
		||||
	pw_properties_free(props);
 | 
			
		||||
	errno = -res;
 | 
			
		||||
	return NULL;
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
DEFINE_MODULE_INFO(module_zeroconf_discover) = {
 | 
			
		||||
| 
						 | 
				
			
			@ -133,4 +109,5 @@ DEFINE_MODULE_INFO(module_zeroconf_discover) = {
 | 
			
		|||
	.load = module_zeroconf_discover_load,
 | 
			
		||||
	.unload = module_zeroconf_discover_unload,
 | 
			
		||||
	.properties = &SPA_DICT_INIT_ARRAY(module_zeroconf_discover_info),
 | 
			
		||||
	.data_size = sizeof(struct module_zeroconf_discover_data),
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -647,41 +647,17 @@ static const struct spa_dict_item module_zeroconf_publish_info[] = {
 | 
			
		|||
	{ PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct module *create_module_zeroconf_publish(struct impl *impl, const char *argument)
 | 
			
		||||
int create_module_zeroconf_publish(struct module * const module)
 | 
			
		||||
{
 | 
			
		||||
	struct module *module;
 | 
			
		||||
	struct module_zeroconf_publish_data *d;
 | 
			
		||||
	struct pw_properties *props = NULL;
 | 
			
		||||
	int res;
 | 
			
		||||
 | 
			
		||||
	PW_LOG_TOPIC_INIT(mod_topic);
 | 
			
		||||
 | 
			
		||||
	props = pw_properties_new(NULL, NULL);
 | 
			
		||||
	if (!props) {
 | 
			
		||||
		res = -errno;
 | 
			
		||||
		goto out;
 | 
			
		||||
	}
 | 
			
		||||
	if (argument)
 | 
			
		||||
		module_args_add_props(props, argument);
 | 
			
		||||
	struct module_zeroconf_publish_data * const data = module->user_data;
 | 
			
		||||
	data->module = module;
 | 
			
		||||
	data->port = pw_properties_get_uint32(module->props, "port", PW_PROTOCOL_PULSE_DEFAULT_PORT);
 | 
			
		||||
	spa_list_init(&data->pending);
 | 
			
		||||
	spa_list_init(&data->published);
 | 
			
		||||
 | 
			
		||||
	module = module_new(impl, sizeof(*d));
 | 
			
		||||
	if (module == NULL) {
 | 
			
		||||
		res = -errno;
 | 
			
		||||
		goto out;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	module->props = props;
 | 
			
		||||
	d = module->user_data;
 | 
			
		||||
	d->module = module;
 | 
			
		||||
	d->port = pw_properties_get_uint32(props, "port", PW_PROTOCOL_PULSE_DEFAULT_PORT);
 | 
			
		||||
	spa_list_init(&d->pending);
 | 
			
		||||
	spa_list_init(&d->published);
 | 
			
		||||
 | 
			
		||||
	return module;
 | 
			
		||||
out:
 | 
			
		||||
	pw_properties_free(props);
 | 
			
		||||
	errno = -res;
 | 
			
		||||
	return NULL;
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
DEFINE_MODULE_INFO(module_zeroconf_publish) = {
 | 
			
		||||
| 
						 | 
				
			
			@ -690,4 +666,5 @@ DEFINE_MODULE_INFO(module_zeroconf_publish) = {
 | 
			
		|||
	.load = module_zeroconf_publish_load,
 | 
			
		||||
	.unload = module_zeroconf_publish_unload,
 | 
			
		||||
	.properties = &SPA_DICT_INIT_ARRAY(module_zeroconf_publish_info),
 | 
			
		||||
	.data_size = sizeof(struct module_zeroconf_publish_data),
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue