make and use pw_properties_serialize_dict()

Remove the multiple other variants and make a better one. Flags are for
future options for escaping and formatting.
This commit is contained in:
Wim Taymans 2021-05-14 09:06:25 +02:00
parent 577ad0c73a
commit 59842b3bd6
10 changed files with 54 additions and 198 deletions

View file

@ -62,27 +62,6 @@ static const struct pw_impl_module_events module_events = {
.destroy = module_destroy
};
static void serialize_dict(FILE *f, const struct spa_dict *dict)
{
const struct spa_dict_item *it;
spa_dict_for_each(it, dict) {
size_t len = it->value ? strlen(it->value) : 0;
fprintf(f, " \"%s\" = ", it->key);
if (it->value == NULL) {
fprintf(f, "null");
} else if ( spa_json_is_null(it->value, len) ||
spa_json_is_float(it->value, len) ||
spa_json_is_object(it->value, len)) {
fprintf(f, "%s", it->value);
} else {
size_t size = (len+1) * 4;
char str[size];
spa_json_encode_string(str, size, it->value);
fprintf(f, "%s", str);
}
}
}
static int module_ladspa_sink_load(struct client *client, struct module *module)
{
struct module_ladspa_sink_data *data = module->user_data;
@ -101,7 +80,7 @@ static int module_ladspa_sink_load(struct client *client, struct module *module)
f = open_memstream(&args, &size);
fprintf(f, "{");
serialize_dict(f, &module->props->dict);
pw_properties_serialize_dict(f, &module->props->dict, 0);
fprintf(f, " filter.graph = {");
fprintf(f, " nodes = [ { ");
fprintf(f, " type = ladspa ");
@ -113,9 +92,9 @@ static int module_ladspa_sink_load(struct client *client, struct module *module)
fprintf(f, " outputs = [ %s ] ", str);
fprintf(f, " } ] }");
fprintf(f, " capture.props = {");
serialize_dict(f, &data->capture_props->dict);
pw_properties_serialize_dict(f, &data->capture_props->dict, 0);
fprintf(f, " } playback.props = {");
serialize_dict(f, &data->playback_props->dict);
pw_properties_serialize_dict(f, &data->playback_props->dict, 0);
fprintf(f, " } }");
fclose(f);

View file

@ -62,27 +62,6 @@ static const struct pw_impl_module_events module_events = {
.destroy = module_destroy
};
static void serialize_dict(FILE *f, const struct spa_dict *dict)
{
const struct spa_dict_item *it;
spa_dict_for_each(it, dict) {
size_t len = it->value ? strlen(it->value) : 0;
fprintf(f, " \"%s\" = ", it->key);
if (it->value == NULL) {
fprintf(f, "null");
} else if ( spa_json_is_null(it->value, len) ||
spa_json_is_float(it->value, len) ||
spa_json_is_object(it->value, len)) {
fprintf(f, "%s", it->value);
} else {
size_t size = (len+1) * 4;
char str[size];
spa_json_encode_string(str, size, it->value);
fprintf(f, "%s", str);
}
}
}
static int module_ladspa_source_load(struct client *client, struct module *module)
{
struct module_ladspa_source_data *data = module->user_data;
@ -101,7 +80,7 @@ static int module_ladspa_source_load(struct client *client, struct module *modul
f = open_memstream(&args, &size);
fprintf(f, "{");
serialize_dict(f, &module->props->dict);
pw_properties_serialize_dict(f, &module->props->dict, 0);
fprintf(f, " filter.graph = {");
fprintf(f, " nodes = [ { ");
fprintf(f, " type = ladspa ");
@ -113,9 +92,9 @@ static int module_ladspa_source_load(struct client *client, struct module *modul
fprintf(f, " outputs = [ %s ] ", str);
fprintf(f, " } ] }");
fprintf(f, " capture.props = {");
serialize_dict(f, &data->capture_props->dict);
pw_properties_serialize_dict(f, &data->capture_props->dict, 0);
fprintf(f, " } playback.props = {");
serialize_dict(f, &data->playback_props->dict);
pw_properties_serialize_dict(f, &data->playback_props->dict, 0);
fprintf(f, " } }");
fclose(f);

View file

@ -65,29 +65,6 @@ static const struct pw_impl_module_events module_events = {
.destroy = module_destroy
};
static void serialize_dict(FILE *f, const struct spa_dict *dict)
{
const struct spa_dict_item *it;
fprintf(f, "{");
spa_dict_for_each(it, dict) {
size_t len = it->value ? strlen(it->value) : 0;
fprintf(f, " \"%s\" = ", it->key);
if (it->value == NULL) {
fprintf(f, "null");
} else if ( spa_json_is_null(it->value, len) ||
spa_json_is_float(it->value, len) ||
spa_json_is_object(it->value, len)) {
fprintf(f, "%s", it->value);
} else {
size_t size = (len+1) * 4;
char str[size];
spa_json_encode_string(str, size, it->value);
fprintf(f, "%s", str);
}
}
fprintf(f, " }");
}
static int module_loopback_load(struct client *client, struct module *module)
{
struct module_loopback_data *data = module->user_data;
@ -102,11 +79,11 @@ static int module_loopback_load(struct client *client, struct module *module)
fprintf(f, "{");
if (data->info.channels != 0)
fprintf(f, " audio.channels = %u", data->info.channels);
fprintf(f, " capture.props = ");
serialize_dict(f, &data->capture_props->dict);
fprintf(f, " playback.props = ");
serialize_dict(f, &data->playback_props->dict);
fprintf(f, " }");
fprintf(f, " capture.props = {");
pw_properties_serialize_dict(f, &data->capture_props->dict, 0);
fprintf(f, " } playback.props = {");
pw_properties_serialize_dict(f, &data->playback_props->dict, 0);
fprintf(f, " } }");
fclose(f);
data->mod = pw_context_load_module(module->impl->context,

View file

@ -62,27 +62,6 @@ static const struct pw_impl_module_events module_events = {
.destroy = module_destroy
};
static void serialize_dict(FILE *f, const struct spa_dict *dict)
{
const struct spa_dict_item *it;
spa_dict_for_each(it, dict) {
size_t len = it->value ? strlen(it->value) : 0;
fprintf(f, " \"%s\" = ", it->key);
if (it->value == NULL) {
fprintf(f, "null");
} else if ( spa_json_is_null(it->value, len) ||
spa_json_is_float(it->value, len) ||
spa_json_is_object(it->value, len)) {
fprintf(f, "%s", it->value);
} else {
size_t size = (len+1) * 4;
char str[size];
spa_json_encode_string(str, size, it->value);
fprintf(f, "%s", str);
}
}
}
static int module_remap_sink_load(struct client *client, struct module *module)
{
struct module_remap_sink_data *data = module->user_data;
@ -95,11 +74,11 @@ static int module_remap_sink_load(struct client *client, struct module *module)
f = open_memstream(&args, &size);
fprintf(f, "{");
serialize_dict(f, &module->props->dict);
pw_properties_serialize_dict(f, &module->props->dict, 0);
fprintf(f, " capture.props = {");
serialize_dict(f, &data->capture_props->dict);
pw_properties_serialize_dict(f, &data->capture_props->dict, 0);
fprintf(f, " } playback.props = {");
serialize_dict(f, &data->playback_props->dict);
pw_properties_serialize_dict(f, &data->playback_props->dict, 0);
fprintf(f, " } }");
fclose(f);

View file

@ -62,27 +62,6 @@ static const struct pw_impl_module_events module_events = {
.destroy = module_destroy
};
static void serialize_dict(FILE *f, const struct spa_dict *dict)
{
const struct spa_dict_item *it;
spa_dict_for_each(it, dict) {
size_t len = it->value ? strlen(it->value) : 0;
fprintf(f, " \"%s\" = ", it->key);
if (it->value == NULL) {
fprintf(f, "null");
} else if ( spa_json_is_null(it->value, len) ||
spa_json_is_float(it->value, len) ||
spa_json_is_object(it->value, len)) {
fprintf(f, "%s", it->value);
} else {
size_t size = (len+1) * 4;
char str[size];
spa_json_encode_string(str, size, it->value);
fprintf(f, "%s", str);
}
}
}
static int module_remap_source_load(struct client *client, struct module *module)
{
struct module_remap_source_data *data = module->user_data;
@ -95,11 +74,11 @@ static int module_remap_source_load(struct client *client, struct module *module
f = open_memstream(&args, &size);
fprintf(f, "{");
serialize_dict(f, &module->props->dict);
pw_properties_serialize_dict(f, &module->props->dict, 0);
fprintf(f, " capture.props = { ");
serialize_dict(f, &data->capture_props->dict);
pw_properties_serialize_dict(f, &data->capture_props->dict, 0);
fprintf(f, " } playback.props = { ");
serialize_dict(f, &data->playback_props->dict);
pw_properties_serialize_dict(f, &data->playback_props->dict, 0);
fprintf(f, " } }");
fclose(f);

View file

@ -63,27 +63,6 @@ static const struct pw_impl_module_events module_events = {
.destroy = module_destroy
};
static void serialize_dict(FILE *f, const struct spa_dict *dict)
{
const struct spa_dict_item *it;
spa_dict_for_each(it, dict) {
size_t len = it->value ? strlen(it->value) : 0;
fprintf(f, " \"%s\" = ", it->key);
if (it->value == NULL) {
fprintf(f, "null");
} else if ( spa_json_is_null(it->value, len) ||
spa_json_is_float(it->value, len) ||
spa_json_is_object(it->value, len)) {
fprintf(f, "%s", it->value);
} else {
size_t size = (len+1) * 4;
char str[size];
spa_json_encode_string(str, size, it->value);
fprintf(f, "%s", str);
}
}
}
static int module_tunnel_sink_load(struct client *client, struct module *module)
{
struct module_tunnel_sink_data *data = module->user_data;
@ -96,11 +75,11 @@ static int module_tunnel_sink_load(struct client *client, struct module *module)
f = open_memstream(&args, &size);
fprintf(f, "{");
serialize_dict(f, &module->props->dict);
pw_properties_serialize_dict(f, &module->props->dict, 0);
fprintf(f, " pulse.server.address = \"%s\" ", server);
fprintf(f, " tunnel.mode = playback ");
fprintf(f, " stream.props = {");
serialize_dict(f, &data->stream_props->dict);
pw_properties_serialize_dict(f, &data->stream_props->dict, 0);
fprintf(f, " } }");
fclose(f);

View file

@ -63,27 +63,6 @@ static const struct pw_impl_module_events module_events = {
.destroy = module_destroy
};
static void serialize_dict(FILE *f, const struct spa_dict *dict)
{
const struct spa_dict_item *it;
spa_dict_for_each(it, dict) {
size_t len = it->value ? strlen(it->value) : 0;
fprintf(f, " \"%s\" = ", it->key);
if (it->value == NULL) {
fprintf(f, "null");
} else if ( spa_json_is_null(it->value, len) ||
spa_json_is_float(it->value, len) ||
spa_json_is_object(it->value, len)) {
fprintf(f, "%s", it->value);
} else {
size_t size = (len+1) * 4;
char str[size];
spa_json_encode_string(str, size, it->value);
fprintf(f, "%s", str);
}
}
}
static int module_tunnel_source_load(struct client *client, struct module *module)
{
struct module_tunnel_source_data *data = module->user_data;
@ -96,11 +75,11 @@ static int module_tunnel_source_load(struct client *client, struct module *modul
f = open_memstream(&args, &size);
fprintf(f, "{");
serialize_dict(f, &module->props->dict);
pw_properties_serialize_dict(f, &module->props->dict, 0);
fprintf(f, " pulse.server.address = \"%s\" ", server);
fprintf(f, " tunnel.mode = capture ");
fprintf(f, " stream.props = {");
serialize_dict(f, &data->stream_props->dict);
pw_properties_serialize_dict(f, &data->stream_props->dict, 0);
fprintf(f, " } }");
fclose(f);

View file

@ -540,3 +540,29 @@ const char *pw_properties_iterate(const struct pw_properties *properties, void *
return pw_array_get_unchecked(&impl->items, index, struct spa_dict_item)->key;
}
SPA_EXPORT
int pw_properties_serialize_dict(FILE *f, const struct spa_dict *dict, uint32_t flags)
{
const struct spa_dict_item *it;
int count = 0;
spa_dict_for_each(it, dict) {
size_t len = it->value ? strlen(it->value) : 0;
fprintf(f, " \"%s\" = ", it->key);
if (it->value == NULL) {
fprintf(f, "null");
} else if (spa_json_is_null(it->value, len) ||
spa_json_is_float(it->value, len) ||
spa_json_is_bool(it->value, len) ||
spa_json_is_container(it->value, len)) {
fprintf(f, "%s", it->value);
} else {
size_t size = (len+1) * 4;
char str[size];
spa_json_encode_string(str, size, it->value);
fprintf(f, "%s", str);
}
count++;
}
return count;
}

View file

@ -94,6 +94,8 @@ pw_properties_get(const struct pw_properties *properties, const char *key);
const char *
pw_properties_iterate(const struct pw_properties *properties, void **state);
int pw_properties_serialize_dict(FILE *f, const struct spa_dict *dict, uint32_t flags);
static inline bool pw_properties_parse_bool(const char *value) {
return (strcmp(value, "true") == 0 || atoi(value) == 1);
}

View file

@ -80,29 +80,6 @@ static const struct pw_impl_module_events module_events = {
};
static void serialize_dict(FILE *f, const struct spa_dict *dict)
{
const struct spa_dict_item *it;
fprintf(f, "{");
spa_dict_for_each(it, dict) {
size_t len = it->value ? strlen(it->value) : 0;
fprintf(f, " \"%s\" = ", it->key);
if (it->value == NULL) {
fprintf(f, "null");
} else if ( spa_json_is_null(it->value, len) ||
spa_json_is_float(it->value, len) ||
spa_json_is_object(it->value, len)) {
fprintf(f, "%s", it->value);
} else {
size_t size = (len+1) * 4;
char str[size];
spa_json_encode_string(str, size, it->value);
fprintf(f, "%s", str);
}
}
fprintf(f, " }");
}
static void show_help(struct data *data, const char *name)
{
fprintf(stdout, "%s [options]\n"
@ -242,11 +219,11 @@ int main(int argc, char *argv[])
pw_properties_set(data.playback_props, PW_KEY_NODE_GROUP, data.opt_group_name);
}
fprintf(f, " capture.props = ");
serialize_dict(f, &data.capture_props->dict);
fprintf(f, " playback.props = ");
serialize_dict(f, &data.playback_props->dict);
fprintf(f, " }");
fprintf(f, " capture.props = {");
pw_properties_serialize_dict(f, &data.capture_props->dict, 0);
fprintf(f, " } playback.props = {");
pw_properties_serialize_dict(f, &data.playback_props->dict, 0);
fprintf(f, " } }");
fclose(f);
pw_log_info("loading module with %s", args);