mirror of
https://gitlab.freedesktop.org/pipewire/wireplumber.git
synced 2026-01-03 18:10:10 +01:00
This makes sure nodes are ready before finding the default node, avoiding audio glitch in wrong device if profile was also changed while changing the default node (can happen with Gnome Sound Settings). Since nodes are destroyed and recreated again when a device profile changes, the only way to make sure device nodes are ready is to check the profile classes structure, which tell us how many total nodes the device has, and then check that those nodes exist for that device. A rescan is triggered whenever devices, nodes or ports changed. This patch also improves the logic when finding default nodes, allowing virtual sources to be set as default sources. Fixes #85 and #130
64 lines
1.4 KiB
C
64 lines
1.4 KiB
C
/* WirePlumber
|
|
*
|
|
* Copyright © 2021 Collabora Ltd.
|
|
* @author George Kiagiadakis <george.kiagiadakis@collabora.com>
|
|
*
|
|
* SPDX-License-Identifier: MIT
|
|
*/
|
|
|
|
#include <glib.h>
|
|
#include <errno.h>
|
|
#include <spa/utils/json.h>
|
|
|
|
enum {
|
|
AUDIO_SINK,
|
|
AUDIO_SOURCE,
|
|
VIDEO_SOURCE,
|
|
N_DEFAULT_NODES
|
|
};
|
|
|
|
static const gchar * DEFAULT_KEY[N_DEFAULT_NODES] = {
|
|
[AUDIO_SINK] = "default.audio.sink",
|
|
[AUDIO_SOURCE] = "default.audio.source",
|
|
[VIDEO_SOURCE] = "default.video.source",
|
|
};
|
|
|
|
static const gchar * NODE_TYPE_STR[N_DEFAULT_NODES] = {
|
|
[AUDIO_SINK] = "Audio/Sink",
|
|
[AUDIO_SOURCE] = "Audio/Source",
|
|
[VIDEO_SOURCE] = "Video/Source",
|
|
};
|
|
|
|
#if COMPILING_MODULE_DEFAULT_NODES
|
|
|
|
static const gchar * DEFAULT_CONFIG_KEY[N_DEFAULT_NODES] = {
|
|
[AUDIO_SINK] = "default.configured.audio.sink",
|
|
[AUDIO_SOURCE] = "default.configured.audio.source",
|
|
[VIDEO_SOURCE] = "default.configured.video.source",
|
|
};
|
|
|
|
#endif
|
|
|
|
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;
|
|
}
|