Commit 568fa7e0 authored by Andrew Chant's avatar Andrew Chant Committed by Takashi Iwai

ALSA: usb-audio: update clock valid control

Make the "clock valid" control a global control instead of a mixer
so that it doesn't appear in mixer applications.

Additionally, remove the check for writeability prohibited by spec, and
Use common code to read the control value.

Tested with a UAC2 Audio device that presents a clock validity
control.  The control still shows up in /proc usbmixer but not
in alsamixer.
Signed-off-by: default avatarAndrew Chant <achant@google.com>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 5a222e84
...@@ -1235,9 +1235,9 @@ static int mixer_ctl_feature_put(struct snd_kcontrol *kcontrol, ...@@ -1235,9 +1235,9 @@ static int mixer_ctl_feature_put(struct snd_kcontrol *kcontrol,
return changed; return changed;
} }
/* get the current value from a mixer element */ /* get the boolean value from the master channel of a UAC control */
static int mixer_ctl_connector_get(struct snd_kcontrol *kcontrol, static int mixer_ctl_master_bool_get(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol) struct snd_ctl_elem_value *ucontrol)
{ {
struct usb_mixer_elem_info *cval = kcontrol->private_data; struct usb_mixer_elem_info *cval = kcontrol->private_data;
int val, err; int val, err;
...@@ -1267,13 +1267,16 @@ static const struct snd_kcontrol_new usb_feature_unit_ctl_ro = { ...@@ -1267,13 +1267,16 @@ static const struct snd_kcontrol_new usb_feature_unit_ctl_ro = {
.put = NULL, .put = NULL,
}; };
/* A UAC connector mixer control */ /*
static struct snd_kcontrol_new usb_connector_ctl_ro = { * A control which shows the boolean value from reading a UAC control on
* the master channel.
*/
static struct snd_kcontrol_new usb_bool_master_control_ctl_ro = {
.iface = SNDRV_CTL_ELEM_IFACE_CARD, .iface = SNDRV_CTL_ELEM_IFACE_CARD,
.name = "", /* will be filled later manually */ .name = "", /* will be filled later manually */
.access = SNDRV_CTL_ELEM_ACCESS_READ, .access = SNDRV_CTL_ELEM_ACCESS_READ,
.info = snd_ctl_boolean_mono_info, .info = snd_ctl_boolean_mono_info,
.get = mixer_ctl_connector_get, .get = mixer_ctl_master_bool_get,
.put = NULL, .put = NULL,
}; };
...@@ -1520,12 +1523,18 @@ static void build_connector_control(struct mixer_build *state, ...@@ -1520,12 +1523,18 @@ static void build_connector_control(struct mixer_build *state,
if (!cval) if (!cval)
return; return;
snd_usb_mixer_elem_init_std(&cval->head, state->mixer, term->id); snd_usb_mixer_elem_init_std(&cval->head, state->mixer, term->id);
/*
* The first byte from reading the UAC2_TE_CONNECTOR control returns the
* number of channels connected. This boolean ctl will simply report
* if any channels are connected or not.
* (Audio20_final.pdf Table 5-10: Connector Control CUR Parameter Block)
*/
cval->control = UAC2_TE_CONNECTOR; cval->control = UAC2_TE_CONNECTOR;
cval->val_type = USB_MIXER_BOOLEAN; cval->val_type = USB_MIXER_BOOLEAN;
cval->channels = 1; /* report true if any channel is connected */ cval->channels = 1; /* report true if any channel is connected */
cval->min = 0; cval->min = 0;
cval->max = 1; cval->max = 1;
kctl = snd_ctl_new1(&usb_connector_ctl_ro, cval); kctl = snd_ctl_new1(&usb_bool_master_control_ctl_ro, cval);
if (!kctl) { if (!kctl) {
usb_audio_err(state->chip, "cannot malloc kcontrol\n"); usb_audio_err(state->chip, "cannot malloc kcontrol\n");
kfree(cval); kfree(cval);
...@@ -1576,13 +1585,9 @@ static int parse_clock_source_unit(struct mixer_build *state, int unitid, ...@@ -1576,13 +1585,9 @@ static int parse_clock_source_unit(struct mixer_build *state, int unitid,
cval->val_type = USB_MIXER_BOOLEAN; cval->val_type = USB_MIXER_BOOLEAN;
cval->control = UAC2_CS_CONTROL_CLOCK_VALID; cval->control = UAC2_CS_CONTROL_CLOCK_VALID;
if (uac_v2v3_control_is_writeable(hdr->bmControls, cval->master_readonly = 1;
UAC2_CS_CONTROL_CLOCK_VALID)) /* From UAC2 5.2.5.1.2 "Only the get request is supported." */
kctl = snd_ctl_new1(&usb_feature_unit_ctl, cval); kctl = snd_ctl_new1(&usb_bool_master_control_ctl_ro, cval);
else {
cval->master_readonly = 1;
kctl = snd_ctl_new1(&usb_feature_unit_ctl_ro, cval);
}
if (!kctl) { if (!kctl) {
kfree(cval); kfree(cval);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment