mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-10-31 22:25:38 -04:00
alsa-ucm: Let profiles know their associated UCM verb
Currently each UCM verb generates one profile named the same as the
verb, meaning it's trivial to know which verb the profile belongs to.
This will be slightly harder to do when we generate multiple profiles
per UCM verb (e.g. to make use of conflicting devices).
It would still be possible to parse the profile name to get the UCM
verb, but instead let's keep track of the struct instance representing
the profile's associated verb. This also lets us remove a block of code
searching for the verb by its name.
Co-authored-by: Jaroslav Kysela <perex@perex.cz>
[Alper: Reused Jaroslav's UCM profile context changes for UCM verb
instead of combined devices.]
Link: 9fc7064b9a
Signed-off-by: Alper Nebi Yasak <alpernebiyasak@gmail.com>
This commit is contained in:
parent
a5d87a43df
commit
f4c66de9f0
3 changed files with 16 additions and 14 deletions
|
|
@ -354,7 +354,7 @@ struct pa_alsa_mapping {
|
|||
pa_alsa_device output;
|
||||
pa_alsa_device input;
|
||||
|
||||
/* ucm device context*/
|
||||
/* ucm device context */
|
||||
pa_alsa_ucm_mapping_context ucm_context;
|
||||
};
|
||||
|
||||
|
|
@ -381,6 +381,9 @@ struct pa_alsa_profile {
|
|||
pa_idxset *input_mappings;
|
||||
pa_idxset *output_mappings;
|
||||
|
||||
/* ucm device context */
|
||||
pa_alsa_ucm_profile_context ucm_context;
|
||||
|
||||
struct {
|
||||
pa_dynarray devices;
|
||||
} out;
|
||||
|
|
|
|||
|
|
@ -1467,27 +1467,20 @@ int pa_alsa_ucm_set_profile(pa_alsa_ucm_config *ucm, pa_card *card, pa_alsa_prof
|
|||
if (new_profile == old_profile)
|
||||
return 0;
|
||||
|
||||
if (new_profile == NULL)
|
||||
if (new_profile == NULL) {
|
||||
profile = SND_USE_CASE_VERB_INACTIVE;
|
||||
else
|
||||
verb = NULL;
|
||||
} else {
|
||||
profile = new_profile->name;
|
||||
verb = new_profile->ucm_context.verb;
|
||||
}
|
||||
|
||||
/* change verb */
|
||||
pa_log_info("Set UCM verb to %s", profile);
|
||||
if ((ret = snd_use_case_set(ucm->ucm_mgr, "_verb", profile)) < 0) {
|
||||
pa_log("Failed to set verb %s: %s", profile, snd_strerror(ret));
|
||||
}
|
||||
|
||||
/* find active verb */
|
||||
ucm->active_verb = NULL;
|
||||
PA_LLIST_FOREACH(verb, ucm->verbs) {
|
||||
const char *verb_name;
|
||||
verb_name = pa_proplist_gets(verb->proplist, PA_ALSA_PROP_UCM_NAME);
|
||||
if (pa_streq(verb_name, profile)) {
|
||||
ucm->active_verb = verb;
|
||||
break;
|
||||
}
|
||||
}
|
||||
ucm->active_verb = verb;
|
||||
|
||||
update_mixer_paths(card->ports, profile);
|
||||
return ret;
|
||||
|
|
@ -1862,6 +1855,7 @@ static int ucm_create_profile(
|
|||
p->profile_set = ps;
|
||||
p->name = pa_xstrdup(verb_name);
|
||||
p->description = pa_xstrdup(verb_desc);
|
||||
p->ucm_context.verb = verb;
|
||||
|
||||
p->output_mappings = pa_idxset_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func);
|
||||
p->input_mappings = pa_idxset_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func);
|
||||
|
|
|
|||
|
|
@ -142,6 +142,7 @@ typedef struct pa_alsa_ucm_modifier pa_alsa_ucm_modifier;
|
|||
typedef struct pa_alsa_ucm_device pa_alsa_ucm_device;
|
||||
typedef struct pa_alsa_ucm_config pa_alsa_ucm_config;
|
||||
typedef struct pa_alsa_ucm_mapping_context pa_alsa_ucm_mapping_context;
|
||||
typedef struct pa_alsa_ucm_profile_context pa_alsa_ucm_profile_context;
|
||||
typedef struct pa_alsa_ucm_port_data pa_alsa_ucm_port_data;
|
||||
typedef struct pa_alsa_ucm_volume pa_alsa_ucm_volume;
|
||||
|
||||
|
|
@ -271,6 +272,10 @@ struct pa_alsa_ucm_mapping_context {
|
|||
pa_idxset *ucm_modifiers;
|
||||
};
|
||||
|
||||
struct pa_alsa_ucm_profile_context {
|
||||
pa_alsa_ucm_verb *verb;
|
||||
};
|
||||
|
||||
struct pa_alsa_ucm_port_data {
|
||||
pa_alsa_ucm_config *ucm;
|
||||
pa_device_port *core_port;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue