mirror of
https://gitlab.freedesktop.org/pipewire/pipewire
synced 2024-10-02 22:25:17 +00:00
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:
parent
577ad0c73a
commit
59842b3bd6
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue