JackControl is used to indicate the kcontrol name for jack detection. --- src/modules/alsa/alsa-ucm.c | 25 ++++++++++++++++++++----- src/modules/alsa/alsa-ucm.h | 3 +++ 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/src/modules/alsa/alsa-ucm.c b/src/modules/alsa/alsa-ucm.c index aa2d601..ef6adcd 100644 --- a/src/modules/alsa/alsa-ucm.c +++ b/src/modules/alsa/alsa-ucm.c @@ -90,6 +90,7 @@ static struct ucm_items item[] = { {"CaptureRate", PA_ALSA_PROP_UCM_CAPTURE_RATE}, {"CaptureChannels", PA_ALSA_PROP_UCM_CAPTURE_CHANNELS}, {"TQ", PA_ALSA_PROP_UCM_QOS}, + {"JackControl", PA_ALSA_PROP_UCM_JACK_CONTROL}, {NULL, NULL}, }; @@ -1262,9 +1263,18 @@ static int ucm_create_mapping( return ret; } -static pa_alsa_jack* ucm_get_jack(pa_alsa_ucm_config *ucm, const char *dev_name, const char *pre_tag) { +static pa_alsa_jack* ucm_get_jack(pa_alsa_ucm_config *ucm, pa_alsa_ucm_device *device, const char *pre_tag) { pa_alsa_jack *j; - char *name = pa_sprintf_malloc("%s%s", pre_tag, dev_name); + const char *device_name; + char *name; + const char *jack_control; + + pa_assert(ucm); + pa_assert(device); + pa_assert(pre_tag); + + device_name = pa_proplist_gets(device->proplist, PA_ALSA_PROP_UCM_NAME); + name = pa_sprintf_malloc("%s%s", pre_tag, device_name); PA_LLIST_FOREACH(j, ucm->jacks) if (pa_streq(j->name, name)) @@ -1274,7 +1284,12 @@ static pa_alsa_jack* ucm_get_jack(pa_alsa_ucm_config *ucm, const char *dev_name, j->state_unplugged = PA_AVAILABLE_NO; j->state_plugged = PA_AVAILABLE_YES; j->name = pa_xstrdup(name); - j->alsa_name = pa_sprintf_malloc("%s Jack", dev_name); + + jack_control = pa_proplist_gets(device->proplist, PA_ALSA_PROP_UCM_JACK_CONTROL); + if (jack_control) + j->alsa_name = pa_xstrdup(jack_control); + else + j->alsa_name = pa_sprintf_malloc("%s Jack", device_name); PA_LLIST_PREPEND(pa_alsa_jack, ucm->jacks, j); @@ -1343,9 +1358,9 @@ static int ucm_create_profile( ucm_create_mapping(ucm, ps, p, dev, verb_name, name, sink, source); if (sink) - dev->output_jack = ucm_get_jack(ucm, name, PA_UCM_PRE_TAG_OUTPUT); + dev->output_jack = ucm_get_jack(ucm, dev, PA_UCM_PRE_TAG_OUTPUT); if (source) - dev->input_jack = ucm_get_jack(ucm, name, PA_UCM_PRE_TAG_INPUT); + dev->input_jack = ucm_get_jack(ucm, dev, PA_UCM_PRE_TAG_INPUT); } /* Now find modifiers that have their own PlaybackPCM and create diff --git a/src/modules/alsa/alsa-ucm.h b/src/modules/alsa/alsa-ucm.h index 20dc999..a8c8090 100644 --- a/src/modules/alsa/alsa-ucm.h +++ b/src/modules/alsa/alsa-ucm.h @@ -84,6 +84,9 @@ typedef void snd_use_case_mgr_t; /** For devices: The modifier (if any) that this device corresponds to */ #define PA_ALSA_PROP_UCM_MODIFIER "alsa.ucm.modifier" +/* Corresponds to the "JackControl" UCM value. */ +#define PA_ALSA_PROP_UCM_JACK_CONTROL "alsa.ucm.jack_control" + typedef struct pa_alsa_ucm_verb pa_alsa_ucm_verb; typedef struct pa_alsa_ucm_modifier pa_alsa_ucm_modifier; typedef struct pa_alsa_ucm_device pa_alsa_ucm_device; -- 1.9.3