pulse-server: improve module id in instrospect

For the modules that we load internally, place a pulse.module.id
property on the nodes.

If there is no module.id property on nodes, try to use the
pulse.module.id when introspecting. We should not remap those to
serial numbers.

Fixes #2101
This commit is contained in:
Wim Taymans 2022-02-04 17:47:53 +01:00
parent 3b26af32d0
commit 27a8c4ad13
14 changed files with 51 additions and 26 deletions

View file

@ -270,6 +270,7 @@ static void manager_added(void *d, struct pw_manager_object *o)
pw_properties_set(props, PW_KEY_NODE_DONT_RECONNECT, "true"); pw_properties_set(props, PW_KEY_NODE_DONT_RECONNECT, "true");
pw_properties_set(props, PW_KEY_NODE_VIRTUAL, "true"); pw_properties_set(props, PW_KEY_NODE_VIRTUAL, "true");
pw_properties_set(props, PW_KEY_NODE_PASSIVE, "true"); pw_properties_set(props, PW_KEY_NODE_PASSIVE, "true");
pw_properties_setf(props, "pulse.module.id", "%u", module->index);
cstream->data = data; cstream->data = data;
cstream->stream = pw_stream_new(data->core, NULL, props); cstream->stream = pw_stream_new(data->core, NULL, props);
@ -354,6 +355,7 @@ static int module_combine_sink_load(struct client *client, struct module *module
pw_properties_setf(props, PW_KEY_NODE_GROUP, "combine_sink-%u", data->module->index); pw_properties_setf(props, PW_KEY_NODE_GROUP, "combine_sink-%u", data->module->index);
pw_properties_setf(props, PW_KEY_NODE_LINK_GROUP, "combine_sink-%u", data->module->index); pw_properties_setf(props, PW_KEY_NODE_LINK_GROUP, "combine_sink-%u", data->module->index);
pw_properties_set(props, PW_KEY_NODE_VIRTUAL, "true"); pw_properties_set(props, PW_KEY_NODE_VIRTUAL, "true");
pw_properties_setf(props, "pulse.module.id", "%u", module->index);
if ((str = pw_properties_get(module->props, "sink_properties")) != NULL) if ((str = pw_properties_get(module->props, "sink_properties")) != NULL)
module_args_add_props(props, str); module_args_add_props(props, str);

View file

@ -75,6 +75,8 @@ static int module_ladspa_sink_load(struct client *client, struct module *module)
pw_properties_setf(data->capture_props, PW_KEY_NODE_GROUP, "ladspa-sink-%u", module->index); pw_properties_setf(data->capture_props, PW_KEY_NODE_GROUP, "ladspa-sink-%u", module->index);
pw_properties_setf(data->playback_props, PW_KEY_NODE_GROUP, "ladspa-sink-%u", module->index); pw_properties_setf(data->playback_props, PW_KEY_NODE_GROUP, "ladspa-sink-%u", module->index);
pw_properties_setf(data->capture_props, "pulse.module.id", "%u", module->index);
pw_properties_setf(data->playback_props, "pulse.module.id", "%u", module->index);
f = open_memstream(&args, &size); f = open_memstream(&args, &size);
fprintf(f, "{"); fprintf(f, "{");

View file

@ -75,6 +75,8 @@ static int module_ladspa_source_load(struct client *client, struct module *modul
pw_properties_setf(data->capture_props, PW_KEY_NODE_GROUP, "ladspa-source-%u", module->index); pw_properties_setf(data->capture_props, PW_KEY_NODE_GROUP, "ladspa-source-%u", module->index);
pw_properties_setf(data->playback_props, PW_KEY_NODE_GROUP, "ladspa-source-%u", module->index); pw_properties_setf(data->playback_props, PW_KEY_NODE_GROUP, "ladspa-source-%u", module->index);
pw_properties_setf(data->capture_props, "pulse.module.id", "%u", module->index);
pw_properties_setf(data->playback_props, "pulse.module.id", "%u", module->index);
f = open_memstream(&args, &size); f = open_memstream(&args, &size);
fprintf(f, "{"); fprintf(f, "{");

View file

@ -72,6 +72,8 @@ static int module_loopback_load(struct client *client, struct module *module)
pw_properties_setf(data->capture_props, PW_KEY_NODE_GROUP, "loopback-%u", module->index); pw_properties_setf(data->capture_props, PW_KEY_NODE_GROUP, "loopback-%u", module->index);
pw_properties_setf(data->playback_props, PW_KEY_NODE_GROUP, "loopback-%u", module->index); pw_properties_setf(data->playback_props, PW_KEY_NODE_GROUP, "loopback-%u", module->index);
pw_properties_setf(data->capture_props, "pulse.module.id", "%u", module->index);
pw_properties_setf(data->playback_props, "pulse.module.id", "%u", module->index);
f = open_memstream(&args, &size); f = open_memstream(&args, &size);
fprintf(f, "{"); fprintf(f, "{");

View file

@ -115,6 +115,8 @@ static int module_null_sink_load(struct client *client, struct module *module)
pw_core_add_listener(d->core, &d->core_listener, &core_events, module); pw_core_add_listener(d->core, &d->core_listener, &core_events, module);
pw_properties_setf(module->props, "pulse.module.id", "%u", module->index);
d->proxy = pw_core_create_object(d->core, d->proxy = pw_core_create_object(d->core,
"adapter", PW_TYPE_INTERFACE_Node, PW_VERSION_NODE, "adapter", PW_TYPE_INTERFACE_Node, PW_VERSION_NODE,
module->props ? &module->props->dict : NULL, 0); module->props ? &module->props->dict : NULL, 0);

View file

@ -159,6 +159,8 @@ static int module_pipesink_load(struct client *client, struct module *module)
&data->core_listener, &data->core_listener,
&core_events, data); &core_events, data);
pw_properties_setf(data->capture_props, "pulse.module.id", "%u", module->index);
data->capture = pw_stream_new(data->core, data->capture = pw_stream_new(data->core,
"pipesink capture", data->capture_props); "pipesink capture", data->capture_props);
data->capture_props = NULL; data->capture_props = NULL;

View file

@ -180,6 +180,9 @@ static int module_pipesource_load(struct client *client, struct module *module)
&data->core_listener, &data->core_listener,
&core_events, data); &core_events, data);
pw_properties_setf(data->playback_props, "pulse.module.id",
"%u", module->index);
data->playback = pw_stream_new(data->core, data->playback = pw_stream_new(data->core,
"pipesource playback", data->playback_props); "pipesource playback", data->playback_props);
data->playback_props = NULL; data->playback_props = NULL;

View file

@ -69,6 +69,8 @@ static int module_remap_sink_load(struct client *client, struct module *module)
pw_properties_setf(data->capture_props, PW_KEY_NODE_GROUP, "remap-sink-%u", module->index); pw_properties_setf(data->capture_props, PW_KEY_NODE_GROUP, "remap-sink-%u", module->index);
pw_properties_setf(data->playback_props, PW_KEY_NODE_GROUP, "remap-sink-%u", module->index); pw_properties_setf(data->playback_props, PW_KEY_NODE_GROUP, "remap-sink-%u", module->index);
pw_properties_setf(data->capture_props, "pulse.module.id", "%u", module->index);
pw_properties_setf(data->playback_props, "pulse.module.id", "%u", module->index);
f = open_memstream(&args, &size); f = open_memstream(&args, &size);
fprintf(f, "{"); fprintf(f, "{");

View file

@ -69,6 +69,8 @@ static int module_remap_source_load(struct client *client, struct module *module
pw_properties_setf(data->capture_props, PW_KEY_NODE_GROUP, "remap-source-%u", module->index); pw_properties_setf(data->capture_props, PW_KEY_NODE_GROUP, "remap-source-%u", module->index);
pw_properties_setf(data->playback_props, PW_KEY_NODE_GROUP, "remap-source-%u", module->index); pw_properties_setf(data->playback_props, PW_KEY_NODE_GROUP, "remap-source-%u", module->index);
pw_properties_setf(data->capture_props, "pulse.module.id", "%u", module->index);
pw_properties_setf(data->playback_props, "pulse.module.id", "%u", module->index);
f = open_memstream(&args, &size); f = open_memstream(&args, &size);
fprintf(f, "{"); fprintf(f, "{");

View file

@ -71,18 +71,12 @@ static int module_roc_sink_load(struct client *client, struct module *module)
char *args; char *args;
size_t size; size_t size;
pw_properties_setf(data->sink_props, "pulse.module.id",
"%u", module->index);
f = open_memstream(&args, &size); f = open_memstream(&args, &size);
fprintf(f, "{"); fprintf(f, "{");
/* Can't just serialise this dict because the "null" method gets pw_properties_serialize_dict(f, &data->roc_props->dict, 0);
* interpreted as a JSON null */
if ((str = pw_properties_get(data->roc_props, "local.ip")))
fprintf(f, " local.ip = \"%s\"", str);
if ((str = pw_properties_get(data->roc_props, "remote.ip")))
fprintf(f, " remote.ip = \"%s\"", str);
if ((str = pw_properties_get(data->roc_props, "remote.source.port")))
fprintf(f, " remote.source.port = \"%s\"", str);
if ((str = pw_properties_get(data->roc_props, "remote.repair.port")))
fprintf(f, " remote.repair.port = \"%s\"", str);
fprintf(f, " } sink.props = {"); fprintf(f, " } sink.props = {");
pw_properties_serialize_dict(f, &data->sink_props->dict, 0); pw_properties_serialize_dict(f, &data->sink_props->dict, 0);
fprintf(f, " } }"); fprintf(f, " } }");

View file

@ -71,20 +71,12 @@ static int module_roc_source_load(struct client *client, struct module *module)
char *args; char *args;
size_t size; size_t size;
pw_properties_setf(data->source_props, "pulse.module.id",
"%u", module->index);
f = open_memstream(&args, &size); f = open_memstream(&args, &size);
fprintf(f, "{"); fprintf(f, "{");
/* Can't just serialise this dict because the "null" method gets pw_properties_serialize_dict(f, &data->roc_props->dict, 0);
* interpreted as a JSON null */
if ((str = pw_properties_get(data->roc_props, "local.ip")))
fprintf(f, " local.ip = \"%s\"", str);
if ((str = pw_properties_get(data->roc_props, "local.source.port")))
fprintf(f, " local.source.port = \"%s\"", str);
if ((str = pw_properties_get(data->roc_props, "local.repair.port")))
fprintf(f, " local.repair.port = \"%s\"", str);
if ((str = pw_properties_get(data->roc_props, "sess.latency.msec")))
fprintf(f, " sess.latency.msec = \"%s\"", str);
if ((str = pw_properties_get(data->roc_props, "resampler.profile")))
fprintf(f, " resampler.profile = \"%s\"", str);
fprintf(f, " } source.props = {"); fprintf(f, " } source.props = {");
pw_properties_serialize_dict(f, &data->source_props->dict, 0); pw_properties_serialize_dict(f, &data->source_props->dict, 0);
fprintf(f, " } }"); fprintf(f, " } }");

View file

@ -73,6 +73,9 @@ static int module_tunnel_sink_load(struct client *client, struct module *module)
server = pw_properties_get(module->props, "server"); server = pw_properties_get(module->props, "server");
pw_properties_setf(data->stream_props, "pulse.module.id",
"%u", module->index);
f = open_memstream(&args, &size); f = open_memstream(&args, &size);
fprintf(f, "{"); fprintf(f, "{");
pw_properties_serialize_dict(f, &module->props->dict, 0); pw_properties_serialize_dict(f, &module->props->dict, 0);

View file

@ -71,6 +71,9 @@ static int module_tunnel_source_load(struct client *client, struct module *modul
size_t size; size_t size;
const char *server; const char *server;
pw_properties_setf(data->stream_props, "pulse.module.id",
"%u", module->index);
server = pw_properties_get(module->props, "server"); server = pw_properties_get(module->props, "server");
f = open_memstream(&args, &size); f = open_memstream(&args, &size);

View file

@ -3555,6 +3555,9 @@ static int fill_sink_info(struct client *client, struct message *m,
snprintf(monitor_name, size, "%s.monitor", name); snprintf(monitor_name, size, "%s.monitor", name);
if ((str = spa_dict_lookup(info->props, PW_KEY_MODULE_ID)) != NULL) if ((str = spa_dict_lookup(info->props, PW_KEY_MODULE_ID)) != NULL)
module_id = id_to_index(manager, (uint32_t)atoi(str));
if (module_id == SPA_ID_INVALID &&
(str = spa_dict_lookup(info->props, "pulse.module.id")) != NULL)
module_id = (uint32_t)atoi(str); module_id = (uint32_t)atoi(str);
if ((str = spa_dict_lookup(info->props, PW_KEY_DEVICE_ID)) != NULL) if ((str = spa_dict_lookup(info->props, PW_KEY_DEVICE_ID)) != NULL)
card_id = (uint32_t)atoi(str); card_id = (uint32_t)atoi(str);
@ -3600,7 +3603,7 @@ static int fill_sink_info(struct client *client, struct message *m,
TAG_STRING, desc, TAG_STRING, desc,
TAG_SAMPLE_SPEC, &dev_info.ss, TAG_SAMPLE_SPEC, &dev_info.ss,
TAG_CHANNEL_MAP, &dev_info.map, TAG_CHANNEL_MAP, &dev_info.map,
TAG_U32, id_to_index(manager, module_id), /* module index */ TAG_U32, module_id, /* module index */
TAG_CVOLUME, &dev_info.volume_info.volume, TAG_CVOLUME, &dev_info.volume_info.volume,
TAG_BOOLEAN, dev_info.volume_info.mute, TAG_BOOLEAN, dev_info.volume_info.mute,
TAG_U32, o->index, /* monitor source index */ TAG_U32, o->index, /* monitor source index */
@ -3759,6 +3762,9 @@ static int fill_source_info(struct client *client, struct message *m,
snprintf(monitor_desc, size, "Monitor of %s", desc); snprintf(monitor_desc, size, "Monitor of %s", desc);
if ((str = spa_dict_lookup(info->props, PW_KEY_MODULE_ID)) != NULL) if ((str = spa_dict_lookup(info->props, PW_KEY_MODULE_ID)) != NULL)
module_id = id_to_index(manager, (uint32_t)atoi(str));
if (module_id == SPA_ID_INVALID &&
(str = spa_dict_lookup(info->props, "pulse.module.id")) != NULL)
module_id = (uint32_t)atoi(str); module_id = (uint32_t)atoi(str);
if ((str = spa_dict_lookup(info->props, PW_KEY_DEVICE_ID)) != NULL) if ((str = spa_dict_lookup(info->props, PW_KEY_DEVICE_ID)) != NULL)
card_id = (uint32_t)atoi(str); card_id = (uint32_t)atoi(str);
@ -3803,7 +3809,7 @@ static int fill_source_info(struct client *client, struct message *m,
TAG_STRING, is_monitor ? monitor_desc : desc, TAG_STRING, is_monitor ? monitor_desc : desc,
TAG_SAMPLE_SPEC, &dev_info.ss, TAG_SAMPLE_SPEC, &dev_info.ss,
TAG_CHANNEL_MAP, &dev_info.map, TAG_CHANNEL_MAP, &dev_info.map,
TAG_U32, id_to_index(manager, module_id), /* module index */ TAG_U32, module_id, /* module index */
TAG_CVOLUME, &dev_info.volume_info.volume, TAG_CVOLUME, &dev_info.volume_info.volume,
TAG_BOOLEAN, dev_info.volume_info.mute, TAG_BOOLEAN, dev_info.volume_info.mute,
TAG_U32, is_monitor ? o->index : SPA_ID_INVALID,/* monitor of sink */ TAG_U32, is_monitor ? o->index : SPA_ID_INVALID,/* monitor of sink */
@ -3907,7 +3913,11 @@ static int fill_sink_input_info(struct client *client, struct message *m,
return -ENOENT; return -ENOENT;
if ((str = spa_dict_lookup(info->props, PW_KEY_MODULE_ID)) != NULL) if ((str = spa_dict_lookup(info->props, PW_KEY_MODULE_ID)) != NULL)
module_id = id_to_index(manager, (uint32_t)atoi(str));
if (module_id == SPA_ID_INVALID &&
(str = spa_dict_lookup(info->props, "pulse.module.id")) != NULL)
module_id = (uint32_t)atoi(str); module_id = (uint32_t)atoi(str);
if (!pw_manager_object_is_virtual(o) && if (!pw_manager_object_is_virtual(o) &&
(str = spa_dict_lookup(info->props, PW_KEY_CLIENT_ID)) != NULL) (str = spa_dict_lookup(info->props, PW_KEY_CLIENT_ID)) != NULL)
client_id = (uint32_t)atoi(str); client_id = (uint32_t)atoi(str);
@ -3928,7 +3938,7 @@ static int fill_sink_input_info(struct client *client, struct message *m,
message_put(m, message_put(m,
TAG_U32, o->index, /* sink_input index */ TAG_U32, o->index, /* sink_input index */
TAG_STRING, get_media_name(info), TAG_STRING, get_media_name(info),
TAG_U32, id_to_index(manager, module_id), /* module index */ TAG_U32, module_id, /* module index */
TAG_U32, id_to_index(manager, client_id), /* client index */ TAG_U32, id_to_index(manager, client_id), /* client index */
TAG_U32, peer_index, /* sink index */ TAG_U32, peer_index, /* sink index */
TAG_SAMPLE_SPEC, &dev_info.ss, TAG_SAMPLE_SPEC, &dev_info.ss,
@ -3983,7 +3993,11 @@ static int fill_source_output_info(struct client *client, struct message *m,
return -ENOENT; return -ENOENT;
if ((str = spa_dict_lookup(info->props, PW_KEY_MODULE_ID)) != NULL) if ((str = spa_dict_lookup(info->props, PW_KEY_MODULE_ID)) != NULL)
module_id = id_to_index(manager, (uint32_t)atoi(str));
if (module_id == SPA_ID_INVALID &&
(str = spa_dict_lookup(info->props, "pulse.module.id")) != NULL)
module_id = (uint32_t)atoi(str); module_id = (uint32_t)atoi(str);
if (!pw_manager_object_is_virtual(o) && if (!pw_manager_object_is_virtual(o) &&
(str = spa_dict_lookup(info->props, PW_KEY_CLIENT_ID)) != NULL) (str = spa_dict_lookup(info->props, PW_KEY_CLIENT_ID)) != NULL)
client_id = (uint32_t)atoi(str); client_id = (uint32_t)atoi(str);
@ -4004,7 +4018,7 @@ static int fill_source_output_info(struct client *client, struct message *m,
message_put(m, message_put(m,
TAG_U32, o->index, /* source_output index */ TAG_U32, o->index, /* source_output index */
TAG_STRING, get_media_name(info), TAG_STRING, get_media_name(info),
TAG_U32, id_to_index(manager, module_id), /* module index */ TAG_U32, module_id, /* module index */
TAG_U32, id_to_index(manager, client_id), /* client index */ TAG_U32, id_to_index(manager, client_id), /* client index */
TAG_U32, peer_index, /* source index */ TAG_U32, peer_index, /* source index */
TAG_SAMPLE_SPEC, &dev_info.ss, TAG_SAMPLE_SPEC, &dev_info.ss,