|
@@ -86,16 +86,6 @@ struct mixer_build {
|
|
|
const struct usbmix_selector_map *selector_map;
|
|
|
};
|
|
|
|
|
|
-enum {
|
|
|
- USB_MIXER_BOOLEAN,
|
|
|
- USB_MIXER_INV_BOOLEAN,
|
|
|
- USB_MIXER_S8,
|
|
|
- USB_MIXER_U8,
|
|
|
- USB_MIXER_S16,
|
|
|
- USB_MIXER_U16,
|
|
|
-};
|
|
|
-
|
|
|
-
|
|
|
/*E-mu 0202/0404/0204 eXtension Unit(XU) control*/
|
|
|
enum {
|
|
|
USB_XU_CLOCK_RATE = 0xe301,
|
|
@@ -535,20 +525,21 @@ static int check_matrix_bitmap(unsigned char *bmap, int ich, int och, int num_ou
|
|
|
* if failed, give up and free the control instance.
|
|
|
*/
|
|
|
|
|
|
-static int add_control_to_empty(struct mixer_build *state, struct snd_kcontrol *kctl)
|
|
|
+int snd_usb_mixer_add_control(struct usb_mixer_interface *mixer,
|
|
|
+ struct snd_kcontrol *kctl)
|
|
|
{
|
|
|
struct usb_mixer_elem_info *cval = kctl->private_data;
|
|
|
int err;
|
|
|
|
|
|
- while (snd_ctl_find_id(state->chip->card, &kctl->id))
|
|
|
+ while (snd_ctl_find_id(mixer->chip->card, &kctl->id))
|
|
|
kctl->id.index++;
|
|
|
- if ((err = snd_ctl_add(state->chip->card, kctl)) < 0) {
|
|
|
+ if ((err = snd_ctl_add(mixer->chip->card, kctl)) < 0) {
|
|
|
snd_printd(KERN_ERR "cannot add control (err = %d)\n", err);
|
|
|
return err;
|
|
|
}
|
|
|
cval->elem_id = &kctl->id;
|
|
|
- cval->next_id_elem = state->mixer->id_elems[cval->id];
|
|
|
- state->mixer->id_elems[cval->id] = cval;
|
|
|
+ cval->next_id_elem = mixer->id_elems[cval->id];
|
|
|
+ mixer->id_elems[cval->id] = cval;
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -984,6 +975,9 @@ static struct snd_kcontrol_new usb_feature_unit_ctl_ro = {
|
|
|
.put = NULL,
|
|
|
};
|
|
|
|
|
|
+/* This symbol is exported in order to allow the mixer quirks to
|
|
|
+ * hook up to the standard feature unit control mechanism */
|
|
|
+struct snd_kcontrol_new *snd_usb_feature_unit_ctl = &usb_feature_unit_ctl;
|
|
|
|
|
|
/*
|
|
|
* build a feature control
|
|
@@ -1176,7 +1170,7 @@ static void build_feature_ctl(struct mixer_build *state, void *raw_desc,
|
|
|
|
|
|
snd_printdd(KERN_INFO "[%d] FU [%s] ch = %d, val = %d/%d/%d\n",
|
|
|
cval->id, kctl->id.name, cval->channels, cval->min, cval->max, cval->res);
|
|
|
- add_control_to_empty(state, kctl);
|
|
|
+ snd_usb_mixer_add_control(state->mixer, kctl);
|
|
|
}
|
|
|
|
|
|
|
|
@@ -1340,7 +1334,7 @@ static void build_mixer_unit_ctl(struct mixer_build *state,
|
|
|
|
|
|
snd_printdd(KERN_INFO "[%d] MU [%s] ch = %d, val = %d/%d\n",
|
|
|
cval->id, kctl->id.name, cval->channels, cval->min, cval->max);
|
|
|
- add_control_to_empty(state, kctl);
|
|
|
+ snd_usb_mixer_add_control(state->mixer, kctl);
|
|
|
}
|
|
|
|
|
|
|
|
@@ -1641,7 +1635,7 @@ static int build_audio_procunit(struct mixer_build *state, int unitid, void *raw
|
|
|
|
|
|
snd_printdd(KERN_INFO "[%d] PU [%s] ch = %d, val = %d/%d\n",
|
|
|
cval->id, kctl->id.name, cval->channels, cval->min, cval->max);
|
|
|
- if ((err = add_control_to_empty(state, kctl)) < 0)
|
|
|
+ if ((err = snd_usb_mixer_add_control(state->mixer, kctl)) < 0)
|
|
|
return err;
|
|
|
}
|
|
|
return 0;
|
|
@@ -1858,7 +1852,7 @@ static int parse_audio_selector_unit(struct mixer_build *state, int unitid, void
|
|
|
|
|
|
snd_printdd(KERN_INFO "[%d] SU [%s] items = %d\n",
|
|
|
cval->id, kctl->id.name, desc->bNrInPins);
|
|
|
- if ((err = add_control_to_empty(state, kctl)) < 0)
|
|
|
+ if ((err = snd_usb_mixer_add_control(state->mixer, kctl)) < 0)
|
|
|
return err;
|
|
|
|
|
|
return 0;
|