At the moment, port names combined from multiple devices are generated based on the order that the devices are specified in config. This makes programmatic use of thsee ports a bit painful, so let's make them be combined in alphabetical order. --- src/modules/alsa/alsa-ucm.c | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/modules/alsa/alsa-ucm.c b/src/modules/alsa/alsa-ucm.c index a6ee9a8..d88c80b 100644 --- a/src/modules/alsa/alsa-ucm.c +++ b/src/modules/alsa/alsa-ucm.c @@ -671,6 +671,14 @@ int pa_alsa_ucm_get_verb(snd_use_case_mgr_t *uc_mgr, const char *verb_name, cons return 0; } +static int pa_alsa_ucm_device_cmp(const void *a, const void *b) +{ + const pa_alsa_ucm_device *d1 = *(pa_alsa_ucm_device **)a; + const pa_alsa_ucm_device *d2 = *(pa_alsa_ucm_device **)b; + + return strcmp(pa_proplist_gets(d1->proplist, PA_ALSA_PROP_UCM_NAME), pa_proplist_gets(d2->proplist, PA_ALSA_PROP_UCM_NAME)); +} + static void ucm_add_port_combination( pa_hashmap *hash, pa_alsa_ucm_mapping_context *context, @@ -687,9 +695,16 @@ static void ucm_add_port_combination( char *name, *desc; const char *dev_name; const char *direction; - pa_alsa_ucm_device *dev; + pa_alsa_ucm_device *sorted[num], *dev; + + for (i = 0; i < num; i++) + sorted[i] = pdevices[i]; + + /* Sort by alphabetical order so as to have a deterministic naming scheme + * for combination ports */ + qsort(&sorted[0], num, sizeof(pa_alsa_ucm_device *), pa_alsa_ucm_device_cmp); - dev = pdevices[0]; + dev = sorted[0]; dev_name = pa_proplist_gets(dev->proplist, PA_ALSA_PROP_UCM_NAME); name = pa_sprintf_malloc("%s%s", is_sink ? PA_UCM_PRE_TAG_OUTPUT : PA_UCM_PRE_TAG_INPUT, dev_name); @@ -701,7 +716,7 @@ static void ucm_add_port_combination( for (i = 1; i < num; i++) { char *tmp; - dev = pdevices[i]; + dev = sorted[i]; dev_name = pa_proplist_gets(dev->proplist, PA_ALSA_PROP_UCM_NAME); tmp = pa_sprintf_malloc("%s+%s", name, dev_name); -- 1.8.2.1