diff --git a/modules/module-default-nodes-api.c b/modules/module-default-nodes-api.c index 2a04533c..aaba0d8d 100644 --- a/modules/module-default-nodes-api.c +++ b/modules/module-default-nodes-api.c @@ -7,6 +7,7 @@ */ #include +#include #include #include "module-default-nodes/common.h" @@ -77,12 +78,15 @@ on_metadata_changed (WpMetadata *m, guint32 subject, return; for (gint i = 0; i < N_DEFAULT_NODES; i++) { - gchar name[1024]; if (!g_strcmp0 (key, DEFAULT_KEY[i])) { g_clear_pointer (&self->defaults[i].value, g_free); - if (value && !g_strcmp0 (type, "Spa:String:JSON") && - json_object_find (value, "name", name, sizeof(name)) == 0) - self->defaults[i].value = g_strdup (name); + + if (value && !g_strcmp0 (type, "Spa:String:JSON")) { + g_autoptr (WpSpaJson) json = wp_spa_json_new_from_string (value); + g_autofree gchar *name = NULL; + if (wp_spa_json_object_get (json, "name", "s", &name, NULL)) + self->defaults[i].value = g_strdup (name); + } wp_debug_object (m, "changed '%s' -> '%s'", key, self->defaults[i].value); @@ -91,12 +95,17 @@ on_metadata_changed (WpMetadata *m, guint32 subject, break; } else if (!g_strcmp0 (key, DEFAULT_CONFIG_KEY[i])) { g_clear_pointer (&self->defaults[i].config_value, g_free); - if (value && !g_strcmp0 (type, "Spa:String:JSON") && - json_object_find (value, "name", name, sizeof(name)) == 0) - self->defaults[i].config_value = g_strdup (name); + + if (value && !g_strcmp0 (type, "Spa:String:JSON")) { + g_autoptr (WpSpaJson) json = wp_spa_json_new_from_string (value); + g_autofree gchar *name = NULL; + if (wp_spa_json_object_get (json, "name", "s", &name, NULL)) + self->defaults[i].config_value = g_strdup (name); + } wp_debug_object (m, "changed '%s' -> '%s'", key, self->defaults[i].config_value); + break; } } } diff --git a/modules/module-default-nodes.c b/modules/module-default-nodes.c index 7ea0ad8f..674870a9 100644 --- a/modules/module-default-nodes.c +++ b/modules/module-default-nodes.c @@ -291,7 +291,6 @@ reevaluate_default_node (WpDefaultNodes * self, WpMetadata *m, gint node_t) { WpNode *node = NULL; const gchar *node_name = NULL; - gchar buf[1024]; node = find_best_node (self, node_t); if (node) @@ -302,14 +301,17 @@ reevaluate_default_node (WpDefaultNodes * self, WpMetadata *m, gint node_t) if (node && node_name && g_strcmp0 (node_name, self->defaults[node_t].value) != 0) { + g_autoptr (WpSpaJson) json = NULL; + g_free (self->defaults[node_t].value); self->defaults[node_t].value = g_strdup (node_name); wp_info_object (self, "set default node for %s: %s", NODE_TYPE_STR[node_t], node_name); - g_snprintf (buf, sizeof(buf), "{ \"name\": \"%s\" }", node_name); - wp_metadata_set (m, 0, DEFAULT_KEY[node_t], "Spa:String:JSON", buf); + json = wp_spa_json_new_object ("name", "s", node_name, NULL); + wp_metadata_set (m, 0, DEFAULT_KEY[node_t], "Spa:String:JSON", + wp_spa_json_get_data (json)); } else if (!node && self->defaults[node_t].value) { g_clear_pointer (&self->defaults[node_t].value, g_free); wp_info_object (self, "unset default node for %s", NODE_TYPE_STR[node_t]); @@ -490,7 +492,6 @@ on_metadata_changed (WpMetadata *m, guint32 subject, { WpDefaultNodes * self = WP_DEFAULT_NODES (d); gint node_t = -1; - gchar name[1024]; if (subject == 0) { for (gint i = 0; i < N_DEFAULT_NODES; i++) { @@ -504,10 +505,11 @@ on_metadata_changed (WpMetadata *m, guint32 subject, if (node_t != -1) { g_clear_pointer (&self->defaults[node_t].config_value, g_free); - if (value && !g_strcmp0 (type, "Spa:String:JSON") && - json_object_find (value, "name", name, sizeof(name)) == 0) - { - self->defaults[node_t].config_value = g_strdup (name); + if (value && !g_strcmp0 (type, "Spa:String:JSON")) { + g_autoptr (WpSpaJson) json = wp_spa_json_new_from_string (value); + g_autofree gchar *name = NULL; + if (wp_spa_json_object_get (json, "name", "s", &name, NULL)) + self->defaults[node_t].config_value = g_strdup (name); } wp_debug_object (m, "changed '%s' -> '%s'", key, @@ -540,12 +542,11 @@ on_metadata_added (WpObjectManager *om, WpMetadata *metadata, gpointer d) g_return_if_fail (core); for (gint i = 0; i < N_DEFAULT_NODES; i++) { - gchar buf[1024]; if (self->defaults[i].config_value) { - g_snprintf (buf, sizeof(buf), "{ \"name\": \"%s\" }", - self->defaults[i].config_value); + g_autoptr (WpSpaJson) json = wp_spa_json_new_object ( + "name", "s", self->defaults[i].config_value, NULL); wp_metadata_set (metadata, 0, DEFAULT_CONFIG_KEY[i], "Spa:String:JSON", - buf); + wp_spa_json_get_data (json)); } } diff --git a/modules/module-default-nodes/common.h b/modules/module-default-nodes/common.h index d9338326..e3ff1df1 100644 --- a/modules/module-default-nodes/common.h +++ b/modules/module-default-nodes/common.h @@ -6,10 +6,6 @@ * SPDX-License-Identifier: MIT */ -#include -#include -#include - enum { AUDIO_SINK, AUDIO_SOURCE, @@ -34,27 +30,3 @@ static const gchar * DEFAULT_CONFIG_KEY[N_DEFAULT_NODES] = { [AUDIO_SOURCE] = "default.configured.audio.source", [VIDEO_SOURCE] = "default.configured.video.source", }; - -static int -json_object_find (const char *obj, const char *key, char *value, size_t len) -{ - struct spa_json it[2]; - const char *v; - char k[128]; - - spa_json_init(&it[0], obj, strlen(obj)); - if (spa_json_enter_object(&it[0], &it[1]) <= 0) - return -EINVAL; - - while (spa_json_get_string(&it[1], k, sizeof(k)) > 0) { - if (strcmp(k, key) == 0) { - if (spa_json_get_string(&it[1], value, len) <= 0) - continue; - return 0; - } else { - if (spa_json_next(&it[1], &v) <= 0) - break; - } - } - return -ENOENT; -}