diff --git a/src/modules/module-protocol-pulse/modules/module-ladspa-sink.c b/src/modules/module-protocol-pulse/modules/module-ladspa-sink.c index 7a8f9d970..56607d6c5 100644 --- a/src/modules/module-protocol-pulse/modules/module-ladspa-sink.c +++ b/src/modules/module-protocol-pulse/modules/module-ladspa-sink.c @@ -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); diff --git a/src/modules/module-protocol-pulse/modules/module-ladspa-source.c b/src/modules/module-protocol-pulse/modules/module-ladspa-source.c index ea4065650..cd833eced 100644 --- a/src/modules/module-protocol-pulse/modules/module-ladspa-source.c +++ b/src/modules/module-protocol-pulse/modules/module-ladspa-source.c @@ -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); diff --git a/src/modules/module-protocol-pulse/modules/module-loopback.c b/src/modules/module-protocol-pulse/modules/module-loopback.c index 63ff9e529..c97c67c06 100644 --- a/src/modules/module-protocol-pulse/modules/module-loopback.c +++ b/src/modules/module-protocol-pulse/modules/module-loopback.c @@ -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, diff --git a/src/modules/module-protocol-pulse/modules/module-remap-sink.c b/src/modules/module-protocol-pulse/modules/module-remap-sink.c index ede7427cf..045bb11ba 100644 --- a/src/modules/module-protocol-pulse/modules/module-remap-sink.c +++ b/src/modules/module-protocol-pulse/modules/module-remap-sink.c @@ -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); diff --git a/src/modules/module-protocol-pulse/modules/module-remap-source.c b/src/modules/module-protocol-pulse/modules/module-remap-source.c index 4f1e41e45..7d820c93d 100644 --- a/src/modules/module-protocol-pulse/modules/module-remap-source.c +++ b/src/modules/module-protocol-pulse/modules/module-remap-source.c @@ -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); diff --git a/src/modules/module-protocol-pulse/modules/module-tunnel-sink.c b/src/modules/module-protocol-pulse/modules/module-tunnel-sink.c index 17c44e11e..910c0a82a 100644 --- a/src/modules/module-protocol-pulse/modules/module-tunnel-sink.c +++ b/src/modules/module-protocol-pulse/modules/module-tunnel-sink.c @@ -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); diff --git a/src/modules/module-protocol-pulse/modules/module-tunnel-source.c b/src/modules/module-protocol-pulse/modules/module-tunnel-source.c index 1bf8f7d67..8eb5478ce 100644 --- a/src/modules/module-protocol-pulse/modules/module-tunnel-source.c +++ b/src/modules/module-protocol-pulse/modules/module-tunnel-source.c @@ -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); diff --git a/src/pipewire/properties.c b/src/pipewire/properties.c index 6fcee7beb..f9633c4cc 100644 --- a/src/pipewire/properties.c +++ b/src/pipewire/properties.c @@ -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; +} diff --git a/src/pipewire/properties.h b/src/pipewire/properties.h index 1784d0c0c..b2c42d902 100644 --- a/src/pipewire/properties.h +++ b/src/pipewire/properties.h @@ -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); } diff --git a/src/tools/pw-loopback.c b/src/tools/pw-loopback.c index 6d218c46c..ff2bface1 100644 --- a/src/tools/pw-loopback.c +++ b/src/tools/pw-loopback.c @@ -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);