[alsa-devel] [PATCH 1/1] sound/usb: Add Asus Xonar U7 Mixer - input support
Takashi Iwai
tiwai at suse.de
Mon Jul 27 14:10:40 CEST 2015
On Sun, 26 Jul 2015 10:00:12 +0200,
Piotr G. wrote:
>
> Hello,
> This is my first patch to alsa-devel, and I'm not very skilled
> programmer. From lsusb -vvv, I've draw Xonar U7 map with all IT OT FU CS
> in mixer_map.c I don't know why the driver by default doesn't parse all
> info correctly. With this patch you can see Line Switch and Mic Switch
> in alsamixer. I can record my voice in Audacity with all supported bit
> and sampling rates in Mono or Stereo
> This is temporary solution. Please correct me if the patch is not
> properly made.
>
> What doesn't work:
> - Cannot change Capture Volume for Line/Mic. No mixer control in
> alsamixer
> - Switching between Line/Mic doesn't work (Mute doesn't work)
> - SPDIF not tested
> As what I wrote at beginning I'm not skilled programmer so any help is
> aprreciated
>
>
> proc-usbmixer -> cat /proc/asound/*/usbmix
> usb.debug -> lsusb -vv (only Asus Xonar U7)
The changes in mixer_maps.c look good, but what's the reason for
uac2_audio_feature_info[]? It seems adding "Control" suffix to each
entry, which doesn't look correct.
thanks,
Takashi
>
> ---
> sound/usb/mixer.c | 23 +++++++++++++++++++++--
> sound/usb/mixer_maps.c | 48
> ++++++++++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 69 insertions(+), 2 deletions(-)
>
> diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c
> index 6b3acba..027d160 100644
> --- a/sound/usb/mixer.c
> +++ b/sound/usb/mixer.c
> @@ -818,6 +818,25 @@ static struct usb_feature_control_info
> audio_feature_info[] = {
> { "Phase Inverter Control", USB_MIXER_BOOLEAN },
> };
>
> +static struct usb_feature_control_info uac2_audio_feature_info[] = {
> + /* UAC2 specific */
> + { "Mute Control", USB_MIXER_INV_BOOLEAN },
> + { "Volume Control", USB_MIXER_S16 },
> + { "Bass Control", USB_MIXER_S8 },
> + { "Mid Control", USB_MIXER_S8 },
> + { "Treble Control", USB_MIXER_S8 },
> + { "Graphic Equalizer Control", USB_MIXER_S8 },
> + { "Automatic Gain Control", USB_MIXER_BOOLEAN },
> + { "Delay Control", USB_MIXER_S16 }, /* FIXME: U32 in UAC2 */
> + { "Bass Boost Control", USB_MIXER_BOOLEAN },
> + { "Loudness Control", USB_MIXER_BOOLEAN },
> + { "Input Gain Control", USB_MIXER_S16 },
> + { "Input Gain Pad Control", USB_MIXER_S16 },
> + { "Phase Inverter Control", USB_MIXER_BOOLEAN },
> + { "Underflow Control", USB_MIXER_BOOLEAN },
> + { "Overflow Control", USB_MIXER_BOOLEAN },
> +};
> +
> /* private_free callback */
> void snd_usb_mixer_elem_free(struct snd_kcontrol *kctl)
> {
> @@ -1240,7 +1259,7 @@ static void build_feature_ctl(struct mixer_build
> *state, void *raw_desc,
> snd_usb_mixer_elem_init_std(&cval->head, state->mixer, unitid);
> cval->control = control;
> cval->cmask = ctl_mask;
> - cval->val_type = audio_feature_info[control-1].type;
> + cval->val_type = uac2_audio_feature_info[control-1].type;
> if (ctl_mask == 0) {
> cval->channels = 1; /* master channel */
> cval->master_readonly = readonly_mask;
> @@ -1318,7 +1337,7 @@ static void build_feature_ctl(struct mixer_build
> *state, void *raw_desc,
> break;
> default:
> if (!len)
> - strlcpy(kctl->id.name, audio_feature_info[control-1].name,
> + strlcpy(kctl->id.name, uac2_audio_feature_info[control-1].name,
> sizeof(kctl->id.name));
> break;
> }
> diff --git a/sound/usb/mixer_maps.c b/sound/usb/mixer_maps.c
> index e5000da..07f510e 100644
> --- a/sound/usb/mixer_maps.c
> +++ b/sound/usb/mixer_maps.c
> @@ -341,6 +341,48 @@ static const struct usbmix_name_map
> scms_usb3318_map[] = {
> { 0 }
> };
>
> +/* ASUS Xonar U7 - USB CM6632A (ADC CS5361 // DAC Dolby CS4362A // DAC
> Stereo CS4398 */
> +/* Topology:
> +
> +USB_IN[1]------->FU[13]-----------CS[18]--->Spk_OUT[7]
> +
> +Dig_IN[2]------->FU[14]-----------CS[19]--->Dig_OUT[8]
> +
> +Mic_IN[4]------->FU[16]---+
> + SU[20]--CS[22]--->USB_OUT[11]
> +Line_IN[5]------>FU[17]---+
> +
> +*/
> +
> +static const struct usbmix_name_map xonar_u7_map[] = {
> + /* 1: IT PCM Analog (USB Streaming) */
> + /* 2: IT PCM2 Digital (USB Streaming) */
> + /* 4: IT Microphone */
> + /* 5: IT Line IN */
> + /* 7: OT Speaker */
> + /* 8: OT SPDIF */
> + /* 11 OT Capture Playback (USB Streaming) */
> + { 13, "Speaker Playback" }, /* 13 FU Speaker Out Mute/Volume */
> + { 14, "IEC958 Playback" }, /* 14 FU SPDIF Out Mute/Volume */
> + { 16, "Mic Capture" }, /* 16 FU Capture Mic-in Mute/Volume */
> + { 17, "Line Capture" }, /* 17 FU Capture Line-in Mute/Volume */
> + /* 18 CS for 1 PCM (USB Streaming) Clock Source */
> + /* 19 CS for 2 SPDIF (USB Streaming) Clock Source */
> + { 20, "Capture Source" }, /* 20 SU Capture Source Selector */
> + /* 22 CS Line-in and Mic-in Clock Source */
> + { 0 }
> +};
> +
> +static struct usbmix_selector_map xonar_u7_selectors[] = {
> +{
> + .id = 20,
> + .count = 2,
> + .names = (const char*[]) {"Mic", "Line"}
> + },
> + { 0 } /* terminator */
> +
> +};
> +
> /*
> * Control map entries
> */
> @@ -451,6 +493,12 @@ static struct usbmix_ctl_map usbmix_ctl_maps[] = {
> .id = USB_ID(0x25c4, 0x0003),
> .map = scms_usb3318_map,
> },
> + {
> + /* Asus Xonar U7 */
> + .id = USB_ID(0x1043, 0x857c),
> + .map = xonar_u7_map,
> + .selector_map = xonar_u7_selectors,
> + },
> { 0 } /* terminator */
> };
>
> --
> 2.3.6
>
More information about the Alsa-devel
mailing list