filter-graph: notify about default numner of in/out

The filter graph has, after parsing, a default number of input and
output ports. This is based on the description or the first/last element
input and output ports. Pass this information in the properties when
we emit the info.

Don't use the number of configured input/output ports as the default
number of channels in filter-chain because this is only determined after
activating the graph. Instead, use the default input/output channels.

The result is that when you load filter-chain without any channel
layout, it will default to the number of input/outputs of the graph
instead of 0. This allows for the node to be visible in the pulseaudio
API.

Fixes #5084
This commit is contained in:
Wim Taymans 2026-01-21 13:36:32 +01:00
parent 39dd760c60
commit ba3e564e34
2 changed files with 49 additions and 23 deletions

View file

@ -1711,20 +1711,11 @@ static void graph_info(void *object, const struct spa_filter_graph_info *info)
{
struct impl *impl = object;
struct spa_dict *props = info->props;
uint32_t i;
if (impl->capture_info.channels == 0)
impl->capture_info.channels = info->n_inputs;
if (impl->playback_info.channels == 0)
impl->playback_info.channels = info->n_outputs;
uint32_t i, val = 0;
impl->n_inputs = info->n_inputs;
impl->n_outputs = info->n_outputs;
if (impl->capture_info.channels == impl->playback_info.channels) {
copy_position(&impl->capture_info, &impl->playback_info);
copy_position(&impl->playback_info, &impl->capture_info);
}
for (i = 0; props && i < props->n_items; i++) {
const char *k = props->items[i].key;
const char *s = props->items[i].value;
@ -1738,6 +1729,22 @@ static void graph_info(void *object, const struct spa_filter_graph_info *info)
}
}
}
else if (spa_streq(k, "n_default_inputs") &&
impl->capture_info.channels == 0 &&
spa_atou32(s, &val, 0)) {
pw_log_info("using default inputs %d", val);
impl->capture_info.channels = val;
}
else if (spa_streq(k, "n_default_outputs") &&
impl->playback_info.channels == 0 &&
spa_atou32(s, &val, 0)) {
pw_log_info("using default outputs %d", val);
impl->playback_info.channels = val;
}
}
if (impl->capture_info.channels == impl->playback_info.channels) {
copy_position(&impl->capture_info, &impl->playback_info);
copy_position(&impl->playback_info, &impl->capture_info);
}
}