mirror of
https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
synced 2025-10-29 05:40:23 -04:00
alsa-ucm: Make one input/output mapping per UCM device
PulseAudio combines UCM devices that have the same PlaybackPCM or CapturePCM value into a single mapping with multiple ports. It also creates ports in the same mapping for each valid combination of those UCM devices. Since mappings are the things we put in profiles, we can put in a profile either all devices of a joint mapping or none of them. This causes some complications with device conflicts. For example, a different UCM device might be marked as conflicting with some (but not all) of the devices in a joint mapping. In this case we can do one of three things: - Include all devices in one profile, and hope the conflicting device isn't chosen as the mapping's active port. We shouldn't do this as it puts conflicting devices in the same profile. - Make one profile with the joint group, and one with the other device. This is somewhat acceptable as we have no conflicts, but we sacrifice some compatible combinations of devices. - Do not group the devices into the same mapping, and make one profile for each compatible combination of devices. This appears to be the best option, one where we can always have the maximum number of working devices. This patch chooses the third option and makes one input and/or output mapping per UCM device, by using UCM device names instead of PCM device strings in the mapping names. Signed-off-by: Alper Nebi Yasak <alpernebiyasak@gmail.com> Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/596>
This commit is contained in:
parent
e8e2f4320c
commit
a50330a4a5
1 changed files with 4 additions and 10 deletions
|
|
@ -1664,17 +1664,11 @@ static void alsa_mapping_add_ucm_modifier(pa_alsa_mapping *m, pa_alsa_ucm_modifi
|
|||
pa_channel_map_init(&m->channel_map);
|
||||
}
|
||||
|
||||
static pa_alsa_mapping* ucm_alsa_mapping_get(pa_alsa_ucm_config *ucm, pa_alsa_profile_set *ps, const char *verb_name, const char *device_str, bool is_sink) {
|
||||
static pa_alsa_mapping* ucm_alsa_mapping_get(pa_alsa_ucm_config *ucm, pa_alsa_profile_set *ps, const char *verb_name, const char *ucm_name, bool is_sink) {
|
||||
pa_alsa_mapping *m;
|
||||
char *mapping_name;
|
||||
size_t ucm_alibpref_len = 0;
|
||||
|
||||
/* find private alsa-lib's configuration device prefix */
|
||||
|
||||
if (ucm->alib_prefix && pa_startswith(device_str, ucm->alib_prefix))
|
||||
ucm_alibpref_len = strlen(ucm->alib_prefix);
|
||||
|
||||
mapping_name = pa_sprintf_malloc("Mapping %s: %s: %s", verb_name, device_str + ucm_alibpref_len, is_sink ? "sink" : "source");
|
||||
mapping_name = pa_sprintf_malloc("Mapping %s: %s: %s", verb_name, ucm_name, is_sink ? "sink" : "source");
|
||||
|
||||
m = pa_alsa_mapping_get(ps, mapping_name);
|
||||
|
||||
|
|
@ -1698,7 +1692,7 @@ static int ucm_create_mapping_direction(
|
|||
pa_alsa_mapping *m;
|
||||
unsigned priority, rate, channels;
|
||||
|
||||
m = ucm_alsa_mapping_get(ucm, ps, verb_name, device_str, is_sink);
|
||||
m = ucm_alsa_mapping_get(ucm, ps, verb_name, device_name, is_sink);
|
||||
|
||||
if (!m)
|
||||
return -1;
|
||||
|
|
@ -1747,7 +1741,7 @@ static int ucm_create_mapping_for_modifier(
|
|||
|
||||
pa_alsa_mapping *m;
|
||||
|
||||
m = ucm_alsa_mapping_get(ucm, ps, verb_name, device_str, is_sink);
|
||||
m = ucm_alsa_mapping_get(ucm, ps, verb_name, mod_name, is_sink);
|
||||
|
||||
if (!m)
|
||||
return -1;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue