diff --git a/src/daemon/main.c b/src/daemon/main.c index f79fc5bcb..2b685d872 100644 --- a/src/daemon/main.c +++ b/src/daemon/main.c @@ -145,9 +145,9 @@ static int parse_modules(struct data *d, const char *str) return -EINVAL; while (spa_json_get_string(&it[1], key, sizeof(key)-1) > 0) { - const char *val; + const char *val, *aval; char *args = NULL, *flags = NULL; - int len; + int len, alen; if ((len = spa_json_next(&it[1], &val)) <= 0) break; @@ -156,18 +156,22 @@ static int parse_modules(struct data *d, const char *str) continue; if (spa_json_is_object(val, len)) { - char arg[512], aval[1024]; + char arg[512]; spa_json_enter(&it[1], &it[2]); while (spa_json_get_string(&it[2], arg, sizeof(arg)-1) > 0) { - if (spa_json_get_string(&it[2], aval, sizeof(aval)-1) <= 0) + if ((alen = spa_json_next(&it[2], &aval)) <= 0) break; if (strcmp(arg, "args") == 0) { - args = strdup(aval); + if (spa_json_is_container(aval, alen)) + alen = spa_json_container_len(&it[2], aval, alen); + + args = malloc(alen); + spa_json_parse_string(aval, alen, args); } else if (strcmp(arg, "flags") == 0) { - flags = strdup(aval); + flags = strndup(aval, alen); } } } @@ -223,9 +227,9 @@ static int parse_objects(struct data *d, const char *str) return -EINVAL; while (spa_json_get_string(&it[1], key, sizeof(key)-1) > 0) { - const char *val; + const char *val, *aval; char *args = NULL, *flags = NULL; - int len; + int len, alen; if ((len = spa_json_next(&it[1], &val)) <= 0) break; @@ -234,18 +238,21 @@ static int parse_objects(struct data *d, const char *str) continue; if (spa_json_is_object(val, len)) { - char arg[512], aval[1024]; + char arg[512]; spa_json_enter(&it[1], &it[2]); while (spa_json_get_string(&it[2], arg, sizeof(arg)-1) > 0) { - if (spa_json_get_string(&it[2], aval, sizeof(aval)-1) <= 0) + if ((alen = spa_json_next(&it[2], &aval)) <= 0) break; if (strcmp(arg, "args") == 0) { - args = strdup(aval); + if (spa_json_is_container(aval, alen)) + alen = spa_json_container_len(&it[2], aval, alen); + args = malloc(alen); + spa_json_parse_string(aval, alen, args); } else if (strcmp(arg, "flags") == 0) { - flags = strdup(aval); + flags = strndup(aval, alen); } } } diff --git a/src/daemon/pipewire.conf.in b/src/daemon/pipewire.conf.in index 8e3522653..78084a2ca 100644 --- a/src/daemon/pipewire.conf.in +++ b/src/daemon/pipewire.conf.in @@ -46,9 +46,12 @@ modules = { # If ifexists is given, the module is ignoed when it is not found. # If nofail is given, module initialization failures are ignored. # - libpipewire-module-rtkit = { - "#args" = "nice.level = -11 rt.prio=20 rt.time.soft=200000 rt.time.hard=200000" - flags = ifexists|nofail + libpipewire-module-rtkit = { "#args" = { nice.level = -11 + rt.prio = 20 + rt.time.soft = 200000 + rt.time.hard = 200000 + } + "flags" = "ifexists|nofail" } libpipewire-module-protocol-native = null libpipewire-module-profiler = null @@ -58,7 +61,7 @@ modules = { libpipewire-module-client-node = null libpipewire-module-client-device = null libpipewire-module-portal = null - libpipewire-module-access = { "#args" = "access.allowed=@media_session_path@ access.force=flatpak" } + libpipewire-module-access = { "#args" = { access.allowed = @media_session_path@ access.force = flatpak" } } libpipewire-module-adapter = null libpipewire-module-link-factory = null libpipewire-module-session-manager = null @@ -80,7 +83,11 @@ objects = { # A default dummy driver. This handles nodes marked with the "node.always-driver" # property when no other driver is currently active. JACK clients need this. - spa-node-factory = { args = "factory.name=support.node.driver node.name=Dummy-Driver priority.driver=8000" } + spa-node-factory = { args = { factory.name = support.node.driver + node.name = Dummy-Driver + priority.driver = 8000 + } + } } exec = {