mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-10-31 22:25:38 -04:00
alsa-ucm: Disable old devices when switching profiles of same verb
While switching profiles, it was enough to switch UCM verbs since that
disables all enabled UCM devices and every profile had a distinct verb.
However, switching to the current verb does not disable any devices.
To support multiple profiles for a verb we need to explicitly disable
the old profile's devices, since they might be conflicting with the new
profile's devices and will prevent them from being enabled. Compare both
profiles' mappings, and disable the devices not in the new mappings.
Link: e49da7bcd6
Signed-off-by: Alper Nebi Yasak <alpernebiyasak@gmail.com>
This commit is contained in:
parent
6b46909083
commit
63a44038d2
1 changed files with 21 additions and 4 deletions
|
|
@ -1418,6 +1418,8 @@ int pa_alsa_ucm_set_profile(pa_alsa_ucm_config *ucm, pa_card *card, pa_alsa_prof
|
|||
int ret = 0;
|
||||
const char *verb_name, *profile_name;
|
||||
pa_alsa_ucm_verb *verb;
|
||||
pa_alsa_mapping *map;
|
||||
uint32_t idx;
|
||||
|
||||
if (new_profile == old_profile)
|
||||
return 0;
|
||||
|
|
@ -1432,11 +1434,26 @@ int pa_alsa_ucm_set_profile(pa_alsa_ucm_config *ucm, pa_card *card, pa_alsa_prof
|
|||
verb_name = pa_proplist_gets(verb->proplist, PA_ALSA_PROP_UCM_NAME);
|
||||
}
|
||||
|
||||
/* change verb */
|
||||
pa_log_info("Set profile to %s", profile_name);
|
||||
pa_log_info("Set UCM verb to %s", verb_name);
|
||||
if ((ret = snd_use_case_set(ucm->ucm_mgr, "_verb", verb_name)) < 0) {
|
||||
pa_log("Failed to set verb %s: %s", verb_name, snd_strerror(ret));
|
||||
if (ucm->active_verb != verb) {
|
||||
/* change verb */
|
||||
pa_log_info("Set UCM verb to %s", verb_name);
|
||||
if ((snd_use_case_set(ucm->ucm_mgr, "_verb", verb_name)) < 0) {
|
||||
pa_log("Failed to set verb %s", verb_name);
|
||||
ret = -1;
|
||||
}
|
||||
|
||||
} else if (ucm->active_verb) {
|
||||
/* Disable devices not in new profile */
|
||||
PA_IDXSET_FOREACH(map, old_profile->input_mappings, idx)
|
||||
if (new_profile && !pa_idxset_contains(new_profile->input_mappings, map))
|
||||
if (ucm_device_disable(ucm, map->ucm_context.ucm_device) < 0)
|
||||
ret = -1;
|
||||
|
||||
PA_IDXSET_FOREACH(map, old_profile->output_mappings, idx)
|
||||
if (new_profile && !pa_idxset_contains(new_profile->output_mappings, map))
|
||||
if (ucm_device_disable(ucm, map->ucm_context.ucm_device) < 0)
|
||||
ret = -1;
|
||||
}
|
||||
ucm->active_verb = verb;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue