mirror of
https://gitlab.freedesktop.org/pipewire/wireplumber.git
synced 2026-04-05 17:20:36 +02:00
main.c: Allow for array of dependencies
A Wireplumber component can now be loaded dependent on an array of wireplumber settings.
This commit is contained in:
parent
efb0c5a635
commit
e1ff6bf4bf
1 changed files with 53 additions and 10 deletions
63
src/main.c
63
src/main.c
|
|
@ -161,16 +161,17 @@ do_load_components(void *data, const char *location, const char *section,
|
|||
|
||||
it = wp_spa_json_new_iterator (json);
|
||||
for (; wp_iterator_next (it, &item); g_value_unset (&item)) {
|
||||
WpSpaJson *o = g_value_get_boxed (&item);
|
||||
WpSpaJson *cjson = g_value_get_boxed (&item);
|
||||
g_autofree gchar *name = NULL;
|
||||
g_autofree gchar *type = NULL;
|
||||
g_autofree gchar *deps = NULL;
|
||||
WpSpaJson *flags = NULL;
|
||||
WpSpaJson *djson = NULL;
|
||||
WpSpaJson *fjson = NULL;
|
||||
gboolean if_exists = FALSE;
|
||||
gboolean no_fail = FALSE;
|
||||
|
||||
if (!wp_spa_json_is_object (o) ||
|
||||
!wp_spa_json_object_get (o,
|
||||
if (!wp_spa_json_is_object (cjson) ||
|
||||
!wp_spa_json_object_get (cjson,
|
||||
"name", "s", &name,
|
||||
"type", "s", &type,
|
||||
NULL)) {
|
||||
|
|
@ -180,26 +181,68 @@ do_load_components(void *data, const char *location, const char *section,
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (wp_spa_json_object_get (o, "deps", "s", &deps, NULL) && deps) {
|
||||
gboolean value = 0;
|
||||
g_autoptr (WpSpaJson) j = wp_settings_get (settings, deps);
|
||||
if (!j || !wp_spa_json_parse_boolean (j, &value)) {
|
||||
wp_spa_json_object_get (cjson, "deps", "J", &djson, NULL);
|
||||
|
||||
if (djson && wp_spa_json_is_array (djson)) {
|
||||
g_autoptr (WpIterator) dit = wp_spa_json_new_iterator (djson);
|
||||
g_auto (GValue) ditem = G_VALUE_INIT;
|
||||
gboolean deps_met = TRUE;
|
||||
|
||||
for (; wp_iterator_next (dit, &ditem); g_value_unset (&ditem)) {
|
||||
WpSpaJson *sjson = g_value_get_boxed (&ditem);
|
||||
g_autofree gchar *setting = wp_spa_json_parse_string (sjson);
|
||||
WpSpaJson *setting_value_json = wp_settings_get (settings, setting);
|
||||
gboolean setting_value = FALSE;
|
||||
gboolean parsing_status = FALSE;
|
||||
|
||||
if (setting_value_json)
|
||||
parsing_status = wp_spa_json_parse_boolean (setting_value_json,
|
||||
&setting_value);
|
||||
|
||||
if (!setting_value_json || !parsing_status || !setting_value) {
|
||||
deps_met = FALSE;
|
||||
wp_info ("deps(%s) not met for component(%s), skip loading it",
|
||||
setting, name);
|
||||
break;
|
||||
}
|
||||
if (setting_value_json)
|
||||
wp_spa_json_unref (setting_value_json);
|
||||
}
|
||||
if (!deps_met)
|
||||
continue;
|
||||
|
||||
wp_spa_json_unref (djson);
|
||||
} else if (djson && wp_spa_json_object_get (cjson, "deps", "s", &deps, NULL)) {
|
||||
WpSpaJson *setting_value_json = wp_settings_get (settings, deps);
|
||||
gboolean setting_value = FALSE;
|
||||
gboolean parsing_status = FALSE;
|
||||
|
||||
if (setting_value_json)
|
||||
parsing_status = wp_spa_json_parse_boolean (setting_value_json,
|
||||
&setting_value);
|
||||
|
||||
if (!setting_value_json || !parsing_status || !setting_value) {
|
||||
wp_info ("deps(%s) not met for component(%s), skip loading it",
|
||||
deps, name);
|
||||
continue;
|
||||
}
|
||||
if (setting_value_json)
|
||||
wp_spa_json_unref (setting_value_json);
|
||||
wp_spa_json_unref (djson);
|
||||
}
|
||||
|
||||
if (wp_spa_json_object_get (o, "flags", "J", &flags, NULL) && flags) {
|
||||
if (wp_spa_json_object_get (cjson, "flags", "J", &fjson, NULL) && fjson) {
|
||||
g_autofree gchar *s1 = NULL;
|
||||
g_autofree gchar *s2 = NULL;
|
||||
|
||||
wp_spa_json_parse_array (flags, "s", &s1, "s", &s2, NULL);
|
||||
wp_spa_json_parse_array (fjson, "s", &s1, "s", &s2, NULL);
|
||||
|
||||
if (!g_strcmp0 (s1, "ifexists") || !g_strcmp0 (s2, "ifexists"))
|
||||
if_exists = TRUE;
|
||||
if (!g_strcmp0 (s1, "nofail") || !g_strcmp0 (s2, "nofail"))
|
||||
no_fail = TRUE;
|
||||
|
||||
wp_spa_json_unref (fjson);
|
||||
}
|
||||
|
||||
wp_debug ("load component(%s) type(%s) deps(%s) ifexists(%d) nofail(%d)",
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue