[alsa-devel] [PATCH 2/2] ALSA: usb-audio: UAC2 jack detection
Takashi Iwai
tiwai at suse.de
Fri Mar 23 08:47:39 CET 2018
On Thu, 22 Mar 2018 22:39:56 +0100,
Andrew Chant wrote:
>
> This implements UAC2 jack detection support, presenting
> jack status as a boolean read-only mono mixer.
>
> The presence of any channel in the UAC2_TE_CONNECTOR
> control for a terminal will result in the mixer saying
> the jack is connected.
>
> Mixer naming follows the convention in sound/core/ctljack.c,
> terminating the mixer with " Jack".
> For additional clues as to which jack is being presented,
> the name is prefixed with " - Input Jack" or " - Output Jack"
> depending on if it's an input or output terminal.
>
> This is required because terminal names are ambiguous
> between inputs and outputs and often duplicated -
> Bidirectional terminal types (0x400 -> 0x4FF)
> "... may be used separately for input only or output only.
> These types require two Terminal descriptors. Both have the same type."
> (quote from "USB Device Class Definition for Terminal Types")
>
> Since bidirectional terminal types are common for headphone adapters,
> this distinguishes between two otherwise identically-named
> jack controls.
>
> Tested with a UAC2 audio device with connector control capability.
>
> Signed-off-by: Andrew Chant <achant at google.com>
> ---
> sound/usb/mixer.c | 99 ++++++++++++++++++++++++++++++++++++++++++++++-
> 1 file changed, 98 insertions(+), 1 deletion(-)
>
> diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c
> index 3075ac50a391..6cb61307aefe 100644
> --- a/sound/usb/mixer.c
> +++ b/sound/usb/mixer.c
> @@ -1235,6 +1235,21 @@ static int mixer_ctl_feature_put(struct snd_kcontrol *kcontrol,
> return changed;
> }
>
> +/* get the current value from a mixer element */
> +static int mixer_ctl_connector_get(struct snd_kcontrol *kcontrol,
> + struct snd_ctl_elem_value *ucontrol)
> +{
> + struct usb_mixer_elem_info *cval = kcontrol->private_data;
> + int val, err;
> +
> + err = snd_usb_get_cur_mix_value(cval, 0, 0, &val);
> + if (err < 0)
> + return filter_error(cval, err);
> + val = (val != 0);
> + ucontrol->value.integer.value[0] = val;
> + return 0;
> +}
> +
> static struct snd_kcontrol_new usb_feature_unit_ctl = {
> .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
> .name = "", /* will be filled later manually */
> @@ -1252,6 +1267,16 @@ static const struct snd_kcontrol_new usb_feature_unit_ctl_ro = {
> .put = NULL,
> };
>
> +/* A UAC connector mixer control */
> +static struct snd_kcontrol_new usb_connector_ctl_ro = {
> + .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
Let's follow the other usages, and here iface is set to
SNDRV_CTL_ELEM_IFACE_CARD. This was for avoiding such volatile
controls appearing the mixer application.
> + .name = "", /* will be filled later manually */
> + .access = SNDRV_CTL_ELEM_ACCESS_READ,
Actually we should have set SNDRV_CTL_ELEM_ACCESS_VOLATILE, too.
We forgot it in ctljack.c, too.
The rest looks good. But one thing to confirm: the value change
notification is done in snd_usb_mixer_interrupt()?
Also, is the jack re-detected after suspend/resume? That is, plug off
the jack while sleeping, and after the resume, is the jack status
change recognized and notified?
thanks,
Takashi
More information about the Alsa-devel
mailing list