* usbaudio: Support for USB audio v2.0 devices
@ 2010-02-22 22:49 Daniel Mack
2010-02-22 22:49 ` [PATCH 1/5] ALSA: usbaudio: parse USB descriptors with structs Daniel Mack
` (4 more replies)
0 siblings, 5 replies; 48+ messages in thread
From: Daniel Mack @ 2010-02-22 22:49 UTC (permalink / raw)
To: alsa-devel; +Cc: tiwai, clemens
Here's a new version of the patchset to start support for USB audio
v2.0 devices. I moved all the definitions to linux/usb/audio.h.
As I did that, I realized that there's actually many definitions in
sound/usb/usbaudio.h which don't need to be there at all. Most of them
are already defined in audio.h and ch9.h. Hence, I added a 5th patch
to consolidate things and ease the chaos a bit. Hope I didn't break
anything :)
Daniel
^ permalink raw reply [flat|nested] 48+ messages in thread* [PATCH 1/5] ALSA: usbaudio: parse USB descriptors with structs 2010-02-22 22:49 usbaudio: Support for USB audio v2.0 devices Daniel Mack @ 2010-02-22 22:49 ` Daniel Mack 2010-02-23 7:50 ` Clemens Ladisch 2010-02-23 7:56 ` Takashi Iwai 2010-02-22 22:49 ` [PATCH 2/5] ALSA: usbaudio: introduce new types for audio class v2 Daniel Mack ` (3 subsequent siblings) 4 siblings, 2 replies; 48+ messages in thread From: Daniel Mack @ 2010-02-22 22:49 UTC (permalink / raw) To: alsa-devel; +Cc: tiwai, clemens In preparation of support for v2.0 audio class, use the structs from linux/usb/audio.h and add some new ones to describe the fields that are actually parsed by the descriptor decoders. Also, factor out code from usb_create_streams(). This makes it easier to adopt the new iteration logic needed for v2.0. Signed-off-by: Daniel Mack <daniel@caiaq.de> --- include/linux/usb/audio.h | 32 +++++++- sound/usb/usbaudio.c | 198 +++++++++++++++++++++++++++------------------ sound/usb/usbmixer.c | 39 +++++----- 3 files changed, 168 insertions(+), 101 deletions(-) diff --git a/include/linux/usb/audio.h b/include/linux/usb/audio.h index eaf9dff..44f82d8 100644 --- a/include/linux/usb/audio.h +++ b/include/linux/usb/audio.h @@ -81,7 +81,7 @@ /* Terminal Control Selectors */ /* 4.3.2 Class-Specific AC Interface Descriptor */ -struct uac_ac_header_descriptor { +struct uac_ac_header_descriptor_v1 { __u8 bLength; /* 8 + n */ __u8 bDescriptorType; /* USB_DT_CS_INTERFACE */ __u8 bDescriptorSubtype; /* UAC_MS_HEADER */ @@ -95,7 +95,7 @@ struct uac_ac_header_descriptor { /* As above, but more useful for defining your own descriptors: */ #define DECLARE_UAC_AC_HEADER_DESCRIPTOR(n) \ -struct uac_ac_header_descriptor_##n { \ +struct uac_ac_header_descriptor_v1_##n { \ __u8 bLength; \ __u8 bDescriptorType; \ __u8 bDescriptorSubtype; \ @@ -131,7 +131,7 @@ struct uac_input_terminal_descriptor { #define UAC_INPUT_TERMINAL_PROC_MICROPHONE_ARRAY 0x206 /* 4.3.2.2 Output Terminal Descriptor */ -struct uac_output_terminal_descriptor { +struct uac_output_terminal_descriptor_v1 { __u8 bLength; /* in bytes: 9 */ __u8 bDescriptorType; /* CS_INTERFACE descriptor type */ __u8 bDescriptorSubtype; /* OUTPUT_TERMINAL descriptor subtype */ @@ -171,7 +171,7 @@ struct uac_feature_unit_descriptor_##ch { \ } __attribute__ ((packed)) /* 4.5.2 Class-Specific AS Interface Descriptor */ -struct uac_as_header_descriptor { +struct uac_as_header_descriptor_v1 { __u8 bLength; /* in bytes: 7 */ __u8 bDescriptorType; /* USB_DT_CS_INTERFACE */ __u8 bDescriptorSubtype; /* AS_GENERAL */ @@ -232,6 +232,19 @@ struct uac_format_type_i_discrete_descriptor_##n { \ #define UAC_FORMAT_TYPE_I_DISCRETE_DESC_SIZE(n) (8 + (n * 3)) +/* Formats - Audio Data Format Type I Codes */ + +struct uac_format_type_ii_discrete_descriptor { + __u8 bLength; + __u8 bDescriptorType; + __u8 bDescriptorSubtype; + __u8 bFormatType; + __le16 wMaxBitRate; + __le16 wSamplesPerFrame; + __u8 bSamFreqType; + __u8 tSamFreq[][3]; +} __attribute__((packed)); + /* Formats - A.2 Format Type Codes */ #define UAC_FORMAT_TYPE_UNDEFINED 0x0 #define UAC_FORMAT_TYPE_I 0x1 @@ -253,6 +266,17 @@ struct uac_iso_endpoint_descriptor { #define UAC_EP_CS_ATTR_FILL_MAX 0x80 /* A.10.2 Feature Unit Control Selectors */ + +struct uac_feature_unit_descriptor { + __u8 bLength; + __u8 bDescriptorType; + __u8 bDescriptorSubtype; + __u8 bUnitID; + __u8 bSourceID; + __u8 bControlSize; + __u8 controls[0]; /* variable length */ +} __attribute__((packed)); + #define UAC_FU_CONTROL_UNDEFINED 0x00 #define UAC_MUTE_CONTROL 0x01 #define UAC_VOLUME_CONTROL 0x02 diff --git a/sound/usb/usbaudio.c b/sound/usb/usbaudio.c index 4208b44..5d7d659 100644 --- a/sound/usb/usbaudio.c +++ b/sound/usb/usbaudio.c @@ -46,6 +46,8 @@ #include <linux/usb.h> #include <linux/moduleparam.h> #include <linux/mutex.h> +#include <linux/usb/audio.h> + #include <sound/core.h> #include <sound/info.h> #include <sound/pcm.h> @@ -2421,15 +2423,17 @@ static int is_big_endian_format(struct snd_usb_audio *chip, struct audioformat * * @fmt: the format type descriptor */ static int parse_audio_format_i_type(struct snd_usb_audio *chip, struct audioformat *fp, - int format, unsigned char *fmt) + int format, void *fmt_raw) { int pcm_format; int sample_width, sample_bytes; + struct uac_format_type_i_discrete_descriptor *fmt = fmt_raw; /* FIXME: correct endianess and sign? */ pcm_format = -1; - sample_width = fmt[6]; - sample_bytes = fmt[5]; + sample_width = fmt->bBitResolution; + sample_bytes = fmt->bSubframeSize; + switch (format) { case 0: /* some devices don't define this correctly... */ snd_printdd(KERN_INFO "%d:%u:%d : format type 0 is detected, processed as PCM\n", @@ -2442,7 +2446,7 @@ static int parse_audio_format_i_type(struct snd_usb_audio *chip, struct audiofor sample_width, sample_bytes); } /* check the format byte size */ - switch (fmt[5]) { + switch (sample_bytes) { case 1: pcm_format = SNDRV_PCM_FORMAT_S8; break; @@ -2463,8 +2467,8 @@ static int parse_audio_format_i_type(struct snd_usb_audio *chip, struct audiofor break; default: snd_printk(KERN_INFO "%d:%u:%d : unsupported sample bitwidth %d in %d bytes\n", - chip->dev->devnum, fp->iface, - fp->altsetting, sample_width, sample_bytes); + chip->dev->devnum, fp->iface, fp->altsetting, + sample_width, sample_bytes); break; } break; @@ -2564,11 +2568,12 @@ static int parse_audio_format_rates(struct snd_usb_audio *chip, struct audioform * parse the format type I and III descriptors */ static int parse_audio_format_i(struct snd_usb_audio *chip, struct audioformat *fp, - int format, unsigned char *fmt) + int format, void *fmt_raw) { int pcm_format; + struct uac_format_type_i_discrete_descriptor *fmt = fmt_raw; - if (fmt[3] == USB_FORMAT_TYPE_III) { + if (fmt->bFormatType == USB_FORMAT_TYPE_III) { /* FIXME: the format type is really IECxxx * but we give normal PCM format to get the existing * apps working... @@ -2590,23 +2595,27 @@ static int parse_audio_format_i(struct snd_usb_audio *chip, struct audioformat * if (pcm_format < 0) return -1; } + fp->format = pcm_format; - fp->channels = fmt[4]; + fp->channels = fmt->bNrChannels; + if (fp->channels < 1) { snd_printk(KERN_ERR "%d:%u:%d : invalid channels %d\n", chip->dev->devnum, fp->iface, fp->altsetting, fp->channels); return -1; } - return parse_audio_format_rates(chip, fp, fmt, 7); + return parse_audio_format_rates(chip, fp, fmt_raw, 7); } /* - * prase the format type II descriptor + * parse the format type II descriptor */ static int parse_audio_format_ii(struct snd_usb_audio *chip, struct audioformat *fp, - int format, unsigned char *fmt) + int format, void *fmt_raw) { int brate, framesize; + struct uac_format_type_ii_discrete_descriptor *fmt = fmt_raw; + switch (format) { case USB_AUDIO_FORMAT_AC3: /* FIXME: there is no AC3 format defined yet */ @@ -2622,20 +2631,25 @@ static int parse_audio_format_ii(struct snd_usb_audio *chip, struct audioformat fp->format = SNDRV_PCM_FORMAT_MPEG; break; } + fp->channels = 1; - brate = combine_word(&fmt[4]); /* fmt[4,5] : wMaxBitRate (in kbps) */ - framesize = combine_word(&fmt[6]); /* fmt[6,7]: wSamplesPerFrame */ + + brate = le16_to_cpu(fmt->wMaxBitRate); + framesize = le16_to_cpu(fmt->wSamplesPerFrame); snd_printd(KERN_INFO "found format II with max.bitrate = %d, frame size=%d\n", brate, framesize); fp->frame_size = framesize; - return parse_audio_format_rates(chip, fp, fmt, 8); /* fmt[8..] sample rates */ + return parse_audio_format_rates(chip, fp, fmt_raw, 8); /* fmt[8..] sample rates */ } static int parse_audio_format(struct snd_usb_audio *chip, struct audioformat *fp, - int format, unsigned char *fmt, int stream) + int format, void *fmt_raw, int stream) { int err; + /* we only parse the common header of all format types here, + * so it is safe to take a type_i struct */ + struct uac_format_type_i_discrete_descriptor *fmt = fmt_raw; - switch (fmt[3]) { + switch (fmt->bFormatType) { case USB_FORMAT_TYPE_I: case USB_FORMAT_TYPE_III: err = parse_audio_format_i(chip, fp, format, fmt); @@ -2645,10 +2659,10 @@ static int parse_audio_format(struct snd_usb_audio *chip, struct audioformat *fp break; default: snd_printd(KERN_INFO "%d:%u:%d : format type %d is not supported yet\n", - chip->dev->devnum, fp->iface, fp->altsetting, fmt[3]); + chip->dev->devnum, fp->iface, fp->altsetting, fmt->bFormatType); return -1; } - fp->fmt_type = fmt[3]; + fp->fmt_type = fmt->bFormatType; if (err < 0) return err; #if 1 @@ -2659,7 +2673,7 @@ static int parse_audio_format(struct snd_usb_audio *chip, struct audioformat *fp if (chip->usb_id == USB_ID(0x041e, 0x3000) || chip->usb_id == USB_ID(0x041e, 0x3020) || chip->usb_id == USB_ID(0x041e, 0x3061)) { - if (fmt[3] == USB_FORMAT_TYPE_I && + if (fmt->bFormatType == USB_FORMAT_TYPE_I && fp->rates != SNDRV_PCM_RATE_48000 && fp->rates != SNDRV_PCM_RATE_96000) return -1; @@ -2708,6 +2722,8 @@ static int parse_audio_endpoints(struct snd_usb_audio *chip, int iface_no) num = 4; for (i = 0; i < num; i++) { + struct uac_as_header_descriptor_v1 *as; + alts = &iface->altsetting[i]; altsd = get_iface_desc(alts); /* skip invalid one */ @@ -2726,7 +2742,7 @@ static int parse_audio_endpoints(struct snd_usb_audio *chip, int iface_no) stream = (get_endpoint(alts, 0)->bEndpointAddress & USB_DIR_IN) ? SNDRV_PCM_STREAM_CAPTURE : SNDRV_PCM_STREAM_PLAYBACK; altno = altsd->bAlternateSetting; - + /* audiophile usb: skip altsets incompatible with device_setup */ if (chip->usb_id == USB_ID(0x0763, 0x2003) && @@ -2734,20 +2750,21 @@ static int parse_audio_endpoints(struct snd_usb_audio *chip, int iface_no) continue; /* get audio formats */ - fmt = snd_usb_find_csint_desc(alts->extra, alts->extralen, NULL, AS_GENERAL); - if (!fmt) { + as = snd_usb_find_csint_desc(alts->extra, alts->extralen, NULL, AS_GENERAL); + + if (!as) { snd_printk(KERN_ERR "%d:%u:%d : AS_GENERAL descriptor not found\n", dev->devnum, iface_no, altno); continue; } - if (fmt[0] < 7) { + if (as->bLength < sizeof(*as)) { snd_printk(KERN_ERR "%d:%u:%d : invalid AS_GENERAL desc\n", dev->devnum, iface_no, altno); continue; } - format = (fmt[6] << 8) | fmt[5]; /* remember the format value */ + format = le16_to_cpu(as->wFormatTag); /* remember the format value */ /* get format type */ fmt = snd_usb_find_csint_desc(alts->extra, alts->extralen, NULL, FORMAT_TYPE); @@ -2875,6 +2892,65 @@ static void snd_usb_stream_disconnect(struct list_head *head) } } +static int snd_usb_create_stream(struct snd_usb_audio *chip, int ctrlif, int interface) +{ + struct usb_device *dev = chip->dev; + struct usb_host_interface *alts; + struct usb_interface_descriptor *altsd; + struct usb_interface *iface = usb_ifnum_to_if(dev, interface); + + if (!iface) { + snd_printk(KERN_ERR "%d:%u:%d : does not exist\n", + dev->devnum, ctrlif, interface); + return -EINVAL; + } + + if (usb_interface_claimed(iface)) { + snd_printdd(KERN_INFO "%d:%d:%d: skipping, already claimed\n", + dev->devnum, ctrlif, interface); + return -EINVAL; + } + + alts = &iface->altsetting[0]; + altsd = get_iface_desc(alts); + if ((altsd->bInterfaceClass == USB_CLASS_AUDIO || + altsd->bInterfaceClass == USB_CLASS_VENDOR_SPEC) && + altsd->bInterfaceSubClass == USB_SUBCLASS_MIDI_STREAMING) { + int err = snd_usbmidi_create(chip->card, iface, + &chip->midi_list, NULL); + if (err < 0) { + snd_printk(KERN_ERR "%d:%u:%d: cannot create sequencer device\n", + dev->devnum, ctrlif, interface); + return -EINVAL; + } + usb_driver_claim_interface(&usb_audio_driver, iface, (void *)-1L); + + return 0; + } + + if ((altsd->bInterfaceClass != USB_CLASS_AUDIO && + altsd->bInterfaceClass != USB_CLASS_VENDOR_SPEC) || + altsd->bInterfaceSubClass != USB_SUBCLASS_AUDIO_STREAMING) { + snd_printdd(KERN_ERR "%d:%u:%d: skipping non-supported interface %d\n", + dev->devnum, ctrlif, interface, altsd->bInterfaceClass); + /* skip non-supported classes */ + return -EINVAL; + } + + if (snd_usb_get_speed(dev) == USB_SPEED_LOW) { + snd_printk(KERN_ERR "low speed audio streaming not supported\n"); + return -EINVAL; + } + + if (! parse_audio_endpoints(chip, interface)) { + usb_set_interface(dev, interface, 0); /* reset the current interface */ + usb_driver_claim_interface(&usb_audio_driver, iface, (void *)-1L); + return -EINVAL; + } + + return 0; +} + /* * parse audio control descriptor and create pcm/midi streams */ @@ -2882,69 +2958,36 @@ static int snd_usb_create_streams(struct snd_usb_audio *chip, int ctrlif) { struct usb_device *dev = chip->dev; struct usb_host_interface *host_iface; - struct usb_interface *iface; - unsigned char *p1; - int i, j; + struct uac_ac_header_descriptor_v1 *h1; + void *control_header; + int i; /* find audiocontrol interface */ host_iface = &usb_ifnum_to_if(dev, ctrlif)->altsetting[0]; - if (!(p1 = snd_usb_find_csint_desc(host_iface->extra, host_iface->extralen, NULL, HEADER))) { + control_header = snd_usb_find_csint_desc(host_iface->extra, + host_iface->extralen, + NULL, HEADER); + + if (!control_header) { snd_printk(KERN_ERR "cannot find HEADER\n"); return -EINVAL; } - if (! p1[7] || p1[0] < 8 + p1[7]) { - snd_printk(KERN_ERR "invalid HEADER\n"); + + h1 = control_header; + + if (!h1->bInCollection) { + snd_printk(KERN_INFO "skipping empty audio interface (v1)\n"); return -EINVAL; } - /* - * parse all USB audio streaming interfaces - */ - for (i = 0; i < p1[7]; i++) { - struct usb_host_interface *alts; - struct usb_interface_descriptor *altsd; - j = p1[8 + i]; - iface = usb_ifnum_to_if(dev, j); - if (!iface) { - snd_printk(KERN_ERR "%d:%u:%d : does not exist\n", - dev->devnum, ctrlif, j); - continue; - } - if (usb_interface_claimed(iface)) { - snd_printdd(KERN_INFO "%d:%d:%d: skipping, already claimed\n", dev->devnum, ctrlif, j); - continue; - } - alts = &iface->altsetting[0]; - altsd = get_iface_desc(alts); - if ((altsd->bInterfaceClass == USB_CLASS_AUDIO || - altsd->bInterfaceClass == USB_CLASS_VENDOR_SPEC) && - altsd->bInterfaceSubClass == USB_SUBCLASS_MIDI_STREAMING) { - int err = snd_usbmidi_create(chip->card, iface, - &chip->midi_list, NULL); - if (err < 0) { - snd_printk(KERN_ERR "%d:%u:%d: cannot create sequencer device\n", dev->devnum, ctrlif, j); - continue; - } - usb_driver_claim_interface(&usb_audio_driver, iface, (void *)-1L); - continue; - } - if ((altsd->bInterfaceClass != USB_CLASS_AUDIO && - altsd->bInterfaceClass != USB_CLASS_VENDOR_SPEC) || - altsd->bInterfaceSubClass != USB_SUBCLASS_AUDIO_STREAMING) { - snd_printdd(KERN_ERR "%d:%u:%d: skipping non-supported interface %d\n", dev->devnum, ctrlif, j, altsd->bInterfaceClass); - /* skip non-supported classes */ - continue; - } - if (snd_usb_get_speed(dev) == USB_SPEED_LOW) { - snd_printk(KERN_ERR "low speed audio streaming not supported\n"); - continue; - } - if (! parse_audio_endpoints(chip, j)) { - usb_set_interface(dev, j, 0); /* reset the current interface */ - usb_driver_claim_interface(&usb_audio_driver, iface, (void *)-1L); - } + if (h1->bLength < sizeof(*h1) + h1->bInCollection) { + snd_printk(KERN_ERR "invalid HEADER (v1)\n"); + return -EINVAL; } + for (i = 0; i < h1->bInCollection; i++) + snd_usb_create_stream(chip, ctrlif, h1->baInterfaceNr[i]); + return 0; } @@ -3581,7 +3624,6 @@ static void *snd_usb_audio_probe(struct usb_device *dev, ifnum = get_iface_desc(alts)->bInterfaceNumber; id = USB_ID(le16_to_cpu(dev->descriptor.idVendor), le16_to_cpu(dev->descriptor.idProduct)); - if (quirk && quirk->ifnum >= 0 && ifnum != quirk->ifnum) goto __err_val; diff --git a/sound/usb/usbmixer.c b/sound/usb/usbmixer.c index dd0c1d7..3631595 100644 --- a/sound/usb/usbmixer.c +++ b/sound/usb/usbmixer.c @@ -32,6 +32,8 @@ #include <linux/slab.h> #include <linux/string.h> #include <linux/usb.h> +#include <linux/usb/audio.h> + #include <sound/core.h> #include <sound/control.h> #include <sound/hwdep.h> @@ -278,7 +280,6 @@ static void *find_audio_control_unit(struct mixer_build *state, unsigned char un { unsigned char *p; - p = NULL; while ((p = snd_usb_find_desc(state->buffer, state->buflen, p, USB_DT_CS_INTERFACE)) != NULL) { if (p[0] >= 4 && p[2] >= INPUT_TERMINAL && p[2] <= EXTENSION_UNIT && p[3] == unit) @@ -1083,29 +1084,30 @@ static void build_feature_ctl(struct mixer_build *state, unsigned char *desc, * * most of controlls are defined here. */ -static int parse_audio_feature_unit(struct mixer_build *state, int unitid, unsigned char *ftr) +static int parse_audio_feature_unit(struct mixer_build *state, int unitid, void *_ftr) { int channels, i, j; struct usb_audio_term iterm; unsigned int master_bits, first_ch_bits; int err, csize; + struct uac_feature_unit_descriptor *ftr = _ftr; - if (ftr[0] < 7 || ! (csize = ftr[5]) || ftr[0] < 7 + csize) { + if (ftr->bLength < 7 || ! (csize = ftr->bControlSize) || ftr->bLength < 7 + csize) { snd_printk(KERN_ERR "usbaudio: unit %u: invalid FEATURE_UNIT descriptor\n", unitid); return -EINVAL; } /* parse the source unit */ - if ((err = parse_audio_unit(state, ftr[4])) < 0) + if ((err = parse_audio_unit(state, ftr->bSourceID)) < 0) return err; /* determine the input source type and name */ - if (check_input_term(state, ftr[4], &iterm) < 0) + if (check_input_term(state, ftr->bSourceID, &iterm) < 0) return -EINVAL; - channels = (ftr[0] - 7) / csize - 1; + channels = (ftr->bLength - 7) / csize - 1; - master_bits = snd_usb_combine_bytes(ftr + 6, csize); + master_bits = snd_usb_combine_bytes(ftr->controls, csize); /* master configuration quirks */ switch (state->chip->usb_id) { case USB_ID(0x08bb, 0x2702): @@ -1116,21 +1118,21 @@ static int parse_audio_feature_unit(struct mixer_build *state, int unitid, unsig break; } if (channels > 0) - first_ch_bits = snd_usb_combine_bytes(ftr + 6 + csize, csize); + first_ch_bits = snd_usb_combine_bytes(ftr->controls + csize, csize); else first_ch_bits = 0; /* check all control types */ for (i = 0; i < 10; i++) { unsigned int ch_bits = 0; for (j = 0; j < channels; j++) { - unsigned int mask = snd_usb_combine_bytes(ftr + 6 + csize * (j+1), csize); + unsigned int mask = snd_usb_combine_bytes(ftr->controls + csize * (j+1), csize); if (mask & (1 << i)) ch_bits |= (1 << j); } if (ch_bits & 1) /* the first channel must be set (for ease of programming) */ - build_feature_ctl(state, ftr, ch_bits, i, &iterm, unitid); + build_feature_ctl(state, _ftr, ch_bits, i, &iterm, unitid); if (master_bits & (1 << i)) - build_feature_ctl(state, ftr, 0, i, &iterm, unitid); + build_feature_ctl(state, _ftr, 0, i, &iterm, unitid); } return 0; @@ -1777,7 +1779,7 @@ static int snd_usb_mixer_dev_free(struct snd_device *device) */ static int snd_usb_mixer_controls(struct usb_mixer_interface *mixer) { - unsigned char *desc; + struct uac_output_terminal_descriptor_v1 *desc; struct mixer_build state; int err; const struct usbmix_ctl_map *map; @@ -1800,15 +1802,14 @@ static int snd_usb_mixer_controls(struct usb_mixer_interface *mixer) } } - desc = NULL; while ((desc = snd_usb_find_csint_desc(hostif->extra, hostif->extralen, desc, OUTPUT_TERMINAL)) != NULL) { - if (desc[0] < 9) + if (desc->bLength < 9) continue; /* invalid descriptor? */ - set_bit(desc[3], state.unitbitmap); /* mark terminal ID as visited */ - state.oterm.id = desc[3]; - state.oterm.type = combine_word(&desc[4]); - state.oterm.name = desc[8]; - err = parse_audio_unit(&state, desc[7]); + set_bit(desc->bTerminalID, state.unitbitmap); /* mark terminal ID as visited */ + state.oterm.id = desc->bTerminalID; + state.oterm.type = le16_to_cpu(desc->wTerminalType); + state.oterm.name = desc->iTerminal; + err = parse_audio_unit(&state, desc->bSourceID); if (err < 0) return err; } -- 1.6.6.2 ^ permalink raw reply related [flat|nested] 48+ messages in thread
* Re: [PATCH 1/5] ALSA: usbaudio: parse USB descriptors with structs 2010-02-22 22:49 ` [PATCH 1/5] ALSA: usbaudio: parse USB descriptors with structs Daniel Mack @ 2010-02-23 7:50 ` Clemens Ladisch 2010-02-23 7:57 ` Takashi Iwai 2010-02-23 8:07 ` [PATCH 1/5] ALSA: usbaudio: parse USB descriptors with structs Daniel Mack 2010-02-23 7:56 ` Takashi Iwai 1 sibling, 2 replies; 48+ messages in thread From: Clemens Ladisch @ 2010-02-23 7:50 UTC (permalink / raw) To: Daniel Mack; +Cc: 岩井 隆, alsa-devel Daniel Mack wrote: > In preparation of support for v2.0 audio class, use the structs from > linux/usb/audio.h and add some new ones to describe the fields that are > actually parsed by the descriptor decoders. > ... > --- a/include/linux/usb/audio.h > +++ b/include/linux/usb/audio.h > @@ -81,7 +81,7 @@ > > /* Terminal Control Selectors */ > /* 4.3.2 Class-Specific AC Interface Descriptor */ > -struct uac_ac_header_descriptor { > +struct uac_ac_header_descriptor_v1 { This header is already used by drivers in drivers/usb/gadget/. If there isn't too much overlap between v1 and v2 descriptors, it might make sense to put them in separate headers (audio2.h) and to put the parsers for v1 and v2 into separate files, too. Regards, Clemens ^ permalink raw reply [flat|nested] 48+ messages in thread
* Re: [PATCH 1/5] ALSA: usbaudio: parse USB descriptors with structs 2010-02-23 7:50 ` Clemens Ladisch @ 2010-02-23 7:57 ` Takashi Iwai 2010-02-23 8:10 ` Daniel Mack 2010-02-23 8:07 ` [PATCH 1/5] ALSA: usbaudio: parse USB descriptors with structs Daniel Mack 1 sibling, 1 reply; 48+ messages in thread From: Takashi Iwai @ 2010-02-23 7:57 UTC (permalink / raw) To: Clemens Ladisch; +Cc: alsa-devel At Tue, 23 Feb 2010 08:50:29 +0100, Clemens Ladisch wrote: > > Daniel Mack wrote: > > In preparation of support for v2.0 audio class, use the structs from > > linux/usb/audio.h and add some new ones to describe the fields that are > > actually parsed by the descriptor decoders. > > ... > > --- a/include/linux/usb/audio.h > > +++ b/include/linux/usb/audio.h > > @@ -81,7 +81,7 @@ > > > > /* Terminal Control Selectors */ > > /* 4.3.2 Class-Specific AC Interface Descriptor */ > > -struct uac_ac_header_descriptor { > > +struct uac_ac_header_descriptor_v1 { > > This header is already used by drivers in drivers/usb/gadget/. > > If there isn't too much overlap between v1 and v2 descriptors, it might > make sense to put them in separate headers (audio2.h) and to put the > parsers for v1 and v2 into separate files, too. Good point. But this can be in another patch? Takashi ^ permalink raw reply [flat|nested] 48+ messages in thread
* Re: [PATCH 1/5] ALSA: usbaudio: parse USB descriptors with structs 2010-02-23 7:57 ` Takashi Iwai @ 2010-02-23 8:10 ` Daniel Mack 2010-02-23 8:22 ` Takashi Iwai 0 siblings, 1 reply; 48+ messages in thread From: Daniel Mack @ 2010-02-23 8:10 UTC (permalink / raw) To: Takashi Iwai; +Cc: alsa-devel, Clemens Ladisch On Tue, Feb 23, 2010 at 08:57:32AM +0100, Takashi Iwai wrote: > At Tue, 23 Feb 2010 08:50:29 +0100, > Clemens Ladisch wrote: > > > > Daniel Mack wrote: > > > In preparation of support for v2.0 audio class, use the structs from > > > linux/usb/audio.h and add some new ones to describe the fields that are > > > actually parsed by the descriptor decoders. > > > ... > > > --- a/include/linux/usb/audio.h > > > +++ b/include/linux/usb/audio.h > > > @@ -81,7 +81,7 @@ > > > > > > /* Terminal Control Selectors */ > > > /* 4.3.2 Class-Specific AC Interface Descriptor */ > > > -struct uac_ac_header_descriptor { > > > +struct uac_ac_header_descriptor_v1 { > > > > This header is already used by drivers in drivers/usb/gadget/. > > > > If there isn't too much overlap between v1 and v2 descriptors, it might > > make sense to put them in separate headers (audio2.h) and to put the > > parsers for v1 and v2 into separate files, too. > > Good point. But this can be in another patch? It does break compilation though, so I'll fix that up somehow before merge. Daniel ^ permalink raw reply [flat|nested] 48+ messages in thread
* Re: [PATCH 1/5] ALSA: usbaudio: parse USB descriptors with structs 2010-02-23 8:10 ` Daniel Mack @ 2010-02-23 8:22 ` Takashi Iwai 2010-02-23 8:26 ` Daniel Mack 0 siblings, 1 reply; 48+ messages in thread From: Takashi Iwai @ 2010-02-23 8:22 UTC (permalink / raw) To: Daniel Mack; +Cc: alsa-devel, Clemens Ladisch At Tue, 23 Feb 2010 09:10:32 +0100, Daniel Mack wrote: > > On Tue, Feb 23, 2010 at 08:57:32AM +0100, Takashi Iwai wrote: > > At Tue, 23 Feb 2010 08:50:29 +0100, > > Clemens Ladisch wrote: > > > > > > Daniel Mack wrote: > > > > In preparation of support for v2.0 audio class, use the structs from > > > > linux/usb/audio.h and add some new ones to describe the fields that are > > > > actually parsed by the descriptor decoders. > > > > ... > > > > --- a/include/linux/usb/audio.h > > > > +++ b/include/linux/usb/audio.h > > > > @@ -81,7 +81,7 @@ > > > > > > > > /* Terminal Control Selectors */ > > > > /* 4.3.2 Class-Specific AC Interface Descriptor */ > > > > -struct uac_ac_header_descriptor { > > > > +struct uac_ac_header_descriptor_v1 { > > > > > > This header is already used by drivers in drivers/usb/gadget/. > > > > > > If there isn't too much overlap between v1 and v2 descriptors, it might > > > make sense to put them in separate headers (audio2.h) and to put the > > > parsers for v1 and v2 into separate files, too. > > > > Good point. But this can be in another patch? > > It does break compilation though, so I'll fix that up somehow before > merge. Well, I'd like to merge this stuff ASAP because the merge window is closing, and I don't want to put such a big thing after the merge window. If you are OK with merging for 2.6.35, then I'm fine to wait. If this is for 2.6.34, I can't wait long. Otherwise, it's easier to put things merged first, then refactor gradually. Takashi ^ permalink raw reply [flat|nested] 48+ messages in thread
* Re: [PATCH 1/5] ALSA: usbaudio: parse USB descriptors with structs 2010-02-23 8:22 ` Takashi Iwai @ 2010-02-23 8:26 ` Daniel Mack 2010-02-23 9:30 ` [PATCH] usb/gadget/{f_audio, gmidi}.c: follow recent changes in audio.h Daniel Mack 0 siblings, 1 reply; 48+ messages in thread From: Daniel Mack @ 2010-02-23 8:26 UTC (permalink / raw) To: Takashi Iwai; +Cc: alsa-devel, Clemens Ladisch On Tue, Feb 23, 2010 at 09:22:21AM +0100, Takashi Iwai wrote: > At Tue, 23 Feb 2010 09:10:32 +0100, > Daniel Mack wrote: > > It does break compilation though, so I'll fix that up somehow before > > merge. > > Well, I'd like to merge this stuff ASAP because the merge window is > closing, and I don't want to put such a big thing after the merge > window. > > If you are OK with merging for 2.6.35, then I'm fine to wait. > If this is for 2.6.34, I can't wait long. That's right. There hasn't been much real refactoring done, so that's a good state to merge it and test it for regressions. More support for v2 can be aimed for for .35. > Otherwise, it's easier to put things merged first, then refactor > gradually. Ok good. I'll fix the gadget drivers later today. Thanks, Daniel ^ permalink raw reply [flat|nested] 48+ messages in thread
* [PATCH] usb/gadget/{f_audio, gmidi}.c: follow recent changes in audio.h 2010-02-23 8:26 ` Daniel Mack @ 2010-02-23 9:30 ` Daniel Mack 2010-02-23 9:51 ` Takashi Iwai 0 siblings, 1 reply; 48+ messages in thread From: Daniel Mack @ 2010-02-23 9:30 UTC (permalink / raw) To: alsa-devel; +Cc: tiwai, dbrownell, clemens, gregkh Some structs in linux/usb/audio.h have got new names to mark them as part of version 1.0 of the USB audio standard. Follow these changes in the gadget drivers. Not that this header and the ALSA USB driver will undergo some refactoring soon, so there might be another update to the gadgets as well. Signed-off-by: Daniel Mack <daniel@caiaq.de> --- I believe this would be best to go thru the ALSA tree as the other changes are there, too. drivers/usb/gadget/f_audio.c | 6 +++--- drivers/usb/gadget/gmidi.c | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/drivers/usb/gadget/f_audio.c b/drivers/usb/gadget/f_audio.c index df77f61..f1e3aad 100644 --- a/drivers/usb/gadget/f_audio.c +++ b/drivers/usb/gadget/f_audio.c @@ -60,7 +60,7 @@ DECLARE_UAC_AC_HEADER_DESCRIPTOR(2); #define UAC_DT_TOTAL_LENGTH (UAC_DT_AC_HEADER_LENGTH + UAC_DT_INPUT_TERMINAL_SIZE \ + UAC_DT_OUTPUT_TERMINAL_SIZE + UAC_DT_FEATURE_UNIT_SIZE(0)) /* B.3.2 Class-Specific AC Interface Descriptor */ -static struct uac_ac_header_descriptor_2 ac_header_desc = { +static struct uac_ac_header_descriptor_v1_2 ac_header_desc = { .bLength = UAC_DT_AC_HEADER_LENGTH, .bDescriptorType = USB_DT_CS_INTERFACE, .bDescriptorSubtype = UAC_HEADER, @@ -124,7 +124,7 @@ static struct usb_audio_control_selector feature_unit = { }; #define OUTPUT_TERMINAL_ID 3 -static struct uac_output_terminal_descriptor output_terminal_desc = { +static struct uac_output_terminal_descriptor_v1 output_terminal_desc = { .bLength = UAC_DT_OUTPUT_TERMINAL_SIZE, .bDescriptorType = USB_DT_CS_INTERFACE, .bDescriptorSubtype = UAC_OUTPUT_TERMINAL, @@ -154,7 +154,7 @@ static struct usb_interface_descriptor as_interface_alt_1_desc = { }; /* B.4.2 Class-Specific AS Interface Descriptor */ -static struct uac_as_header_descriptor as_header_desc = { +static struct uac_as_header_descriptor_v1 as_header_desc = { .bLength = UAC_DT_AS_HEADER_SIZE, .bDescriptorType = USB_DT_CS_INTERFACE, .bDescriptorSubtype = UAC_AS_GENERAL, diff --git a/drivers/usb/gadget/gmidi.c b/drivers/usb/gadget/gmidi.c index d0b1e83..5f6a2e0 100644 --- a/drivers/usb/gadget/gmidi.c +++ b/drivers/usb/gadget/gmidi.c @@ -237,7 +237,7 @@ static const struct usb_interface_descriptor ac_interface_desc = { }; /* B.3.2 Class-Specific AC Interface Descriptor */ -static const struct uac_ac_header_descriptor_1 ac_header_desc = { +static const struct uac_ac_header_descriptor_v1_1 ac_header_desc = { .bLength = UAC_DT_AC_HEADER_SIZE(1), .bDescriptorType = USB_DT_CS_INTERFACE, .bDescriptorSubtype = USB_MS_HEADER, -- 1.6.6.2 ^ permalink raw reply related [flat|nested] 48+ messages in thread
* Re: [PATCH] usb/gadget/{f_audio, gmidi}.c: follow recent changes in audio.h 2010-02-23 9:30 ` [PATCH] usb/gadget/{f_audio, gmidi}.c: follow recent changes in audio.h Daniel Mack @ 2010-02-23 9:51 ` Takashi Iwai 2010-02-23 10:14 ` Paul Menzel 2010-02-23 23:31 ` Greg KH 0 siblings, 2 replies; 48+ messages in thread From: Takashi Iwai @ 2010-02-23 9:51 UTC (permalink / raw) To: Daniel Mack; +Cc: alsa-devel, dbrownell, clemens, gregkh At Tue, 23 Feb 2010 10:30:00 +0100, Daniel Mack wrote: > > Some structs in linux/usb/audio.h have got new names to mark them as > part of version 1.0 of the USB audio standard. Follow these changes > in the gadget drivers. > > Not that this header and the ALSA USB driver will undergo some > refactoring soon, so there might be another update to the gadgets as > well. > > Signed-off-by: Daniel Mack <daniel@caiaq.de> > --- > I believe this would be best to go thru the ALSA tree as the other > changes are there, too. Yep, now applied to topic/usb-v2.0 branch of sound git tree. If anyone has no objection, I'll merge this branch today for linux-next. thanks, Takashi > drivers/usb/gadget/f_audio.c | 6 +++--- > drivers/usb/gadget/gmidi.c | 2 +- > 2 files changed, 4 insertions(+), 4 deletions(-) > > diff --git a/drivers/usb/gadget/f_audio.c b/drivers/usb/gadget/f_audio.c > index df77f61..f1e3aad 100644 > --- a/drivers/usb/gadget/f_audio.c > +++ b/drivers/usb/gadget/f_audio.c > @@ -60,7 +60,7 @@ DECLARE_UAC_AC_HEADER_DESCRIPTOR(2); > #define UAC_DT_TOTAL_LENGTH (UAC_DT_AC_HEADER_LENGTH + UAC_DT_INPUT_TERMINAL_SIZE \ > + UAC_DT_OUTPUT_TERMINAL_SIZE + UAC_DT_FEATURE_UNIT_SIZE(0)) > /* B.3.2 Class-Specific AC Interface Descriptor */ > -static struct uac_ac_header_descriptor_2 ac_header_desc = { > +static struct uac_ac_header_descriptor_v1_2 ac_header_desc = { > .bLength = UAC_DT_AC_HEADER_LENGTH, > .bDescriptorType = USB_DT_CS_INTERFACE, > .bDescriptorSubtype = UAC_HEADER, > @@ -124,7 +124,7 @@ static struct usb_audio_control_selector feature_unit = { > }; > > #define OUTPUT_TERMINAL_ID 3 > -static struct uac_output_terminal_descriptor output_terminal_desc = { > +static struct uac_output_terminal_descriptor_v1 output_terminal_desc = { > .bLength = UAC_DT_OUTPUT_TERMINAL_SIZE, > .bDescriptorType = USB_DT_CS_INTERFACE, > .bDescriptorSubtype = UAC_OUTPUT_TERMINAL, > @@ -154,7 +154,7 @@ static struct usb_interface_descriptor as_interface_alt_1_desc = { > }; > > /* B.4.2 Class-Specific AS Interface Descriptor */ > -static struct uac_as_header_descriptor as_header_desc = { > +static struct uac_as_header_descriptor_v1 as_header_desc = { > .bLength = UAC_DT_AS_HEADER_SIZE, > .bDescriptorType = USB_DT_CS_INTERFACE, > .bDescriptorSubtype = UAC_AS_GENERAL, > diff --git a/drivers/usb/gadget/gmidi.c b/drivers/usb/gadget/gmidi.c > index d0b1e83..5f6a2e0 100644 > --- a/drivers/usb/gadget/gmidi.c > +++ b/drivers/usb/gadget/gmidi.c > @@ -237,7 +237,7 @@ static const struct usb_interface_descriptor ac_interface_desc = { > }; > > /* B.3.2 Class-Specific AC Interface Descriptor */ > -static const struct uac_ac_header_descriptor_1 ac_header_desc = { > +static const struct uac_ac_header_descriptor_v1_1 ac_header_desc = { > .bLength = UAC_DT_AC_HEADER_SIZE(1), > .bDescriptorType = USB_DT_CS_INTERFACE, > .bDescriptorSubtype = USB_MS_HEADER, > -- > 1.6.6.2 > ^ permalink raw reply [flat|nested] 48+ messages in thread
* Re: [PATCH] usb/gadget/{f_audio, gmidi}.c: follow recent changes in audio.h 2010-02-23 9:51 ` Takashi Iwai @ 2010-02-23 10:14 ` Paul Menzel 2010-02-23 10:29 ` Daniel Mack 2010-02-23 23:31 ` Greg KH 1 sibling, 1 reply; 48+ messages in thread From: Paul Menzel @ 2010-02-23 10:14 UTC (permalink / raw) To: alsa-devel [-- Attachment #1.1: Type: text/plain, Size: 673 bytes --] Am Dienstag, den 23.02.2010, 10:51 +0100 schrieb Takashi Iwai: > At Tue, 23 Feb 2010 10:30:00 +0100, > Daniel Mack wrote: > > > > Some structs in linux/usb/audio.h have got new names to mark them as > > part of version 1.0 of the USB audio standard. Follow these changes > > in the gadget drivers. > > > > Not that this header and the ALSA USB driver will undergo some s/Not/Note/ […] > Yep, now applied to topic/usb-v2.0 branch of sound git tree. > > If anyone has no objection, I'll merge this branch today for > linux-next. Sorry for this nit-picking, but I think this typo makes everyone to read this paragraph twice. Thanks, Paul [-- Attachment #1.2: Dies ist ein digital signierter Nachrichtenteil --] [-- Type: application/pgp-signature, Size: 198 bytes --] [-- Attachment #2: Type: text/plain, Size: 160 bytes --] _______________________________________________ Alsa-devel mailing list Alsa-devel@alsa-project.org http://mailman.alsa-project.org/mailman/listinfo/alsa-devel ^ permalink raw reply [flat|nested] 48+ messages in thread
* Re: [PATCH] usb/gadget/{f_audio, gmidi}.c: follow recent changes in audio.h 2010-02-23 10:14 ` Paul Menzel @ 2010-02-23 10:29 ` Daniel Mack 2010-02-23 11:03 ` Takashi Iwai 0 siblings, 1 reply; 48+ messages in thread From: Daniel Mack @ 2010-02-23 10:29 UTC (permalink / raw) To: Paul Menzel; +Cc: alsa-devel On Tue, Feb 23, 2010 at 11:14:51AM +0100, Paul Menzel wrote: > Am Dienstag, den 23.02.2010, 10:51 +0100 schrieb Takashi Iwai: > > At Tue, 23 Feb 2010 10:30:00 +0100, > > Daniel Mack wrote: > > > > > > Some structs in linux/usb/audio.h have got new names to mark them as > > > part of version 1.0 of the USB audio standard. Follow these changes > > > in the gadget drivers. > > > > > > Not that this header and the ALSA USB driver will undergo some > > s/Not/Note/ > > […] > > > Yep, now applied to topic/usb-v2.0 branch of sound git tree. > > > > If anyone has no objection, I'll merge this branch today for > > linux-next. > > Sorry for this nit-picking, but I think this typo makes everyone to read > this paragraph twice. Yes, I noticed that after I sent, sorry. Takashi, can you amend? Thanks, Daniel _______________________________________________ Alsa-devel mailing list Alsa-devel@alsa-project.org http://mailman.alsa-project.org/mailman/listinfo/alsa-devel ^ permalink raw reply [flat|nested] 48+ messages in thread
* Re: [PATCH] usb/gadget/{f_audio, gmidi}.c: follow recent changes in audio.h 2010-02-23 10:29 ` Daniel Mack @ 2010-02-23 11:03 ` Takashi Iwai 0 siblings, 0 replies; 48+ messages in thread From: Takashi Iwai @ 2010-02-23 11:03 UTC (permalink / raw) To: Daniel Mack; +Cc: alsa-devel, Paul Menzel At Tue, 23 Feb 2010 11:29:23 +0100, Daniel Mack wrote: > > On Tue, Feb 23, 2010 at 11:14:51AM +0100, Paul Menzel wrote: > > Am Dienstag, den 23.02.2010, 10:51 +0100 schrieb Takashi Iwai: > > > At Tue, 23 Feb 2010 10:30:00 +0100, > > > Daniel Mack wrote: > > > > > > > > Some structs in linux/usb/audio.h have got new names to mark them as > > > > part of version 1.0 of the USB audio standard. Follow these changes > > > > in the gadget drivers. > > > > > > > > Not that this header and the ALSA USB driver will undergo some > > > > s/Not/Note/ > > > > […] > > > > > Yep, now applied to topic/usb-v2.0 branch of sound git tree. > > > > > > If anyone has no objection, I'll merge this branch today for > > > linux-next. > > > > Sorry for this nit-picking, but I think this typo makes everyone to read > > this paragraph twice. > > Yes, I noticed that after I sent, sorry. Takashi, can you amend? Done. Please check through topic/usb-v2.0 branch if you have time. git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6.git topic/usb-v2.0 thanks, Takashi _______________________________________________ Alsa-devel mailing list Alsa-devel@alsa-project.org http://mailman.alsa-project.org/mailman/listinfo/alsa-devel ^ permalink raw reply [flat|nested] 48+ messages in thread
* Re: [PATCH] usb/gadget/{f_audio, gmidi}.c: follow recent changes in audio.h 2010-02-23 9:51 ` Takashi Iwai 2010-02-23 10:14 ` Paul Menzel @ 2010-02-23 23:31 ` Greg KH 1 sibling, 0 replies; 48+ messages in thread From: Greg KH @ 2010-02-23 23:31 UTC (permalink / raw) To: Takashi Iwai; +Cc: alsa-devel, dbrownell, clemens On Tue, Feb 23, 2010 at 10:51:45AM +0100, Takashi Iwai wrote: > At Tue, 23 Feb 2010 10:30:00 +0100, > Daniel Mack wrote: > > > > Some structs in linux/usb/audio.h have got new names to mark them as > > part of version 1.0 of the USB audio standard. Follow these changes > > in the gadget drivers. > > > > Not that this header and the ALSA USB driver will undergo some > > refactoring soon, so there might be another update to the gadgets as > > well. > > > > Signed-off-by: Daniel Mack <daniel@caiaq.de> > > --- > > I believe this would be best to go thru the ALSA tree as the other > > changes are there, too. > > Yep, now applied to topic/usb-v2.0 branch of sound git tree. > > If anyone has no objection, I'll merge this branch today for > linux-next. No objection from me, thanks for doing this. greg k-h ^ permalink raw reply [flat|nested] 48+ messages in thread
* Re: [PATCH 1/5] ALSA: usbaudio: parse USB descriptors with structs 2010-02-23 7:50 ` Clemens Ladisch 2010-02-23 7:57 ` Takashi Iwai @ 2010-02-23 8:07 ` Daniel Mack 1 sibling, 0 replies; 48+ messages in thread From: Daniel Mack @ 2010-02-23 8:07 UTC (permalink / raw) To: Clemens Ladisch; +Cc: 岩井 隆, alsa-devel On Tue, Feb 23, 2010 at 08:50:29AM +0100, Clemens Ladisch wrote: > Daniel Mack wrote: > > In preparation of support for v2.0 audio class, use the structs from > > linux/usb/audio.h and add some new ones to describe the fields that are > > actually parsed by the descriptor decoders. > > ... > > --- a/include/linux/usb/audio.h > > +++ b/include/linux/usb/audio.h > > @@ -81,7 +81,7 @@ > > > > /* Terminal Control Selectors */ > > /* 4.3.2 Class-Specific AC Interface Descriptor */ > > -struct uac_ac_header_descriptor { > > +struct uac_ac_header_descriptor_v1 { > > This header is already used by drivers in drivers/usb/gadget/. > > If there isn't too much overlap between v1 and v2 descriptors, it might > make sense to put them in separate headers (audio2.h) and to put the > parsers for v1 and v2 into separate files, too. There's a lot of overlap, v2.0 is more an extension to v1.0, with certain incompatibilties that must be addressed. I can split the headers, that wouldn't be a big thing. But the parsers have too many things in common. I'll have a look whether the common parts could be factored out somehow. I don't like 4000+ line .c files anyway ;) Daniel ^ permalink raw reply [flat|nested] 48+ messages in thread
* Re: [PATCH 1/5] ALSA: usbaudio: parse USB descriptors with structs 2010-02-22 22:49 ` [PATCH 1/5] ALSA: usbaudio: parse USB descriptors with structs Daniel Mack 2010-02-23 7:50 ` Clemens Ladisch @ 2010-02-23 7:56 ` Takashi Iwai 1 sibling, 0 replies; 48+ messages in thread From: Takashi Iwai @ 2010-02-23 7:56 UTC (permalink / raw) To: Daniel Mack; +Cc: alsa-devel, clemens At Mon, 22 Feb 2010 23:49:09 +0100, Daniel Mack wrote: > > @@ -278,7 +280,6 @@ static void *find_audio_control_unit(struct mixer_build *state, unsigned char un > { > unsigned char *p; > > - p = NULL; > while ((p = snd_usb_find_desc(state->buffer, state->buflen, p, > USB_DT_CS_INTERFACE)) != NULL) { > if (p[0] >= 4 && p[2] >= INPUT_TERMINAL && p[2] <= EXTENSION_UN IT && p[3] == unit) This causes the random pointer access. > @@ -1800,15 +1802,14 @@ static int snd_usb_mixer_controls(struct usb_mixer_interface *mixer) > } > } > > - desc = NULL; > while ((desc = snd_usb_find_csint_desc(hostif->extra, hostif->extralen, desc, OUTPUT_TERMINAL)) != NULL) { Ditto. thanks, Takashi ^ permalink raw reply [flat|nested] 48+ messages in thread
* [PATCH 2/5] ALSA: usbaudio: introduce new types for audio class v2 2010-02-22 22:49 usbaudio: Support for USB audio v2.0 devices Daniel Mack 2010-02-22 22:49 ` [PATCH 1/5] ALSA: usbaudio: parse USB descriptors with structs Daniel Mack @ 2010-02-22 22:49 ` Daniel Mack 2010-02-22 22:49 ` [PATCH 3/5] ALSA: usbaudio: implement basic set of class v2.0 parser Daniel Mack ` (2 subsequent siblings) 4 siblings, 0 replies; 48+ messages in thread From: Daniel Mack @ 2010-02-22 22:49 UTC (permalink / raw) To: alsa-devel; +Cc: tiwai, clemens This patch adds some definitions for audio class v2. Unfortunately, the UNIT types PROCESSING_UNIT and EXTENSION_UNIT have different numerical representations in both standards, so there is need for a _V1 add-on now. usbmixer.c is changed accordingly. Signed-off-by: Daniel Mack <daniel@caiaq.de> --- include/linux/usb/audio.h | 57 +++++++++++++++++++++++++++++++++++++++++++++ sound/usb/usbaudio.h | 19 ++++++++++++-- sound/usb/usbmixer.c | 14 +++++----- 3 files changed, 80 insertions(+), 10 deletions(-) diff --git a/include/linux/usb/audio.h b/include/linux/usb/audio.h index 44f82d8..fb1a97b 100644 --- a/include/linux/usb/audio.h +++ b/include/linux/usb/audio.h @@ -25,6 +25,9 @@ #define USB_SUBCLASS_AUDIOSTREAMING 0x02 #define USB_SUBCLASS_MIDISTREAMING 0x03 +#define UAC_VERSION_1 0x00 +#define UAC_VERSION_2 0x20 + /* A.5 Audio Class-Specific AC Interface Descriptor Subtypes */ #define UAC_HEADER 0x01 #define UAC_INPUT_TERMINAL 0x02 @@ -180,6 +183,19 @@ struct uac_as_header_descriptor_v1 { __le16 wFormatTag; /* The Audio Data Format */ } __attribute__ ((packed)); +struct uac_as_header_descriptor_v2 { + __u8 bLength; + __u8 bDescriptorType; + __u8 bDescriptorSubtype; + __u8 bTerminalLink; + __u8 bmControls; + __u8 bFormatType; + __u32 bmFormats; + __u8 bNrChannels; + __u32 bmChannelConfig; + __u8 iChannelNames; +} __attribute__((packed)); + #define UAC_DT_AS_HEADER_SIZE 7 /* Formats - A.1.1 Audio Data Format Type I Codes */ @@ -232,6 +248,19 @@ struct uac_format_type_i_discrete_descriptor_##n { \ #define UAC_FORMAT_TYPE_I_DISCRETE_DESC_SIZE(n) (8 + (n * 3)) +struct uac_format_type_i_ext_descriptor { + __u8 bLength; + __u8 bDescriptorType; + __u8 bDescriptorSubtype; + __u8 bSubslotSize; + __u8 bFormatType; + __u8 bBitResolution; + __u8 bHeaderLength; + __u8 bControlSize; + __u8 bSideBandProtocol; +} __attribute__((packed)); + + /* Formats - Audio Data Format Type I Codes */ struct uac_format_type_ii_discrete_descriptor { @@ -245,11 +274,26 @@ struct uac_format_type_ii_discrete_descriptor { __u8 tSamFreq[][3]; } __attribute__((packed)); +struct uac_format_type_ii_ext_descriptor { + __u8 bLength; + __u8 bDescriptorType; + __u8 bDescriptorSubtype; + __u8 bFormatType; + __u16 wMaxBitRate; + __u16 wSamplesPerFrame; + __u8 bHeaderLength; + __u8 bSideBandProtocol; +} __attribute__((packed)); + + /* Formats - A.2 Format Type Codes */ #define UAC_FORMAT_TYPE_UNDEFINED 0x0 #define UAC_FORMAT_TYPE_I 0x1 #define UAC_FORMAT_TYPE_II 0x2 #define UAC_FORMAT_TYPE_III 0x3 +#define UAC_EXT_FORMAT_TYPE_I 0x81 +#define UAC_EXT_FORMAT_TYPE_II 0x82 +#define UAC_EXT_FORMAT_TYPE_III 0x83 struct uac_iso_endpoint_descriptor { __u8 bLength; /* in bytes: 7 */ @@ -265,6 +309,19 @@ struct uac_iso_endpoint_descriptor { #define UAC_EP_CS_ATTR_PITCH_CONTROL 0x02 #define UAC_EP_CS_ATTR_FILL_MAX 0x80 +/* Audio class v2.0: CLOCK_SOURCE descriptor */ + +struct uac_clock_source_descriptor { + __u8 bLength; + __u8 bDescriptorType; + __u8 bDescriptorSubtype; + __u8 bClockID; + __u8 bmAttributes; + __u8 bmControls; + __u8 bAssocTerminal; + __u8 iClockSource; +} __attribute__((packed)); + /* A.10.2 Feature Unit Control Selectors */ struct uac_feature_unit_descriptor { diff --git a/sound/usb/usbaudio.h b/sound/usb/usbaudio.h index 9d8cea4..4f48293 100644 --- a/sound/usb/usbaudio.h +++ b/sound/usb/usbaudio.h @@ -36,8 +36,17 @@ #define MIXER_UNIT 0x04 #define SELECTOR_UNIT 0x05 #define FEATURE_UNIT 0x06 -#define PROCESSING_UNIT 0x07 -#define EXTENSION_UNIT 0x08 +#define PROCESSING_UNIT_V1 0x07 +#define EXTENSION_UNIT_V1 0x08 + +/* audio class v2 */ +#define EFFECT_UNIT 0x07 +#define PROCESSING_UNIT_V2 0x08 +#define EXTENSION_UNIT_V2 0x09 +#define CLOCK_SOURCE 0x0a +#define CLOCK_SELECTOR 0x0b +#define CLOCK_MULTIPLIER 0x0c +#define SAMPLE_RATE_CONVERTER 0x0d #define AS_GENERAL 0x01 #define FORMAT_TYPE 0x02 @@ -60,7 +69,7 @@ #define EP_CS_ATTR_PITCH_CONTROL 0x02 #define EP_CS_ATTR_FILL_MAX 0x80 -/* Audio Class specific Request Codes */ +/* Audio Class specific Request Codes (v1) */ #define SET_CUR 0x01 #define GET_CUR 0x81 @@ -74,6 +83,10 @@ #define GET_MEM 0x85 #define GET_STAT 0xff +/* Audio Class specific Request Codes (v2) */ +#define CS_CUR 0x01 +#define CS_RANGE 0x02 + /* Terminal Control Selectors */ #define COPY_PROTECT_CONTROL 0x01 diff --git a/sound/usb/usbmixer.c b/sound/usb/usbmixer.c index 3631595..5c21400 100644 --- a/sound/usb/usbmixer.c +++ b/sound/usb/usbmixer.c @@ -282,7 +282,7 @@ static void *find_audio_control_unit(struct mixer_build *state, unsigned char un while ((p = snd_usb_find_desc(state->buffer, state->buflen, p, USB_DT_CS_INTERFACE)) != NULL) { - if (p[0] >= 4 && p[2] >= INPUT_TERMINAL && p[2] <= EXTENSION_UNIT && p[3] == unit) + if (p[0] >= 4 && p[2] >= INPUT_TERMINAL && p[2] <= EXTENSION_UNIT_V1 && p[3] == unit) return p; } return NULL; @@ -603,9 +603,9 @@ static int get_term_name(struct mixer_build *state, struct usb_audio_term *iterm switch (iterm->type >> 16) { case SELECTOR_UNIT: strcpy(name, "Selector"); return 8; - case PROCESSING_UNIT: + case PROCESSING_UNIT_V1: strcpy(name, "Process Unit"); return 12; - case EXTENSION_UNIT: + case EXTENSION_UNIT_V1: strcpy(name, "Ext Unit"); return 8; case MIXER_UNIT: strcpy(name, "Mixer"); return 5; @@ -669,8 +669,8 @@ static int check_input_term(struct mixer_build *state, int id, struct usb_audio_ term->id = id; term->name = p1[9 + p1[0] - 1]; return 0; - case PROCESSING_UNIT: - case EXTENSION_UNIT: + case PROCESSING_UNIT_V1: + case EXTENSION_UNIT_V1: if (p1[6] == 1) { id = p1[7]; break; /* continue to parse */ @@ -1743,9 +1743,9 @@ static int parse_audio_unit(struct mixer_build *state, int unitid) return parse_audio_selector_unit(state, unitid, p1); case FEATURE_UNIT: return parse_audio_feature_unit(state, unitid, p1); - case PROCESSING_UNIT: + case PROCESSING_UNIT_V1: return parse_audio_processing_unit(state, unitid, p1); - case EXTENSION_UNIT: + case EXTENSION_UNIT_V1: return parse_audio_extension_unit(state, unitid, p1); default: snd_printk(KERN_ERR "usbaudio: unit %u: unexpected type 0x%02x\n", unitid, p1[2]); -- 1.6.6.2 ^ permalink raw reply related [flat|nested] 48+ messages in thread
* [PATCH 3/5] ALSA: usbaudio: implement basic set of class v2.0 parser 2010-02-22 22:49 usbaudio: Support for USB audio v2.0 devices Daniel Mack 2010-02-22 22:49 ` [PATCH 1/5] ALSA: usbaudio: parse USB descriptors with structs Daniel Mack 2010-02-22 22:49 ` [PATCH 2/5] ALSA: usbaudio: introduce new types for audio class v2 Daniel Mack @ 2010-02-22 22:49 ` Daniel Mack 2010-02-22 22:49 ` [PATCH 4/5] ALSA: usbmixer: bail out early when parsing audio class v2 descriptors Daniel Mack 2010-02-22 22:49 ` [PATCH 5/5] ALSA: usbaudio: consolidate header files Daniel Mack 4 siblings, 0 replies; 48+ messages in thread From: Daniel Mack @ 2010-02-22 22:49 UTC (permalink / raw) To: alsa-devel; +Cc: tiwai, clemens This adds a number of parsers for audio class v2.0. In particular, the following internals are different and now handled by the code: * the number of streaming interfaces is now reported by an interface association descriptor. The old approach using a proprietary descriptor is deprecated. * The number of channels per interface is now stored in the AS_GENERAL descriptor (used to be part of the FORMAT_TYPE descriptor). * The list of supported sample rates is no longer stored in a variable length appendix of the format_type descriptor but is retrieved from the device using a class specific GET_RANGE command. * Supported sample formats are now reported as 32bit bitmap rather than a fixed value. For now, this is worked around by choosing just one of them. * A devices needs to have at least one CLOCK_SOURCE descriptor which denotes a clockID that is needed im the class request command. * Many descriptors (format_type, ...) have changed their layout. Handle this by casting the descriptors to the appropriate structs. Signed-off-by: Daniel Mack <daniel@caiaq.de> --- sound/usb/usbaudio.c | 352 +++++++++++++++++++++++++++++++++++++++++--------- sound/usb/usbaudio.h | 3 + 2 files changed, 292 insertions(+), 63 deletions(-) diff --git a/sound/usb/usbaudio.c b/sound/usb/usbaudio.c index 5d7d659..34dc687 100644 --- a/sound/usb/usbaudio.c +++ b/sound/usb/usbaudio.c @@ -2422,17 +2422,53 @@ static int is_big_endian_format(struct snd_usb_audio *chip, struct audioformat * * @format: the format tag (wFormatTag) * @fmt: the format type descriptor */ -static int parse_audio_format_i_type(struct snd_usb_audio *chip, struct audioformat *fp, - int format, void *fmt_raw) +static int parse_audio_format_i_type(struct snd_usb_audio *chip, + struct audioformat *fp, + int format, void *_fmt, + int protocol) { - int pcm_format; + int pcm_format, i; int sample_width, sample_bytes; - struct uac_format_type_i_discrete_descriptor *fmt = fmt_raw; + + switch (protocol) { + case UAC_VERSION_1: { + struct uac_format_type_i_discrete_descriptor *fmt = _fmt; + sample_width = fmt->bBitResolution; + sample_bytes = fmt->bSubframeSize; + break; + } + + case UAC_VERSION_2: { + struct uac_format_type_i_ext_descriptor *fmt = _fmt; + sample_width = fmt->bBitResolution; + sample_bytes = fmt->bSubslotSize; + + /* + * FIXME + * USB audio class v2 devices specify a bitmap of possible + * audio formats rather than one fix value. For now, we just + * pick one of them and report that as the only possible + * value for this setting. + * The bit allocation map is in fact compatible to the + * wFormatTag of the v1 AS streaming descriptors, which is why + * we can simply map the matrix. + */ + + for (i = 0; i < 5; i++) + if (format & (1UL << i)) { + format = i + 1; + break; + } + + break; + } + + default: + return -EINVAL; + } /* FIXME: correct endianess and sign? */ pcm_format = -1; - sample_width = fmt->bBitResolution; - sample_bytes = fmt->bSubframeSize; switch (format) { case 0: /* some devices don't define this correctly... */ @@ -2446,6 +2482,7 @@ static int parse_audio_format_i_type(struct snd_usb_audio *chip, struct audiofor sample_width, sample_bytes); } /* check the format byte size */ + printk(" XXXXX SAMPLE BYTES %d\n", sample_bytes); switch (sample_bytes) { case 1: pcm_format = SNDRV_PCM_FORMAT_S8; @@ -2500,7 +2537,7 @@ static int parse_audio_format_i_type(struct snd_usb_audio *chip, struct audiofor /* * parse the format descriptor and stores the possible sample rates - * on the audioformat table. + * on the audioformat table (audio class v1). * * @dev: usb device * @fp: audioformat record @@ -2508,8 +2545,8 @@ static int parse_audio_format_i_type(struct snd_usb_audio *chip, struct audiofor * @offset: the start offset of descriptor pointing the rate type * (7 for type I and II, 8 for type II) */ -static int parse_audio_format_rates(struct snd_usb_audio *chip, struct audioformat *fp, - unsigned char *fmt, int offset) +static int parse_audio_format_rates_v1(struct snd_usb_audio *chip, struct audioformat *fp, + unsigned char *fmt, int offset) { int nr_rates = fmt[offset]; @@ -2565,13 +2602,85 @@ static int parse_audio_format_rates(struct snd_usb_audio *chip, struct audioform } /* + * parse the format descriptor and stores the possible sample rates + * on the audioformat table (audio class v2). + */ +static int parse_audio_format_rates_v2(struct snd_usb_audio *chip, + struct audioformat *fp, + struct usb_host_interface *iface) +{ + struct usb_device *dev = chip->dev; + unsigned char tmp[2], *data; + int i, nr_rates, data_size, ret = 0; + + /* get the number of sample rates first by only fetching 2 bytes */ + ret = snd_usb_ctl_msg(dev, usb_rcvctrlpipe(dev, 0), CS_RANGE, + USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_IN, + 0x0100, chip->clock_id << 8, tmp, sizeof(tmp), 1000); + + if (ret < 0) { + snd_printk(KERN_ERR "unable to retrieve number of sample rates\n"); + goto err; + } + + nr_rates = (tmp[1] << 8) | tmp[0]; + data_size = 2 + 12 * nr_rates; + data = kzalloc(data_size, GFP_KERNEL); + if (!data) { + ret = -ENOMEM; + goto err; + } + + /* now get the full information */ + ret = snd_usb_ctl_msg(dev, usb_rcvctrlpipe(dev, 0), CS_RANGE, + USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_IN, + 0x0100, chip->clock_id << 8, data, data_size, 1000); + + if (ret < 0) { + snd_printk(KERN_ERR "unable to retrieve sample rate range\n"); + ret = -EINVAL; + goto err_free; + } + + fp->rate_table = kmalloc(sizeof(int) * nr_rates, GFP_KERNEL); + if (!fp->rate_table) { + ret = -ENOMEM; + goto err_free; + } + + fp->nr_rates = 0; + fp->rate_min = fp->rate_max = 0; + + for (i = 0; i < nr_rates; i++) { + int rate = combine_quad(&data[2 + 12 * i]); + + fp->rate_table[fp->nr_rates] = rate; + if (!fp->rate_min || rate < fp->rate_min) + fp->rate_min = rate; + if (!fp->rate_max || rate > fp->rate_max) + fp->rate_max = rate; + fp->rates |= snd_pcm_rate_to_rate_bit(rate); + fp->nr_rates++; + } + +err_free: + kfree(data); +err: + return ret; +} + +/* * parse the format type I and III descriptors */ -static int parse_audio_format_i(struct snd_usb_audio *chip, struct audioformat *fp, - int format, void *fmt_raw) +static int parse_audio_format_i(struct snd_usb_audio *chip, + struct audioformat *fp, + int format, void *_fmt, + struct usb_host_interface *iface) { - int pcm_format; - struct uac_format_type_i_discrete_descriptor *fmt = fmt_raw; + struct usb_interface_descriptor *altsd = get_iface_desc(iface); + struct uac_format_type_i_discrete_descriptor *fmt = _fmt; + int protocol = altsd->bInterfaceProtocol; + int pcm_format, ret; if (fmt->bFormatType == USB_FORMAT_TYPE_III) { /* FIXME: the format type is really IECxxx @@ -2591,30 +2700,49 @@ static int parse_audio_format_i(struct snd_usb_audio *chip, struct audioformat * pcm_format = SNDRV_PCM_FORMAT_S16_LE; } } else { - pcm_format = parse_audio_format_i_type(chip, fp, format, fmt); + pcm_format = parse_audio_format_i_type(chip, fp, format, fmt, protocol); if (pcm_format < 0) return -1; } fp->format = pcm_format; - fp->channels = fmt->bNrChannels; + + /* gather possible sample rates */ + /* audio class v1 reports possible sample rates as part of the + * proprietary class specific descriptor. + * audio class v2 uses class specific EP0 range requests for that. + */ + switch (protocol) { + case UAC_VERSION_1: + fp->channels = fmt->bNrChannels; + ret = parse_audio_format_rates_v1(chip, fp, _fmt, 7); + break; + case UAC_VERSION_2: + /* fp->channels is already set in this case */ + ret = parse_audio_format_rates_v2(chip, fp, iface); + break; + } if (fp->channels < 1) { snd_printk(KERN_ERR "%d:%u:%d : invalid channels %d\n", chip->dev->devnum, fp->iface, fp->altsetting, fp->channels); return -1; } - return parse_audio_format_rates(chip, fp, fmt_raw, 7); + + return ret; } /* * parse the format type II descriptor */ -static int parse_audio_format_ii(struct snd_usb_audio *chip, struct audioformat *fp, - int format, void *fmt_raw) +static int parse_audio_format_ii(struct snd_usb_audio *chip, + struct audioformat *fp, + int format, void *_fmt, + struct usb_host_interface *iface) { - int brate, framesize; - struct uac_format_type_ii_discrete_descriptor *fmt = fmt_raw; + int brate, framesize, ret; + struct usb_interface_descriptor *altsd = get_iface_desc(iface); + int protocol = altsd->bInterfaceProtocol; switch (format) { case USB_AUDIO_FORMAT_AC3: @@ -2634,35 +2762,50 @@ static int parse_audio_format_ii(struct snd_usb_audio *chip, struct audioformat fp->channels = 1; - brate = le16_to_cpu(fmt->wMaxBitRate); - framesize = le16_to_cpu(fmt->wSamplesPerFrame); - snd_printd(KERN_INFO "found format II with max.bitrate = %d, frame size=%d\n", brate, framesize); - fp->frame_size = framesize; - return parse_audio_format_rates(chip, fp, fmt_raw, 8); /* fmt[8..] sample rates */ + switch (protocol) { + case UAC_VERSION_1: { + struct uac_format_type_ii_discrete_descriptor *fmt = _fmt; + brate = le16_to_cpu(fmt->wMaxBitRate); + framesize = le16_to_cpu(fmt->wSamplesPerFrame); + snd_printd(KERN_INFO "found format II with max.bitrate = %d, frame size=%d\n", brate, framesize); + fp->frame_size = framesize; + ret = parse_audio_format_rates_v1(chip, fp, _fmt, 8); /* fmt[8..] sample rates */ + break; + } + case UAC_VERSION_2: { + struct uac_format_type_ii_ext_descriptor *fmt = _fmt; + brate = le16_to_cpu(fmt->wMaxBitRate); + framesize = le16_to_cpu(fmt->wSamplesPerFrame); + snd_printd(KERN_INFO "found format II with max.bitrate = %d, frame size=%d\n", brate, framesize); + fp->frame_size = framesize; + ret = parse_audio_format_rates_v2(chip, fp, iface); + break; + } + } + + return ret; } static int parse_audio_format(struct snd_usb_audio *chip, struct audioformat *fp, - int format, void *fmt_raw, int stream) + int format, unsigned char *fmt, int stream, + struct usb_host_interface *iface) { int err; - /* we only parse the common header of all format types here, - * so it is safe to take a type_i struct */ - struct uac_format_type_i_discrete_descriptor *fmt = fmt_raw; - switch (fmt->bFormatType) { + switch (fmt[3]) { case USB_FORMAT_TYPE_I: case USB_FORMAT_TYPE_III: - err = parse_audio_format_i(chip, fp, format, fmt); + err = parse_audio_format_i(chip, fp, format, fmt, iface); break; case USB_FORMAT_TYPE_II: - err = parse_audio_format_ii(chip, fp, format, fmt); + err = parse_audio_format_ii(chip, fp, format, fmt, iface); break; default: snd_printd(KERN_INFO "%d:%u:%d : format type %d is not supported yet\n", - chip->dev->devnum, fp->iface, fp->altsetting, fmt->bFormatType); + chip->dev->devnum, fp->iface, fp->altsetting, fmt[3]); return -1; } - fp->fmt_type = fmt->bFormatType; + fp->fmt_type = fmt[3]; if (err < 0) return err; #if 1 @@ -2673,7 +2816,7 @@ static int parse_audio_format(struct snd_usb_audio *chip, struct audioformat *fp if (chip->usb_id == USB_ID(0x041e, 0x3000) || chip->usb_id == USB_ID(0x041e, 0x3020) || chip->usb_id == USB_ID(0x041e, 0x3061)) { - if (fmt->bFormatType == USB_FORMAT_TYPE_I && + if (fmt[3] == USB_FORMAT_TYPE_I && fp->rates != SNDRV_PCM_RATE_48000 && fp->rates != SNDRV_PCM_RATE_96000) return -1; @@ -2702,10 +2845,10 @@ static int parse_audio_endpoints(struct snd_usb_audio *chip, int iface_no) struct usb_host_interface *alts; struct usb_interface_descriptor *altsd; int i, altno, err, stream; - int format; + int format = 0, num_channels = 0; struct audioformat *fp = NULL; unsigned char *fmt, *csep; - int num; + int num, protocol; dev = chip->dev; @@ -2722,10 +2865,9 @@ static int parse_audio_endpoints(struct snd_usb_audio *chip, int iface_no) num = 4; for (i = 0; i < num; i++) { - struct uac_as_header_descriptor_v1 *as; - alts = &iface->altsetting[i]; altsd = get_iface_desc(alts); + protocol = altsd->bInterfaceProtocol; /* skip invalid one */ if ((altsd->bInterfaceClass != USB_CLASS_AUDIO && altsd->bInterfaceClass != USB_CLASS_VENDOR_SPEC) || @@ -2742,7 +2884,7 @@ static int parse_audio_endpoints(struct snd_usb_audio *chip, int iface_no) stream = (get_endpoint(alts, 0)->bEndpointAddress & USB_DIR_IN) ? SNDRV_PCM_STREAM_CAPTURE : SNDRV_PCM_STREAM_PLAYBACK; altno = altsd->bAlternateSetting; - + /* audiophile usb: skip altsets incompatible with device_setup */ if (chip->usb_id == USB_ID(0x0763, 0x2003) && @@ -2750,21 +2892,54 @@ static int parse_audio_endpoints(struct snd_usb_audio *chip, int iface_no) continue; /* get audio formats */ - as = snd_usb_find_csint_desc(alts->extra, alts->extralen, NULL, AS_GENERAL); + switch (protocol) { + case UAC_VERSION_1: { + struct uac_as_header_descriptor_v1 *as = + snd_usb_find_csint_desc(alts->extra, alts->extralen, NULL, AS_GENERAL); + + if (!as) { + snd_printk(KERN_ERR "%d:%u:%d : AS_GENERAL descriptor not found\n", + dev->devnum, iface_no, altno); + continue; + } - if (!as) { - snd_printk(KERN_ERR "%d:%u:%d : AS_GENERAL descriptor not found\n", - dev->devnum, iface_no, altno); - continue; + if (as->bLength < sizeof(*as)) { + snd_printk(KERN_ERR "%d:%u:%d : invalid AS_GENERAL desc\n", + dev->devnum, iface_no, altno); + continue; + } + + format = le16_to_cpu(as->wFormatTag); /* remember the format value */ + break; } - if (as->bLength < sizeof(*as)) { - snd_printk(KERN_ERR "%d:%u:%d : invalid AS_GENERAL desc\n", - dev->devnum, iface_no, altno); - continue; + case UAC_VERSION_2: { + struct uac_as_header_descriptor_v2 *as = + snd_usb_find_csint_desc(alts->extra, alts->extralen, NULL, AS_GENERAL); + + if (!as) { + snd_printk(KERN_ERR "%d:%u:%d : AS_GENERAL descriptor not found\n", + dev->devnum, iface_no, altno); + continue; + } + + if (as->bLength < sizeof(*as)) { + snd_printk(KERN_ERR "%d:%u:%d : invalid AS_GENERAL desc\n", + dev->devnum, iface_no, altno); + continue; + } + + num_channels = as->bNrChannels; + format = le32_to_cpu(as->bmFormats); + + break; } - format = le16_to_cpu(as->wFormatTag); /* remember the format value */ + default: + snd_printk(KERN_ERR "%d:%u:%d : unknown interface protocol %04x\n", + dev->devnum, iface_no, altno, protocol); + continue; + } /* get format type */ fmt = snd_usb_find_csint_desc(alts->extra, alts->extralen, NULL, FORMAT_TYPE); @@ -2773,7 +2948,8 @@ static int parse_audio_endpoints(struct snd_usb_audio *chip, int iface_no) dev->devnum, iface_no, altno); continue; } - if (fmt[0] < 8) { + if (((protocol == UAC_VERSION_1) && (fmt[0] < 8)) || + ((protocol == UAC_VERSION_2) && (fmt[0] != 6))) { snd_printk(KERN_ERR "%d:%u:%d : invalid FORMAT_TYPE desc\n", dev->devnum, iface_no, altno); continue; @@ -2787,6 +2963,7 @@ static int parse_audio_endpoints(struct snd_usb_audio *chip, int iface_no) if (fmt[4] == 1 && fmt[5] == 2 && altno == 2 && num == 3 && fp && fp->altsetting == 1 && fp->channels == 1 && fp->format == SNDRV_PCM_FORMAT_S16_LE && + protocol == UAC_VERSION_1 && le16_to_cpu(get_endpoint(alts, 0)->wMaxPacketSize) == fp->maxpacksize * 2) continue; @@ -2815,6 +2992,8 @@ static int parse_audio_endpoints(struct snd_usb_audio *chip, int iface_no) fp->ep_attr = get_endpoint(alts, 0)->bmAttributes; fp->datainterval = parse_datainterval(chip, alts); fp->maxpacksize = le16_to_cpu(get_endpoint(alts, 0)->wMaxPacketSize); + /* num_channels is only set for v2 interfaces */ + fp->channels = num_channels; if (snd_usb_get_speed(dev) == USB_SPEED_HIGH) fp->maxpacksize = (((fp->maxpacksize >> 11) & 3) + 1) * (fp->maxpacksize & 0x7ff); @@ -2850,7 +3029,7 @@ static int parse_audio_endpoints(struct snd_usb_audio *chip, int iface_no) } /* ok, let's parse further... */ - if (parse_audio_format(chip, fp, format, fmt, stream) < 0) { + if (parse_audio_format(chip, fp, format, fmt, stream, alts) < 0) { kfree(fp->rate_table); kfree(fp); continue; @@ -2958,35 +3137,82 @@ static int snd_usb_create_streams(struct snd_usb_audio *chip, int ctrlif) { struct usb_device *dev = chip->dev; struct usb_host_interface *host_iface; - struct uac_ac_header_descriptor_v1 *h1; + struct usb_interface_descriptor *altsd; void *control_header; - int i; + int i, protocol; /* find audiocontrol interface */ host_iface = &usb_ifnum_to_if(dev, ctrlif)->altsetting[0]; control_header = snd_usb_find_csint_desc(host_iface->extra, host_iface->extralen, NULL, HEADER); + altsd = get_iface_desc(host_iface); + protocol = altsd->bInterfaceProtocol; if (!control_header) { snd_printk(KERN_ERR "cannot find HEADER\n"); return -EINVAL; } - h1 = control_header; + switch (protocol) { + case UAC_VERSION_1: { + struct uac_ac_header_descriptor_v1 *h1 = control_header; - if (!h1->bInCollection) { - snd_printk(KERN_INFO "skipping empty audio interface (v1)\n"); - return -EINVAL; + if (!h1->bInCollection) { + snd_printk(KERN_INFO "skipping empty audio interface (v1)\n"); + return -EINVAL; + } + + if (h1->bLength < sizeof(*h1) + h1->bInCollection) { + snd_printk(KERN_ERR "invalid HEADER (v1)\n"); + return -EINVAL; + } + + for (i = 0; i < h1->bInCollection; i++) + snd_usb_create_stream(chip, ctrlif, h1->baInterfaceNr[i]); + + break; } - if (h1->bLength < sizeof(*h1) + h1->bInCollection) { - snd_printk(KERN_ERR "invalid HEADER (v1)\n"); - return -EINVAL; + case UAC_VERSION_2: { + struct uac_clock_source_descriptor *cs; + struct usb_interface_assoc_descriptor *assoc = + usb_ifnum_to_if(dev, ctrlif)->intf_assoc; + + if (!assoc) { + snd_printk(KERN_ERR "Audio class v2 interfaces need an interface association\n"); + return -EINVAL; + } + + /* FIXME: for now, we expect there is at least one clock source + * descriptor and we always take the first one. + * We should properly support devices with multiple clock sources, + * clock selectors and sample rate conversion units. */ + + cs = snd_usb_find_csint_desc(host_iface->extra, host_iface->extralen, + NULL, CLOCK_SOURCE); + + if (!cs) { + snd_printk(KERN_ERR "CLOCK_SOURCE descriptor not found\n"); + return -EINVAL; + } + + chip->clock_id = cs->bClockID; + + for (i = 0; i < assoc->bInterfaceCount; i++) { + int intf = assoc->bFirstInterface + i; + + if (intf != ctrlif) + snd_usb_create_stream(chip, ctrlif, intf); + } + + break; } - for (i = 0; i < h1->bInCollection; i++) - snd_usb_create_stream(chip, ctrlif, h1->baInterfaceNr[i]); + default: + snd_printk(KERN_ERR "unknown protocol version 0x%02x\n", protocol); + return -EINVAL; + } return 0; } diff --git a/sound/usb/usbaudio.h b/sound/usb/usbaudio.h index 4f48293..26daf68 100644 --- a/sound/usb/usbaudio.h +++ b/sound/usb/usbaudio.h @@ -142,6 +142,9 @@ struct snd_usb_audio { int num_interfaces; int num_suspended_intf; + /* for audio class v2 */ + int clock_id; + struct list_head pcm_list; /* list of pcm streams */ int pcm_devs; -- 1.6.6.2 ^ permalink raw reply related [flat|nested] 48+ messages in thread
* [PATCH 4/5] ALSA: usbmixer: bail out early when parsing audio class v2 descriptors 2010-02-22 22:49 usbaudio: Support for USB audio v2.0 devices Daniel Mack ` (2 preceding siblings ...) 2010-02-22 22:49 ` [PATCH 3/5] ALSA: usbaudio: implement basic set of class v2.0 parser Daniel Mack @ 2010-02-22 22:49 ` Daniel Mack 2010-02-22 22:49 ` [PATCH 5/5] ALSA: usbaudio: consolidate header files Daniel Mack 4 siblings, 0 replies; 48+ messages in thread From: Daniel Mack @ 2010-02-22 22:49 UTC (permalink / raw) To: alsa-devel; +Cc: tiwai, clemens This is just a quick hack that needs to be removed once the new units defined by the audio class v2.0 standard are supported. However, it allows using these devices for now, without mixer support. Signed-off-by: Daniel Mack <daniel@caiaq.de> --- sound/usb/usbmixer.c | 13 ++++++++++++- 1 files changed, 12 insertions(+), 1 deletions(-) diff --git a/sound/usb/usbmixer.c b/sound/usb/usbmixer.c index 5c21400..525caec 100644 --- a/sound/usb/usbmixer.c +++ b/sound/usb/usbmixer.c @@ -2211,7 +2211,8 @@ int snd_usb_create_mixer(struct snd_usb_audio *chip, int ctrlif, .dev_free = snd_usb_mixer_dev_free }; struct usb_mixer_interface *mixer; - int err; + struct usb_host_interface *host_iface; + int err, protocol; strcpy(chip->card->mixername, "USB Mixer"); @@ -2227,6 +2228,16 @@ int snd_usb_create_mixer(struct snd_usb_audio *chip, int ctrlif, return -ENOMEM; } + host_iface = &usb_ifnum_to_if(chip->dev, ctrlif)->altsetting[0]; + protocol = host_iface->desc.bInterfaceProtocol; + + /* FIXME! */ + if (protocol != UAC_VERSION_1) { + snd_printk(KERN_WARNING "mixer interface protocol 0x%02x not yet supported\n", + protocol); + return 0; + } + if ((err = snd_usb_mixer_controls(mixer)) < 0 || (err = snd_usb_mixer_status_create(mixer)) < 0) goto _error; -- 1.6.6.2 ^ permalink raw reply related [flat|nested] 48+ messages in thread
* [PATCH 5/5] ALSA: usbaudio: consolidate header files 2010-02-22 22:49 usbaudio: Support for USB audio v2.0 devices Daniel Mack ` (3 preceding siblings ...) 2010-02-22 22:49 ` [PATCH 4/5] ALSA: usbmixer: bail out early when parsing audio class v2 descriptors Daniel Mack @ 2010-02-22 22:49 ` Daniel Mack 2010-02-23 7:58 ` Takashi Iwai 4 siblings, 1 reply; 48+ messages in thread From: Daniel Mack @ 2010-02-22 22:49 UTC (permalink / raw) To: alsa-devel; +Cc: tiwai, clemens Use the definitions from linux/usb/audio.h all over the ALSA USB audio driver and add some missing definitions there as well. Use the endpoint attribute macros from linux/usb/ch9 and remove the own things from sound/usb/usbaudio.h. Now things are also nicely prefixed which makes understanding the code easier. Signed-off-by: Daniel Mack <daniel@caiaq.de> --- include/linux/usb/audio.h | 31 ++++++++++- sound/usb/usbaudio.c | 125 +++++++++++++++++++++++---------------------- sound/usb/usbaudio.h | 100 ------------------------------------ sound/usb/usbmidi.c | 10 ++-- sound/usb/usbmixer.c | 62 +++++++++++----------- sound/usb/usbquirks.h | 32 ++++++------ 6 files changed, 145 insertions(+), 215 deletions(-) diff --git a/include/linux/usb/audio.h b/include/linux/usb/audio.h index fb1a97b..6bb2936 100644 --- a/include/linux/usb/audio.h +++ b/include/linux/usb/audio.h @@ -35,8 +35,17 @@ #define UAC_MIXER_UNIT 0x04 #define UAC_SELECTOR_UNIT 0x05 #define UAC_FEATURE_UNIT 0x06 -#define UAC_PROCESSING_UNIT 0x07 -#define UAC_EXTENSION_UNIT 0x08 +#define UAC_PROCESSING_UNIT_V1 0x07 +#define UAC_EXTENSION_UNIT_V1 0x08 + +/* UAC v2.0 types */ +#define UAC_EFFECT_UNIT 0x07 +#define UAC_PROCESSING_UNIT_V2 0x08 +#define UAC_EXTENSION_UNIT_V2 0x09 +#define UAC_CLOCK_SOURCE 0x0a +#define UAC_CLOCK_SELECTOR 0x0b +#define UAC_CLOCK_MULTIPLIER 0x0c +#define UAC_SAMPLE_RATE_CONVERTER 0x0d /* A.6 Audio Class-Specific AS Interface Descriptor Subtypes */ #define UAC_AS_GENERAL 0x01 @@ -69,6 +78,10 @@ #define UAC_GET_STAT 0xff +/* Audio class v2.0 handles all the parameter calls differently */ +#define UAC2_CS_CUR 0x01 +#define UAC2_CS_RANGE 0x02 + /* MIDI - A.1 MS Class-Specific Interface Descriptor Subtypes */ #define UAC_MS_HEADER 0x01 #define UAC_MIDI_IN_JACK 0x02 @@ -133,6 +146,10 @@ struct uac_input_terminal_descriptor { #define UAC_INPUT_TERMINAL_MICROPHONE_ARRAY 0x205 #define UAC_INPUT_TERMINAL_PROC_MICROPHONE_ARRAY 0x206 +/* Terminals - control selectors */ + +#define UAC_TERMINAL_CS_COPY_PROTECT_CONTROL 0x01 + /* 4.3.2.2 Output Terminal Descriptor */ struct uac_output_terminal_descriptor_v1 { __u8 bLength; /* in bytes: 9 */ @@ -263,6 +280,9 @@ struct uac_format_type_i_ext_descriptor { /* Formats - Audio Data Format Type I Codes */ +#define UAC_FORMAT_TYPE_II_MPEG 0x1001 +#define UAC_FORMAT_TYPE_II_AC3 0x1002 + struct uac_format_type_ii_discrete_descriptor { __u8 bLength; __u8 bDescriptorType; @@ -285,6 +305,13 @@ struct uac_format_type_ii_ext_descriptor { __u8 bSideBandProtocol; } __attribute__((packed)); +/* type III */ +#define UAC_FORMAT_TYPE_III_IEC1937_AC3 0x2001 +#define UAC_FORMAT_TYPE_III_IEC1937_MPEG1_LAYER1 0x2002 +#define UAC_FORMAT_TYPE_III_IEC1937_MPEG2_NOEXT 0x2003 +#define UAC_FORMAT_TYPE_III_IEC1937_MPEG2_EXT 0x2004 +#define UAC_FORMAT_TYPE_III_IEC1937_MPEG2_LAYER1_LS 0x2005 +#define UAC_FORMAT_TYPE_III_IEC1937_MPEG2_LAYER23_LS 0x2006 /* Formats - A.2 Format Type Codes */ #define UAC_FORMAT_TYPE_UNDEFINED 0x0 diff --git a/sound/usb/usbaudio.c b/sound/usb/usbaudio.c index 34dc687..7bbc333 100644 --- a/sound/usb/usbaudio.c +++ b/sound/usb/usbaudio.c @@ -47,6 +47,7 @@ #include <linux/moduleparam.h> #include <linux/mutex.h> #include <linux/usb/audio.h> +#include <linux/usb/ch9.h> #include <sound/core.h> #include <sound/info.h> @@ -598,7 +599,7 @@ static int prepare_playback_urb(struct snd_usb_substream *subs, if (subs->transfer_done >= runtime->period_size) { subs->transfer_done -= runtime->period_size; period_elapsed = 1; - if (subs->fmt_type == USB_FORMAT_TYPE_II) { + if (subs->fmt_type == UAC_FORMAT_TYPE_II) { if (subs->transfer_done > 0) { /* FIXME: fill-max mode is not * supported yet */ @@ -1106,7 +1107,7 @@ static int init_substream_urbs(struct snd_usb_substream *subs, unsigned int peri u->packets = (i + 1) * total_packs / subs->nurbs - i * total_packs / subs->nurbs; u->buffer_size = maxsize * u->packets; - if (subs->fmt_type == USB_FORMAT_TYPE_II) + if (subs->fmt_type == UAC_FORMAT_TYPE_II) u->packets++; /* for transfer delimiter */ u->urb = usb_alloc_urb(u->packets, GFP_KERNEL); if (!u->urb) @@ -1182,7 +1183,7 @@ static struct audioformat *find_format(struct snd_usb_substream *subs, unsigned if (i >= fp->nr_rates) continue; } - attr = fp->ep_attr & EP_ATTR_MASK; + attr = fp->ep_attr & USB_ENDPOINT_SYNCTYPE; if (! found) { found = fp; cur_attr = attr; @@ -1194,14 +1195,14 @@ static struct audioformat *find_format(struct snd_usb_substream *subs, unsigned * M-audio audiophile USB. */ if (attr != cur_attr) { - if ((attr == EP_ATTR_ASYNC && + if ((attr == USB_ENDPOINT_SYNC_ASYNC && subs->direction == SNDRV_PCM_STREAM_PLAYBACK) || - (attr == EP_ATTR_ADAPTIVE && + (attr == USB_ENDPOINT_SYNC_ADAPTIVE && subs->direction == SNDRV_PCM_STREAM_CAPTURE)) continue; - if ((cur_attr == EP_ATTR_ASYNC && + if ((cur_attr == USB_ENDPOINT_SYNC_ASYNC && subs->direction == SNDRV_PCM_STREAM_PLAYBACK) || - (cur_attr == EP_ATTR_ADAPTIVE && + (cur_attr == USB_ENDPOINT_SYNC_ADAPTIVE && subs->direction == SNDRV_PCM_STREAM_CAPTURE)) { found = fp; cur_attr = attr; @@ -1231,11 +1232,11 @@ static int init_usb_pitch(struct usb_device *dev, int iface, ep = get_endpoint(alts, 0)->bEndpointAddress; /* if endpoint has pitch control, enable it */ - if (fmt->attributes & EP_CS_ATTR_PITCH_CONTROL) { + if (fmt->attributes & UAC_EP_CS_ATTR_PITCH_CONTROL) { data[0] = 1; - if ((err = snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0), SET_CUR, + if ((err = snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0), UAC_SET_CUR, USB_TYPE_CLASS|USB_RECIP_ENDPOINT|USB_DIR_OUT, - PITCH_CONTROL << 8, ep, data, 1, 1000)) < 0) { + UAC_EP_CS_ATTR_PITCH_CONTROL << 8, ep, data, 1, 1000)) < 0) { snd_printk(KERN_ERR "%d:%d:%d: cannot set enable PITCH\n", dev->devnum, iface, ep); return err; @@ -1254,21 +1255,21 @@ static int init_usb_sample_rate(struct usb_device *dev, int iface, ep = get_endpoint(alts, 0)->bEndpointAddress; /* if endpoint has sampling rate control, set it */ - if (fmt->attributes & EP_CS_ATTR_SAMPLE_RATE) { + if (fmt->attributes & UAC_EP_CS_ATTR_SAMPLE_RATE) { int crate; data[0] = rate; data[1] = rate >> 8; data[2] = rate >> 16; - if ((err = snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0), SET_CUR, + if ((err = snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0), UAC_SET_CUR, USB_TYPE_CLASS|USB_RECIP_ENDPOINT|USB_DIR_OUT, - SAMPLING_FREQ_CONTROL << 8, ep, data, 3, 1000)) < 0) { + UAC_EP_CS_ATTR_SAMPLE_RATE << 8, ep, data, 3, 1000)) < 0) { snd_printk(KERN_ERR "%d:%d:%d: cannot set freq %d to ep %#x\n", dev->devnum, iface, fmt->altsetting, rate, ep); return err; } - if ((err = snd_usb_ctl_msg(dev, usb_rcvctrlpipe(dev, 0), GET_CUR, + if ((err = snd_usb_ctl_msg(dev, usb_rcvctrlpipe(dev, 0), UAC_GET_CUR, USB_TYPE_CLASS|USB_RECIP_ENDPOINT|USB_DIR_IN, - SAMPLING_FREQ_CONTROL << 8, ep, data, 3, 1000)) < 0) { + UAC_EP_CS_ATTR_SAMPLE_RATE << 8, ep, data, 3, 1000)) < 0) { snd_printk(KERN_WARNING "%d:%d:%d: cannot get freq at ep %#x\n", dev->devnum, iface, fmt->altsetting, ep); return 0; /* some devices don't support reading */ @@ -1386,9 +1387,9 @@ static int set_format(struct snd_usb_substream *subs, struct audioformat *fmt) * descriptors which fool us. if it has only one EP, * assume it as adaptive-out or sync-in. */ - attr = fmt->ep_attr & EP_ATTR_MASK; - if (((is_playback && attr == EP_ATTR_ASYNC) || - (! is_playback && attr == EP_ATTR_ADAPTIVE)) && + attr = fmt->ep_attr & USB_ENDPOINT_SYNCTYPE; + if (((is_playback && attr == USB_ENDPOINT_SYNC_ASYNC) || + (! is_playback && attr == USB_ENDPOINT_SYNC_ADAPTIVE)) && altsd->bNumEndpoints >= 2) { /* check sync-pipe endpoint */ /* ... and check descriptor size before accessing bSynchAddress @@ -1428,7 +1429,7 @@ static int set_format(struct snd_usb_substream *subs, struct audioformat *fmt) } /* always fill max packet size */ - if (fmt->attributes & EP_CS_ATTR_FILL_MAX) + if (fmt->attributes & UAC_EP_CS_ATTR_FILL_MAX) subs->fill_max = 1; if ((err = init_usb_pitch(dev, subs->interface, alts, fmt)) < 0) @@ -1886,7 +1887,7 @@ static int setup_hw_info(struct snd_pcm_runtime *runtime, struct snd_usb_substre runtime->hw.channels_min = fp->channels; if (runtime->hw.channels_max < fp->channels) runtime->hw.channels_max = fp->channels; - if (fp->fmt_type == USB_FORMAT_TYPE_II && fp->frame_size > 0) { + if (fp->fmt_type == UAC_FORMAT_TYPE_II && fp->frame_size > 0) { /* FIXME: there might be more than one audio formats... */ runtime->hw.period_bytes_min = runtime->hw.period_bytes_max = fp->frame_size; @@ -2120,7 +2121,7 @@ static struct usb_device_id usb_audio_ids [] = { #include "usbquirks.h" { .match_flags = (USB_DEVICE_ID_MATCH_INT_CLASS | USB_DEVICE_ID_MATCH_INT_SUBCLASS), .bInterfaceClass = USB_CLASS_AUDIO, - .bInterfaceSubClass = USB_SUBCLASS_AUDIO_CONTROL }, + .bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL }, { } /* Terminating entry */ }; @@ -2159,7 +2160,7 @@ static void proc_dump_substream_formats(struct snd_usb_substream *subs, struct s snd_iprintf(buffer, " Endpoint: %d %s (%s)\n", fp->endpoint & USB_ENDPOINT_NUMBER_MASK, fp->endpoint & USB_DIR_IN ? "IN" : "OUT", - sync_types[(fp->ep_attr & EP_ATTR_MASK) >> 2]); + sync_types[(fp->ep_attr & USB_ENDPOINT_SYNCTYPE) >> 2]); if (fp->rates & SNDRV_PCM_RATE_CONTINUOUS) { snd_iprintf(buffer, " Rates: %d - %d (continuous)\n", fp->rate_min, fp->rate_max); @@ -2471,11 +2472,11 @@ static int parse_audio_format_i_type(struct snd_usb_audio *chip, pcm_format = -1; switch (format) { - case 0: /* some devices don't define this correctly... */ + case UAC_FORMAT_TYPE_I_UNDEFINED: /* some devices don't define this correctly... */ snd_printdd(KERN_INFO "%d:%u:%d : format type 0 is detected, processed as PCM\n", chip->dev->devnum, fp->iface, fp->altsetting); /* fall-through */ - case USB_AUDIO_FORMAT_PCM: + case UAC_FORMAT_TYPE_I_PCM: if (sample_width > sample_bytes * 8) { snd_printk(KERN_INFO "%d:%u:%d : sample bitwidth %d in over sample bytes %d\n", chip->dev->devnum, fp->iface, fp->altsetting, @@ -2509,7 +2510,7 @@ static int parse_audio_format_i_type(struct snd_usb_audio *chip, break; } break; - case USB_AUDIO_FORMAT_PCM8: + case UAC_FORMAT_TYPE_I_PCM8: pcm_format = SNDRV_PCM_FORMAT_U8; /* Dallas DS4201 workaround: it advertises U8 format, but really @@ -2517,13 +2518,13 @@ static int parse_audio_format_i_type(struct snd_usb_audio *chip, if (chip->usb_id == USB_ID(0x04fa, 0x4201)) pcm_format = SNDRV_PCM_FORMAT_S8; break; - case USB_AUDIO_FORMAT_IEEE_FLOAT: + case UAC_FORMAT_TYPE_I_IEEE_FLOAT: pcm_format = SNDRV_PCM_FORMAT_FLOAT_LE; break; - case USB_AUDIO_FORMAT_ALAW: + case UAC_FORMAT_TYPE_I_ALAW: pcm_format = SNDRV_PCM_FORMAT_A_LAW; break; - case USB_AUDIO_FORMAT_MU_LAW: + case UAC_FORMAT_TYPE_I_MULAW: pcm_format = SNDRV_PCM_FORMAT_MU_LAW; break; default: @@ -2551,7 +2552,7 @@ static int parse_audio_format_rates_v1(struct snd_usb_audio *chip, struct audiof int nr_rates = fmt[offset]; if (fmt[0] < offset + 1 + 3 * (nr_rates ? nr_rates : 2)) { - snd_printk(KERN_ERR "%d:%u:%d : invalid FORMAT_TYPE desc\n", + snd_printk(KERN_ERR "%d:%u:%d : invalid UAC_FORMAT_TYPE desc\n", chip->dev->devnum, fp->iface, fp->altsetting); return -1; } @@ -2614,7 +2615,7 @@ static int parse_audio_format_rates_v2(struct snd_usb_audio *chip, int i, nr_rates, data_size, ret = 0; /* get the number of sample rates first by only fetching 2 bytes */ - ret = snd_usb_ctl_msg(dev, usb_rcvctrlpipe(dev, 0), CS_RANGE, + ret = snd_usb_ctl_msg(dev, usb_rcvctrlpipe(dev, 0), UAC2_CS_RANGE, USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_IN, 0x0100, chip->clock_id << 8, tmp, sizeof(tmp), 1000); @@ -2632,7 +2633,7 @@ static int parse_audio_format_rates_v2(struct snd_usb_audio *chip, } /* now get the full information */ - ret = snd_usb_ctl_msg(dev, usb_rcvctrlpipe(dev, 0), CS_RANGE, + ret = snd_usb_ctl_msg(dev, usb_rcvctrlpipe(dev, 0), UAC2_CS_RANGE, USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_IN, 0x0100, chip->clock_id << 8, data, data_size, 1000); @@ -2682,7 +2683,7 @@ static int parse_audio_format_i(struct snd_usb_audio *chip, int protocol = altsd->bInterfaceProtocol; int pcm_format, ret; - if (fmt->bFormatType == USB_FORMAT_TYPE_III) { + if (fmt->bFormatType == UAC_FORMAT_TYPE_III) { /* FIXME: the format type is really IECxxx * but we give normal PCM format to get the existing * apps working... @@ -2745,12 +2746,12 @@ static int parse_audio_format_ii(struct snd_usb_audio *chip, int protocol = altsd->bInterfaceProtocol; switch (format) { - case USB_AUDIO_FORMAT_AC3: + case UAC_FORMAT_TYPE_II_AC3: /* FIXME: there is no AC3 format defined yet */ // fp->format = SNDRV_PCM_FORMAT_AC3; fp->format = SNDRV_PCM_FORMAT_U8; /* temporarily hack to receive byte streams */ break; - case USB_AUDIO_FORMAT_MPEG: + case UAC_FORMAT_TYPE_II_MPEG: fp->format = SNDRV_PCM_FORMAT_MPEG; break; default: @@ -2793,11 +2794,11 @@ static int parse_audio_format(struct snd_usb_audio *chip, struct audioformat *fp int err; switch (fmt[3]) { - case USB_FORMAT_TYPE_I: - case USB_FORMAT_TYPE_III: + case UAC_FORMAT_TYPE_I: + case UAC_FORMAT_TYPE_III: err = parse_audio_format_i(chip, fp, format, fmt, iface); break; - case USB_FORMAT_TYPE_II: + case UAC_FORMAT_TYPE_II: err = parse_audio_format_ii(chip, fp, format, fmt, iface); break; default: @@ -2816,7 +2817,7 @@ static int parse_audio_format(struct snd_usb_audio *chip, struct audioformat *fp if (chip->usb_id == USB_ID(0x041e, 0x3000) || chip->usb_id == USB_ID(0x041e, 0x3020) || chip->usb_id == USB_ID(0x041e, 0x3061)) { - if (fmt[3] == USB_FORMAT_TYPE_I && + if (fmt[3] == UAC_FORMAT_TYPE_I && fp->rates != SNDRV_PCM_RATE_48000 && fp->rates != SNDRV_PCM_RATE_96000) return -1; @@ -2871,7 +2872,7 @@ static int parse_audio_endpoints(struct snd_usb_audio *chip, int iface_no) /* skip invalid one */ if ((altsd->bInterfaceClass != USB_CLASS_AUDIO && altsd->bInterfaceClass != USB_CLASS_VENDOR_SPEC) || - (altsd->bInterfaceSubClass != USB_SUBCLASS_AUDIO_STREAMING && + (altsd->bInterfaceSubClass != USB_SUBCLASS_AUDIOSTREAMING && altsd->bInterfaceSubClass != USB_SUBCLASS_VENDOR_SPEC) || altsd->bNumEndpoints < 1 || le16_to_cpu(get_endpoint(alts, 0)->wMaxPacketSize) == 0) @@ -2895,16 +2896,16 @@ static int parse_audio_endpoints(struct snd_usb_audio *chip, int iface_no) switch (protocol) { case UAC_VERSION_1: { struct uac_as_header_descriptor_v1 *as = - snd_usb_find_csint_desc(alts->extra, alts->extralen, NULL, AS_GENERAL); + snd_usb_find_csint_desc(alts->extra, alts->extralen, NULL, UAC_AS_GENERAL); if (!as) { - snd_printk(KERN_ERR "%d:%u:%d : AS_GENERAL descriptor not found\n", + snd_printk(KERN_ERR "%d:%u:%d : UAC_AS_GENERAL descriptor not found\n", dev->devnum, iface_no, altno); continue; } if (as->bLength < sizeof(*as)) { - snd_printk(KERN_ERR "%d:%u:%d : invalid AS_GENERAL desc\n", + snd_printk(KERN_ERR "%d:%u:%d : invalid UAC_AS_GENERAL desc\n", dev->devnum, iface_no, altno); continue; } @@ -2915,16 +2916,16 @@ static int parse_audio_endpoints(struct snd_usb_audio *chip, int iface_no) case UAC_VERSION_2: { struct uac_as_header_descriptor_v2 *as = - snd_usb_find_csint_desc(alts->extra, alts->extralen, NULL, AS_GENERAL); + snd_usb_find_csint_desc(alts->extra, alts->extralen, NULL, UAC_AS_GENERAL); if (!as) { - snd_printk(KERN_ERR "%d:%u:%d : AS_GENERAL descriptor not found\n", + snd_printk(KERN_ERR "%d:%u:%d : UAC_AS_GENERAL descriptor not found\n", dev->devnum, iface_no, altno); continue; } if (as->bLength < sizeof(*as)) { - snd_printk(KERN_ERR "%d:%u:%d : invalid AS_GENERAL desc\n", + snd_printk(KERN_ERR "%d:%u:%d : invalid UAC_AS_GENERAL desc\n", dev->devnum, iface_no, altno); continue; } @@ -2942,15 +2943,15 @@ static int parse_audio_endpoints(struct snd_usb_audio *chip, int iface_no) } /* get format type */ - fmt = snd_usb_find_csint_desc(alts->extra, alts->extralen, NULL, FORMAT_TYPE); + fmt = snd_usb_find_csint_desc(alts->extra, alts->extralen, NULL, UAC_FORMAT_TYPE); if (!fmt) { - snd_printk(KERN_ERR "%d:%u:%d : no FORMAT_TYPE desc\n", + snd_printk(KERN_ERR "%d:%u:%d : no UAC_FORMAT_TYPE desc\n", dev->devnum, iface_no, altno); continue; } if (((protocol == UAC_VERSION_1) && (fmt[0] < 8)) || ((protocol == UAC_VERSION_2) && (fmt[0] != 6))) { - snd_printk(KERN_ERR "%d:%u:%d : invalid FORMAT_TYPE desc\n", + snd_printk(KERN_ERR "%d:%u:%d : invalid UAC_FORMAT_TYPE desc\n", dev->devnum, iface_no, altno); continue; } @@ -2972,7 +2973,7 @@ static int parse_audio_endpoints(struct snd_usb_audio *chip, int iface_no) /* Creamware Noah has this descriptor after the 2nd endpoint */ if (!csep && altsd->bNumEndpoints >= 2) csep = snd_usb_find_desc(alts->endpoint[1].extra, alts->endpoint[1].extralen, NULL, USB_DT_CS_ENDPOINT); - if (!csep || csep[0] < 7 || csep[2] != EP_GENERAL) { + if (!csep || csep[0] < 7 || csep[2] != UAC_EP_GENERAL) { snd_printk(KERN_WARNING "%d:%u:%d : no or invalid" " class specific endpoint descriptor\n", dev->devnum, iface_no, altno); @@ -3006,12 +3007,12 @@ static int parse_audio_endpoints(struct snd_usb_audio *chip, int iface_no) /* Optoplay sets the sample rate attribute although * it seems not supporting it in fact. */ - fp->attributes &= ~EP_CS_ATTR_SAMPLE_RATE; + fp->attributes &= ~UAC_EP_CS_ATTR_SAMPLE_RATE; break; case USB_ID(0x041e, 0x3020): /* Creative SB Audigy 2 NX */ case USB_ID(0x0763, 0x2003): /* M-Audio Audiophile USB */ /* doesn't set the sample rate attribute, but supports it */ - fp->attributes |= EP_CS_ATTR_SAMPLE_RATE; + fp->attributes |= UAC_EP_CS_ATTR_SAMPLE_RATE; break; case USB_ID(0x047f, 0x0ca1): /* plantronics headset */ case USB_ID(0x077d, 0x07af): /* Griffin iMic (note that there is @@ -3020,11 +3021,11 @@ static int parse_audio_endpoints(struct snd_usb_audio *chip, int iface_no) * plantronics headset and Griffin iMic have set adaptive-in * although it's really not... */ - fp->ep_attr &= ~EP_ATTR_MASK; + fp->ep_attr &= ~USB_ENDPOINT_SYNCTYPE; if (stream == SNDRV_PCM_STREAM_PLAYBACK) - fp->ep_attr |= EP_ATTR_ADAPTIVE; + fp->ep_attr |= USB_ENDPOINT_SYNC_ADAPTIVE; else - fp->ep_attr |= EP_ATTR_SYNC; + fp->ep_attr |= USB_ENDPOINT_SYNC_SYNC; break; } @@ -3094,7 +3095,7 @@ static int snd_usb_create_stream(struct snd_usb_audio *chip, int ctrlif, int int altsd = get_iface_desc(alts); if ((altsd->bInterfaceClass == USB_CLASS_AUDIO || altsd->bInterfaceClass == USB_CLASS_VENDOR_SPEC) && - altsd->bInterfaceSubClass == USB_SUBCLASS_MIDI_STREAMING) { + altsd->bInterfaceSubClass == USB_SUBCLASS_MIDISTREAMING) { int err = snd_usbmidi_create(chip->card, iface, &chip->midi_list, NULL); if (err < 0) { @@ -3109,7 +3110,7 @@ static int snd_usb_create_stream(struct snd_usb_audio *chip, int ctrlif, int int if ((altsd->bInterfaceClass != USB_CLASS_AUDIO && altsd->bInterfaceClass != USB_CLASS_VENDOR_SPEC) || - altsd->bInterfaceSubClass != USB_SUBCLASS_AUDIO_STREAMING) { + altsd->bInterfaceSubClass != USB_SUBCLASS_AUDIOSTREAMING) { snd_printdd(KERN_ERR "%d:%u:%d: skipping non-supported interface %d\n", dev->devnum, ctrlif, interface, altsd->bInterfaceClass); /* skip non-supported classes */ @@ -3145,12 +3146,12 @@ static int snd_usb_create_streams(struct snd_usb_audio *chip, int ctrlif) host_iface = &usb_ifnum_to_if(dev, ctrlif)->altsetting[0]; control_header = snd_usb_find_csint_desc(host_iface->extra, host_iface->extralen, - NULL, HEADER); + NULL, UAC_HEADER); altsd = get_iface_desc(host_iface); protocol = altsd->bInterfaceProtocol; if (!control_header) { - snd_printk(KERN_ERR "cannot find HEADER\n"); + snd_printk(KERN_ERR "cannot find UAC_HEADER\n"); return -EINVAL; } @@ -3164,7 +3165,7 @@ static int snd_usb_create_streams(struct snd_usb_audio *chip, int ctrlif) } if (h1->bLength < sizeof(*h1) + h1->bInCollection) { - snd_printk(KERN_ERR "invalid HEADER (v1)\n"); + snd_printk(KERN_ERR "invalid UAC_HEADER (v1)\n"); return -EINVAL; } @@ -3190,7 +3191,7 @@ static int snd_usb_create_streams(struct snd_usb_audio *chip, int ctrlif) * clock selectors and sample rate conversion units. */ cs = snd_usb_find_csint_desc(host_iface->extra, host_iface->extralen, - NULL, CLOCK_SOURCE); + NULL, UAC_CLOCK_SOURCE); if (!cs) { snd_printk(KERN_ERR "CLOCK_SOURCE descriptor not found\n"); @@ -3302,7 +3303,7 @@ static int create_uaxx_quirk(struct snd_usb_audio *chip, static const struct audioformat ua_format = { .format = SNDRV_PCM_FORMAT_S24_3LE, .channels = 2, - .fmt_type = USB_FORMAT_TYPE_I, + .fmt_type = UAC_FORMAT_TYPE_I, .altsetting = 1, .altset_idx = 1, .rates = SNDRV_PCM_RATE_CONTINUOUS, @@ -3394,7 +3395,7 @@ static int create_ua1000_quirk(struct snd_usb_audio *chip, { static const struct audioformat ua1000_format = { .format = SNDRV_PCM_FORMAT_S32_LE, - .fmt_type = USB_FORMAT_TYPE_I, + .fmt_type = UAC_FORMAT_TYPE_I, .altsetting = 1, .altset_idx = 1, .attributes = 0, diff --git a/sound/usb/usbaudio.h b/sound/usb/usbaudio.h index 26daf68..6b016d4 100644 --- a/sound/usb/usbaudio.h +++ b/sound/usb/usbaudio.h @@ -21,106 +21,6 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -/* - */ - -#define USB_SUBCLASS_AUDIO_CONTROL 0x01 -#define USB_SUBCLASS_AUDIO_STREAMING 0x02 -#define USB_SUBCLASS_MIDI_STREAMING 0x03 -#define USB_SUBCLASS_VENDOR_SPEC 0xff - -#define HEADER 0x01 -#define INPUT_TERMINAL 0x02 -#define OUTPUT_TERMINAL 0x03 -#define MIXER_UNIT 0x04 -#define SELECTOR_UNIT 0x05 -#define FEATURE_UNIT 0x06 -#define PROCESSING_UNIT_V1 0x07 -#define EXTENSION_UNIT_V1 0x08 - -/* audio class v2 */ -#define EFFECT_UNIT 0x07 -#define PROCESSING_UNIT_V2 0x08 -#define EXTENSION_UNIT_V2 0x09 -#define CLOCK_SOURCE 0x0a -#define CLOCK_SELECTOR 0x0b -#define CLOCK_MULTIPLIER 0x0c -#define SAMPLE_RATE_CONVERTER 0x0d - -#define AS_GENERAL 0x01 -#define FORMAT_TYPE 0x02 -#define FORMAT_SPECIFIC 0x03 - -#define EP_GENERAL 0x01 - -#define MS_GENERAL 0x01 -#define MIDI_IN_JACK 0x02 -#define MIDI_OUT_JACK 0x03 - -/* endpoint attributes */ -#define EP_ATTR_MASK 0x0c -#define EP_ATTR_ASYNC 0x04 -#define EP_ATTR_ADAPTIVE 0x08 -#define EP_ATTR_SYNC 0x0c - -/* cs endpoint attributes */ -#define EP_CS_ATTR_SAMPLE_RATE 0x01 -#define EP_CS_ATTR_PITCH_CONTROL 0x02 -#define EP_CS_ATTR_FILL_MAX 0x80 - -/* Audio Class specific Request Codes (v1) */ - -#define SET_CUR 0x01 -#define GET_CUR 0x81 -#define SET_MIN 0x02 -#define GET_MIN 0x82 -#define SET_MAX 0x03 -#define GET_MAX 0x83 -#define SET_RES 0x04 -#define GET_RES 0x84 -#define SET_MEM 0x05 -#define GET_MEM 0x85 -#define GET_STAT 0xff - -/* Audio Class specific Request Codes (v2) */ -#define CS_CUR 0x01 -#define CS_RANGE 0x02 - -/* Terminal Control Selectors */ - -#define COPY_PROTECT_CONTROL 0x01 - -/* Endpoint Control Selectors */ - -#define SAMPLING_FREQ_CONTROL 0x01 -#define PITCH_CONTROL 0x02 - -/* Format Types */ -#define USB_FORMAT_TYPE_I 0x01 -#define USB_FORMAT_TYPE_II 0x02 -#define USB_FORMAT_TYPE_III 0x03 - -/* type I */ -#define USB_AUDIO_FORMAT_PCM 0x01 -#define USB_AUDIO_FORMAT_PCM8 0x02 -#define USB_AUDIO_FORMAT_IEEE_FLOAT 0x03 -#define USB_AUDIO_FORMAT_ALAW 0x04 -#define USB_AUDIO_FORMAT_MU_LAW 0x05 - -/* type II */ -#define USB_AUDIO_FORMAT_MPEG 0x1001 -#define USB_AUDIO_FORMAT_AC3 0x1002 - -/* type III */ -#define USB_AUDIO_FORMAT_IEC1937_AC3 0x2001 -#define USB_AUDIO_FORMAT_IEC1937_MPEG1_LAYER1 0x2002 -#define USB_AUDIO_FORMAT_IEC1937_MPEG2_NOEXT 0x2003 -#define USB_AUDIO_FORMAT_IEC1937_MPEG2_EXT 0x2004 -#define USB_AUDIO_FORMAT_IEC1937_MPEG2_LAYER1_LS 0x2005 -#define USB_AUDIO_FORMAT_IEC1937_MPEG2_LAYER23_LS 0x2006 - - /* maximum number of endpoints per interface */ #define MIDI_MAX_ENDPOINTS 2 diff --git a/sound/usb/usbmidi.c b/sound/usb/usbmidi.c index 6e89b83..15e8e4b 100644 --- a/sound/usb/usbmidi.c +++ b/sound/usb/usbmidi.c @@ -46,6 +46,8 @@ #include <linux/timer.h> #include <linux/usb.h> #include <linux/wait.h> +#include <linux/usb/audio.h> + #include <sound/core.h> #include <sound/control.h> #include <sound/rawmidi.h> @@ -1522,7 +1524,7 @@ static int snd_usbmidi_get_ms_info(struct snd_usb_midi* umidi, if (hostif->extralen >= 7 && ms_header->bLength >= 7 && ms_header->bDescriptorType == USB_DT_CS_INTERFACE && - ms_header->bDescriptorSubtype == HEADER) + ms_header->bDescriptorSubtype == UAC_HEADER) snd_printdd(KERN_INFO "MIDIStreaming version %02x.%02x\n", ms_header->bcdMSC[1], ms_header->bcdMSC[0]); else @@ -1538,7 +1540,7 @@ static int snd_usbmidi_get_ms_info(struct snd_usb_midi* umidi, if (hostep->extralen < 4 || ms_ep->bLength < 4 || ms_ep->bDescriptorType != USB_DT_CS_ENDPOINT || - ms_ep->bDescriptorSubtype != MS_GENERAL) + ms_ep->bDescriptorSubtype != UAC_MS_GENERAL) continue; if (usb_endpoint_dir_out(ep)) { if (endpoints[epidx].out_ep) { @@ -1750,9 +1752,9 @@ static int snd_usbmidi_detect_yamaha(struct snd_usb_midi* umidi, cs_desc < hostif->extra + hostif->extralen && cs_desc[0] >= 2; cs_desc += cs_desc[0]) { if (cs_desc[1] == USB_DT_CS_INTERFACE) { - if (cs_desc[2] == MIDI_IN_JACK) + if (cs_desc[2] == UAC_MIDI_IN_JACK) endpoint->in_cables = (endpoint->in_cables << 1) | 1; - else if (cs_desc[2] == MIDI_OUT_JACK) + else if (cs_desc[2] == UAC_MIDI_OUT_JACK) endpoint->out_cables = (endpoint->out_cables << 1) | 1; } } diff --git a/sound/usb/usbmixer.c b/sound/usb/usbmixer.c index 525caec..1b167fb 100644 --- a/sound/usb/usbmixer.c +++ b/sound/usb/usbmixer.c @@ -282,7 +282,7 @@ static void *find_audio_control_unit(struct mixer_build *state, unsigned char un while ((p = snd_usb_find_desc(state->buffer, state->buflen, p, USB_DT_CS_INTERFACE)) != NULL) { - if (p[0] >= 4 && p[2] >= INPUT_TERMINAL && p[2] <= EXTENSION_UNIT_V1 && p[3] == unit) + if (p[0] >= 4 && p[2] >= UAC_INPUT_TERMINAL && p[2] <= UAC_EXTENSION_UNIT_V1 && p[3] == unit) return p; } return NULL; @@ -403,14 +403,14 @@ static int get_ctl_value(struct usb_mixer_elem_info *cval, int request, int vali static int get_cur_ctl_value(struct usb_mixer_elem_info *cval, int validx, int *value) { - return get_ctl_value(cval, GET_CUR, validx, value); + return get_ctl_value(cval, UAC_GET_CUR, validx, value); } /* channel = 0: master, 1 = first channel */ static inline int get_cur_mix_raw(struct usb_mixer_elem_info *cval, int channel, int *value) { - return get_ctl_value(cval, GET_CUR, (cval->control << 8) | channel, value); + return get_ctl_value(cval, UAC_GET_CUR, (cval->control << 8) | channel, value); } static int get_cur_mix_value(struct usb_mixer_elem_info *cval, @@ -464,14 +464,14 @@ static int set_ctl_value(struct usb_mixer_elem_info *cval, int request, int vali static int set_cur_ctl_value(struct usb_mixer_elem_info *cval, int validx, int value) { - return set_ctl_value(cval, SET_CUR, validx, value); + return set_ctl_value(cval, UAC_SET_CUR, validx, value); } static int set_cur_mix_value(struct usb_mixer_elem_info *cval, int channel, int index, int value) { int err; - err = set_ctl_value(cval, SET_CUR, (cval->control << 8) | channel, + err = set_ctl_value(cval, UAC_SET_CUR, (cval->control << 8) | channel, value); if (err < 0) return err; @@ -601,13 +601,13 @@ static int get_term_name(struct mixer_build *state, struct usb_audio_term *iterm if (term_only) return 0; switch (iterm->type >> 16) { - case SELECTOR_UNIT: + case UAC_SELECTOR_UNIT: strcpy(name, "Selector"); return 8; - case PROCESSING_UNIT_V1: + case UAC_PROCESSING_UNIT_V1: strcpy(name, "Process Unit"); return 12; - case EXTENSION_UNIT_V1: + case UAC_EXTENSION_UNIT_V1: strcpy(name, "Ext Unit"); return 8; - case MIXER_UNIT: + case UAC_MIXER_UNIT: strcpy(name, "Mixer"); return 5; default: return sprintf(name, "Unit %d", iterm->id); @@ -646,22 +646,22 @@ static int check_input_term(struct mixer_build *state, int id, struct usb_audio_ while ((p1 = find_audio_control_unit(state, id)) != NULL) { term->id = id; switch (p1[2]) { - case INPUT_TERMINAL: + case UAC_INPUT_TERMINAL: term->type = combine_word(p1 + 4); term->channels = p1[7]; term->chconfig = combine_word(p1 + 8); term->name = p1[11]; return 0; - case FEATURE_UNIT: + case UAC_FEATURE_UNIT: id = p1[4]; break; /* continue to parse */ - case MIXER_UNIT: + case UAC_MIXER_UNIT: term->type = p1[2] << 16; /* virtual type */ term->channels = p1[5 + p1[4]]; term->chconfig = combine_word(p1 + 6 + p1[4]); term->name = p1[p1[0] - 1]; return 0; - case SELECTOR_UNIT: + case UAC_SELECTOR_UNIT: /* call recursively to retrieve the channel info */ if (check_input_term(state, p1[5], term) < 0) return -ENODEV; @@ -669,8 +669,8 @@ static int check_input_term(struct mixer_build *state, int id, struct usb_audio_ term->id = id; term->name = p1[9 + p1[0] - 1]; return 0; - case PROCESSING_UNIT_V1: - case EXTENSION_UNIT_V1: + case UAC_PROCESSING_UNIT_V1: + case UAC_EXTENSION_UNIT_V1: if (p1[6] == 1) { id = p1[7]; break; /* continue to parse */ @@ -748,23 +748,23 @@ static int get_min_max(struct usb_mixer_elem_info *cval, int default_min) break; } } - if (get_ctl_value(cval, GET_MAX, (cval->control << 8) | minchn, &cval->max) < 0 || - get_ctl_value(cval, GET_MIN, (cval->control << 8) | minchn, &cval->min) < 0) { + if (get_ctl_value(cval, UAC_GET_MAX, (cval->control << 8) | minchn, &cval->max) < 0 || + get_ctl_value(cval, UAC_GET_MIN, (cval->control << 8) | minchn, &cval->min) < 0) { snd_printd(KERN_ERR "%d:%d: cannot get min/max values for control %d (id %d)\n", cval->id, cval->mixer->ctrlif, cval->control, cval->id); return -EINVAL; } - if (get_ctl_value(cval, GET_RES, (cval->control << 8) | minchn, &cval->res) < 0) { + if (get_ctl_value(cval, UAC_GET_RES, (cval->control << 8) | minchn, &cval->res) < 0) { cval->res = 1; } else { int last_valid_res = cval->res; while (cval->res > 1) { - if (set_ctl_value(cval, SET_RES, (cval->control << 8) | minchn, cval->res / 2) < 0) + if (set_ctl_value(cval, UAC_SET_RES, (cval->control << 8) | minchn, cval->res / 2) < 0) break; cval->res /= 2; } - if (get_ctl_value(cval, GET_RES, (cval->control << 8) | minchn, &cval->res) < 0) + if (get_ctl_value(cval, UAC_GET_RES, (cval->control << 8) | minchn, &cval->res) < 0) cval->res = last_valid_res; } if (cval->res == 0) @@ -1093,7 +1093,7 @@ static int parse_audio_feature_unit(struct mixer_build *state, int unitid, void struct uac_feature_unit_descriptor *ftr = _ftr; if (ftr->bLength < 7 || ! (csize = ftr->bControlSize) || ftr->bLength < 7 + csize) { - snd_printk(KERN_ERR "usbaudio: unit %u: invalid FEATURE_UNIT descriptor\n", unitid); + snd_printk(KERN_ERR "usbaudio: unit %u: invalid UAC_FEATURE_UNIT descriptor\n", unitid); return -EINVAL; } @@ -1735,17 +1735,17 @@ static int parse_audio_unit(struct mixer_build *state, int unitid) } switch (p1[2]) { - case INPUT_TERMINAL: + case UAC_INPUT_TERMINAL: return 0; /* NOP */ - case MIXER_UNIT: + case UAC_MIXER_UNIT: return parse_audio_mixer_unit(state, unitid, p1); - case SELECTOR_UNIT: + case UAC_SELECTOR_UNIT: return parse_audio_selector_unit(state, unitid, p1); - case FEATURE_UNIT: + case UAC_FEATURE_UNIT: return parse_audio_feature_unit(state, unitid, p1); - case PROCESSING_UNIT_V1: + case UAC_PROCESSING_UNIT_V1: return parse_audio_processing_unit(state, unitid, p1); - case EXTENSION_UNIT_V1: + case UAC_EXTENSION_UNIT_V1: return parse_audio_extension_unit(state, unitid, p1); default: snd_printk(KERN_ERR "usbaudio: unit %u: unexpected type 0x%02x\n", unitid, p1[2]); @@ -1775,7 +1775,7 @@ static int snd_usb_mixer_dev_free(struct snd_device *device) /* * create mixer controls * - * walk through all OUTPUT_TERMINAL descriptors to search for mixers + * walk through all UAC_OUTPUT_TERMINAL descriptors to search for mixers */ static int snd_usb_mixer_controls(struct usb_mixer_interface *mixer) { @@ -1802,7 +1802,7 @@ static int snd_usb_mixer_controls(struct usb_mixer_interface *mixer) } } - while ((desc = snd_usb_find_csint_desc(hostif->extra, hostif->extralen, desc, OUTPUT_TERMINAL)) != NULL) { + while ((desc = snd_usb_find_csint_desc(hostif->extra, hostif->extralen, desc, UAC_OUTPUT_TERMINAL)) != NULL) { if (desc->bLength < 9) continue; /* invalid descriptor? */ set_bit(desc->bTerminalID, state.unitbitmap); /* mark terminal ID as visited */ @@ -2002,7 +2002,7 @@ static int snd_usb_soundblaster_remote_init(struct usb_mixer_interface *mixer) } mixer->rc_setup_packet->bRequestType = USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE; - mixer->rc_setup_packet->bRequest = GET_MEM; + mixer->rc_setup_packet->bRequest = UAC_GET_MEM; mixer->rc_setup_packet->wValue = cpu_to_le16(0); mixer->rc_setup_packet->wIndex = cpu_to_le16(0); mixer->rc_setup_packet->wLength = cpu_to_le16(len); @@ -2125,7 +2125,7 @@ static void snd_audigy2nx_proc_read(struct snd_info_entry *entry, snd_iprintf(buffer, "%s: ", jacks[i].name); err = snd_usb_ctl_msg(mixer->chip->dev, usb_rcvctrlpipe(mixer->chip->dev, 0), - GET_MEM, USB_DIR_IN | USB_TYPE_CLASS | + UAC_GET_MEM, USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE, 0, jacks[i].unitid << 8, buf, 3, 100); if (err == 3 && (buf[0] == 3 || buf[0] == 6)) diff --git a/sound/usb/usbquirks.h b/sound/usb/usbquirks.h index 65bbd22..c51b1c8 100644 --- a/sound/usb/usbquirks.h +++ b/sound/usb/usbquirks.h @@ -91,7 +91,7 @@ .idVendor = 0x046d, .idProduct = 0x0850, .bInterfaceClass = USB_CLASS_AUDIO, - .bInterfaceSubClass = USB_SUBCLASS_AUDIO_CONTROL + .bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL }, { .match_flags = USB_DEVICE_ID_MATCH_DEVICE | @@ -100,7 +100,7 @@ .idVendor = 0x046d, .idProduct = 0x08ae, .bInterfaceClass = USB_CLASS_AUDIO, - .bInterfaceSubClass = USB_SUBCLASS_AUDIO_CONTROL + .bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL }, { .match_flags = USB_DEVICE_ID_MATCH_DEVICE | @@ -109,7 +109,7 @@ .idVendor = 0x046d, .idProduct = 0x08c6, .bInterfaceClass = USB_CLASS_AUDIO, - .bInterfaceSubClass = USB_SUBCLASS_AUDIO_CONTROL + .bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL }, { .match_flags = USB_DEVICE_ID_MATCH_DEVICE | @@ -118,7 +118,7 @@ .idVendor = 0x046d, .idProduct = 0x08f0, .bInterfaceClass = USB_CLASS_AUDIO, - .bInterfaceSubClass = USB_SUBCLASS_AUDIO_CONTROL + .bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL }, { .match_flags = USB_DEVICE_ID_MATCH_DEVICE | @@ -127,7 +127,7 @@ .idVendor = 0x046d, .idProduct = 0x08f5, .bInterfaceClass = USB_CLASS_AUDIO, - .bInterfaceSubClass = USB_SUBCLASS_AUDIO_CONTROL + .bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL }, { .match_flags = USB_DEVICE_ID_MATCH_DEVICE | @@ -136,7 +136,7 @@ .idVendor = 0x046d, .idProduct = 0x08f6, .bInterfaceClass = USB_CLASS_AUDIO, - .bInterfaceSubClass = USB_SUBCLASS_AUDIO_CONTROL + .bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL }, { USB_DEVICE(0x046d, 0x0990), @@ -301,7 +301,7 @@ YAMAHA_DEVICE(0x7010, "UB99"), .iface = 1, .altsetting = 1, .altset_idx = 1, - .attributes = EP_CS_ATTR_FILL_MAX, + .attributes = UAC_EP_CS_ATTR_FILL_MAX, .endpoint = 0x81, .ep_attr = 0x05, .rates = SNDRV_PCM_RATE_CONTINUOUS, @@ -2081,7 +2081,7 @@ YAMAHA_DEVICE(0x7010, "UB99"), USB_DEVICE_ID_MATCH_INT_CLASS | USB_DEVICE_ID_MATCH_INT_SUBCLASS, .bInterfaceClass = USB_CLASS_AUDIO, - .bInterfaceSubClass = USB_SUBCLASS_AUDIO_CONTROL, + .bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL, .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) { .vendor_name = "Hauppauge", .product_name = "HVR-950Q", @@ -2095,7 +2095,7 @@ YAMAHA_DEVICE(0x7010, "UB99"), USB_DEVICE_ID_MATCH_INT_CLASS | USB_DEVICE_ID_MATCH_INT_SUBCLASS, .bInterfaceClass = USB_CLASS_AUDIO, - .bInterfaceSubClass = USB_SUBCLASS_AUDIO_CONTROL, + .bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL, .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) { .vendor_name = "Hauppauge", .product_name = "HVR-950Q", @@ -2109,7 +2109,7 @@ YAMAHA_DEVICE(0x7010, "UB99"), USB_DEVICE_ID_MATCH_INT_CLASS | USB_DEVICE_ID_MATCH_INT_SUBCLASS, .bInterfaceClass = USB_CLASS_AUDIO, - .bInterfaceSubClass = USB_SUBCLASS_AUDIO_CONTROL, + .bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL, .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) { .vendor_name = "Hauppauge", .product_name = "HVR-950Q", @@ -2123,7 +2123,7 @@ YAMAHA_DEVICE(0x7010, "UB99"), USB_DEVICE_ID_MATCH_INT_CLASS | USB_DEVICE_ID_MATCH_INT_SUBCLASS, .bInterfaceClass = USB_CLASS_AUDIO, - .bInterfaceSubClass = USB_SUBCLASS_AUDIO_CONTROL, + .bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL, .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) { .vendor_name = "Hauppauge", .product_name = "HVR-950Q", @@ -2137,7 +2137,7 @@ YAMAHA_DEVICE(0x7010, "UB99"), USB_DEVICE_ID_MATCH_INT_CLASS | USB_DEVICE_ID_MATCH_INT_SUBCLASS, .bInterfaceClass = USB_CLASS_AUDIO, - .bInterfaceSubClass = USB_SUBCLASS_AUDIO_CONTROL, + .bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL, .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) { .vendor_name = "Hauppauge", .product_name = "HVR-950Q", @@ -2151,7 +2151,7 @@ YAMAHA_DEVICE(0x7010, "UB99"), USB_DEVICE_ID_MATCH_INT_CLASS | USB_DEVICE_ID_MATCH_INT_SUBCLASS, .bInterfaceClass = USB_CLASS_AUDIO, - .bInterfaceSubClass = USB_SUBCLASS_AUDIO_CONTROL, + .bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL, .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) { .vendor_name = "Hauppauge", .product_name = "HVR-950Q", @@ -2165,7 +2165,7 @@ YAMAHA_DEVICE(0x7010, "UB99"), USB_DEVICE_ID_MATCH_INT_CLASS | USB_DEVICE_ID_MATCH_INT_SUBCLASS, .bInterfaceClass = USB_CLASS_AUDIO, - .bInterfaceSubClass = USB_SUBCLASS_AUDIO_CONTROL, + .bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL, .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) { .vendor_name = "Hauppauge", .product_name = "HVR-950Q", @@ -2179,7 +2179,7 @@ YAMAHA_DEVICE(0x7010, "UB99"), USB_DEVICE_ID_MATCH_INT_CLASS | USB_DEVICE_ID_MATCH_INT_SUBCLASS, .bInterfaceClass = USB_CLASS_AUDIO, - .bInterfaceSubClass = USB_SUBCLASS_AUDIO_CONTROL, + .bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL, .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) { .vendor_name = "Hauppauge", .product_name = "HVR-850", @@ -2196,7 +2196,7 @@ YAMAHA_DEVICE(0x7010, "UB99"), .match_flags = USB_DEVICE_ID_MATCH_INT_CLASS | USB_DEVICE_ID_MATCH_INT_SUBCLASS, .bInterfaceClass = USB_CLASS_AUDIO, - .bInterfaceSubClass = USB_SUBCLASS_MIDI_STREAMING, + .bInterfaceSubClass = USB_SUBCLASS_MIDISTREAMING, .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { .ifnum = QUIRK_ANY_INTERFACE, .type = QUIRK_MIDI_STANDARD_INTERFACE -- 1.6.6.2 ^ permalink raw reply related [flat|nested] 48+ messages in thread
* Re: [PATCH 5/5] ALSA: usbaudio: consolidate header files 2010-02-22 22:49 ` [PATCH 5/5] ALSA: usbaudio: consolidate header files Daniel Mack @ 2010-02-23 7:58 ` Takashi Iwai 0 siblings, 0 replies; 48+ messages in thread From: Takashi Iwai @ 2010-02-23 7:58 UTC (permalink / raw) To: Daniel Mack; +Cc: alsa-devel, clemens At Mon, 22 Feb 2010 23:49:13 +0100, Daniel Mack wrote: > > Use the definitions from linux/usb/audio.h all over the ALSA USB audio > driver and add some missing definitions there as well. > > Use the endpoint attribute macros from linux/usb/ch9 and remove the own > things from sound/usb/usbaudio.h. > > Now things are also nicely prefixed which makes understanding the code > easier. > > Signed-off-by: Daniel Mack <daniel@caiaq.de> You forgot about non-standard usb-audio driver... I fixed up the compile errors and warnings and put all patches now to topic/usb-v2.0 branch on sound git tree as a reference. git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6.git topic/usb-v2.0 thanks, Takashi ^ permalink raw reply [flat|nested] 48+ messages in thread
* usbaudio: Support for USB audio v2.0 devices @ 2010-02-22 16:28 Daniel Mack 2010-02-22 17:40 ` Clemens Ladisch 2010-03-02 9:13 ` adelias 0 siblings, 2 replies; 48+ messages in thread From: Daniel Mack @ 2010-02-22 16:28 UTC (permalink / raw) To: alsa-devel; +Cc: tiwai, clemens Hi, I've been working on support for USB devices compliant to audio class v2.0 and would like to share what I got. First problem is that they literally changed every single descriptor type by adding or removing fields or changing their width, respectively. Even worse, some enum values were dropped and reassigned so their numerical value has a different meaning now. My first step was to clean up most of the existing descriptor parsers by moving away from anonymous byte array access to real structs so we can see which fields we're actually dereferencing. In a second step, I added definitions for the replacement descriptors and use them at appropriate places. The bInterfaceProtocol field must always be set correctly of course, otherwise we'll parse garbage. Other things that have changed from v1.0 to v2.0 are: * The number of streaming interfaces is now reported by a standard interface association descriptor. The old approach using a proprietary descriptor extension is deprecated. * The number of channels per interface is now stored in the AS_GENERAL descriptor (used to be part of the FORMAT_TYPE descriptor). * The list of supported sample rates is no longer stored in a variable length appendix of the FORMAT_TYPE descriptor but is retrieved from the device using a class specific GET_RANGE command. * Supported sample formats are now reported as 32bit bitmap rather than as a fixed value. For now, this is worked around by choosing just one of them. Eventually, the code should propagate the full ability of the device. * A devices needs to have at least one CLOCK_SOURCE descriptor which denotes a clockID that is needed as argument to the class request command. If can have more than one though and the host driver is in charge to choose the right one. There are also new types for clock selectors and sample rate converters that a device might report. This is all unsupported at the moment. We only parse the first CLOCK_SOURCE and take this one. * Many descriptors (format_type, ...) have changed their layout. Handle this by casting the descriptors to the appropriate structs. With the following patches applied, a v2.0 device is recognized and reported as ALSA device. I can even hear at least some kind of music, but the sample rate setting does not yet seem to be correct. Also, the existing mixer code does not work at all for v2.0 devices. This will be quite some work to support that and I fear the whole thing must be reimplemented for v2.0 specifically. For now, I worked around that by not parsing them at all but bailing out very early. However, I would like to make sure the changes I made so far won't cause any regression for v1.0 devices, and so it would be good to see them applied as a preliminary support. I'll continue working on this and send more updates along. Let me know what you think. Thanks, Daniel ^ permalink raw reply [flat|nested] 48+ messages in thread
* Re: usbaudio: Support for USB audio v2.0 devices 2010-02-22 16:28 usbaudio: Support for USB audio v2.0 devices Daniel Mack @ 2010-02-22 17:40 ` Clemens Ladisch 2010-02-22 17:50 ` Daniel Mack 2010-03-02 9:13 ` adelias 1 sibling, 1 reply; 48+ messages in thread From: Clemens Ladisch @ 2010-02-22 17:40 UTC (permalink / raw) To: Daniel Mack; +Cc: 岩井 隆, alsa-devel Daniel Mack wrote: > I've been working on support for USB devices compliant to audio class > v2.0 and would like to share what I got. Great! Just out of curiousity: what device are you testing this with? > My first step was to clean up most of the existing descriptor parsers > by moving away from anonymous byte array access to real structs so we > can see which fields we're actually dereferencing. Please use the structures in <linux/usb/audio.h>. > * Supported sample formats are now reported as 32bit bitmap rather than > as a fixed value. For now, this is worked around by choosing just one > of them. I'll write a patch to change struct audioformat to use a bitmask. > Let me know what you think. Haven't tested yet, but the patches look fine. Regards, Clemens ^ permalink raw reply [flat|nested] 48+ messages in thread
* Re: usbaudio: Support for USB audio v2.0 devices 2010-02-22 17:40 ` Clemens Ladisch @ 2010-02-22 17:50 ` Daniel Mack 0 siblings, 0 replies; 48+ messages in thread From: Daniel Mack @ 2010-02-22 17:50 UTC (permalink / raw) To: Clemens Ladisch; +Cc: 岩井 隆, alsa-devel On Mon, Feb 22, 2010 at 06:40:39PM +0100, Clemens Ladisch wrote: > Daniel Mack wrote: > > I've been working on support for USB devices compliant to audio class > > v2.0 and would like to share what I got. > > Great! > > Just out of curiousity: what device are you testing this with? An XMOS eval kit. I have OSX/CoreAudio as reference which seems to have a more or less complete support. > > My first step was to clean up most of the existing descriptor parsers > > by moving away from anonymous byte array access to real structs so we > > can see which fields we're actually dereferencing. > > Please use the structures in <linux/usb/audio.h>. Gna. Haven't seen that before. Why are they there if no code actually uses them? I'll rework my patches then. Thanks, Daniel ^ permalink raw reply [flat|nested] 48+ messages in thread
* Re: usbaudio: Support for USB audio v2.0 devices 2010-02-22 16:28 usbaudio: Support for USB audio v2.0 devices Daniel Mack 2010-02-22 17:40 ` Clemens Ladisch @ 2010-03-02 9:13 ` adelias 2010-03-02 18:35 ` Daniel Mack 1 sibling, 1 reply; 48+ messages in thread From: adelias @ 2010-03-02 9:13 UTC (permalink / raw) To: alsa-devel On 22/2/2010 6:28 μμ, Daniel Mack wrote: > Hi, > > I've been working on support for USB devices compliant to audio class > v2.0 and would like to share what I got. > > First problem is that they literally changed every single descriptor > type by adding or removing fields or changing their width, > respectively. Even worse, some enum values were dropped and reassigned > so their numerical value has a different meaning now. > > My first step was to clean up most of the existing descriptor parsers > by moving away from anonymous byte array access to real structs so we > can see which fields we're actually dereferencing. > > In a second step, I added definitions for the replacement descriptors > and use them at appropriate places. The bInterfaceProtocol field must > always be set correctly of course, otherwise we'll parse garbage. > > Other things that have changed from v1.0 to v2.0 are: > > * The number of streaming interfaces is now reported by a standard > interface association descriptor. The old approach using a proprietary > descriptor extension is deprecated. > > * The number of channels per interface is now stored in the AS_GENERAL > descriptor (used to be part of the FORMAT_TYPE descriptor). > > * The list of supported sample rates is no longer stored in a variable > length appendix of the FORMAT_TYPE descriptor but is retrieved from > the device using a class specific GET_RANGE command. > > * Supported sample formats are now reported as 32bit bitmap rather than > as a fixed value. For now, this is worked around by choosing just one > of them. Eventually, the code should propagate the full ability of the > device. > > * A devices needs to have at least one CLOCK_SOURCE descriptor which > denotes a clockID that is needed as argument to the class request > command. If can have more than one though and the host driver is in > charge to choose the right one. There are also new types for clock > selectors and sample rate converters that a device might report. This > is all unsupported at the moment. We only parse the first CLOCK_SOURCE > and take this one. > > * Many descriptors (format_type, ...) have changed their layout. Handle > this by casting the descriptors to the appropriate structs. > > With the following patches applied, a v2.0 device is recognized and > reported as ALSA device. I can even hear at least some kind of music, > but the sample rate setting does not yet seem to be correct. > > Also, the existing mixer code does not work at all for v2.0 devices. > This will be quite some work to support that and I fear the whole thing > must be reimplemented for v2.0 specifically. For now, I worked around > that by not parsing them at all but bailing out very early. > > However, I would like to make sure the changes I made so far won't > cause any regression for v1.0 devices, and so it would be good to see > them applied as a preliminary support. I'll continue working on this > and send more updates along. > > Let me know what you think. > > Thanks, > Daniel Thanks to all involved for working on usb audio v2. Last night I installed the 20100226 snapshot. I did a little testing with my XMOS board using toslink out into may DAC. I tried various files ranging 16bit/44110kHz-24bit/192000kHz. The 44110 files had quite a bit of static, the higher bitrate files were better. As you stated the sampling rate is not correct and be verified by looking at the flashing LEDs on the XMOS board. They should flash faster as sampling rate increase. In this case no change was observed. Thanks, Nikos _______________________________________________ Alsa-devel mailing list Alsa-devel@alsa-project.org http://mailman.alsa-project.org/mailman/listinfo/alsa-devel ^ permalink raw reply [flat|nested] 48+ messages in thread
* Re: usbaudio: Support for USB audio v2.0 devices 2010-03-02 9:13 ` adelias @ 2010-03-02 18:35 ` Daniel Mack 2010-04-27 13:23 ` adelias 0 siblings, 1 reply; 48+ messages in thread From: Daniel Mack @ 2010-03-02 18:35 UTC (permalink / raw) To: adelias; +Cc: alsa-devel On Tue, Mar 02, 2010 at 11:13:04AM +0200, adelias wrote: > Thanks to all involved for working on usb audio v2. > > Last night I installed the 20100226 snapshot. I did a little testing > with my XMOS board using toslink out into may DAC. I tried various files > ranging 16bit/44110kHz-24bit/192000kHz. The 44110 files had quite a bit > of static, the higher bitrate files were better. As you stated the > sampling rate is not correct and be verified by looking at the flashing > LEDs on the XMOS board. They should flash faster as sampling rate > increase. In this case no change was observed. Yes - this is all do be done. The sample rate setting is done with a different type of class request, which also addresses the interface now, unlike v1 devices which send that to the endpoint. But that's just one out of many differences that need to be addressed, and it's still a long way to go. I'm on it :) Daniel ^ permalink raw reply [flat|nested] 48+ messages in thread
* Re: usbaudio: Support for USB audio v2.0 devices 2010-03-02 18:35 ` Daniel Mack @ 2010-04-27 13:23 ` adelias 2010-04-27 13:31 ` The Source 2010-04-27 14:06 ` Daniel Mack 0 siblings, 2 replies; 48+ messages in thread From: adelias @ 2010-04-27 13:23 UTC (permalink / raw) Cc: alsa-devel On 2/3/2010 8:35 μμ, Daniel Mack wrote: > On Tue, Mar 02, 2010 at 11:13:04AM +0200, adelias wrote: >> Thanks to all involved for working on usb audio v2. >> >> Last night I installed the 20100226 snapshot. I did a little testing >> with my XMOS board using toslink out into may DAC. I tried various files >> ranging 16bit/44110kHz-24bit/192000kHz. The 44110 files had quite a bit >> of static, the higher bitrate files were better. As you stated the >> sampling rate is not correct and be verified by looking at the flashing >> LEDs on the XMOS board. They should flash faster as sampling rate >> increase. In this case no change was observed. > > Yes - this is all do be done. The sample rate setting is done with a > different type of class request, which also addresses the interface now, > unlike v1 devices which send that to the endpoint. But that's just one > out of many differences that need to be addressed, and it's still a long > way to go. I'm on it :) > > Daniel I upgraded alsa to 1.0.23. The XMOS device is working great with the exception of some mild clicks here and there. Is this a known issue or might it be a problem with my specific configuration? _______________________________________________ Alsa-devel mailing list Alsa-devel@alsa-project.org http://mailman.alsa-project.org/mailman/listinfo/alsa-devel ^ permalink raw reply [flat|nested] 48+ messages in thread
* Re: usbaudio: Support for USB audio v2.0 devices 2010-04-27 13:23 ` adelias @ 2010-04-27 13:31 ` The Source 2010-04-27 14:07 ` Daniel Mack 2010-04-27 14:06 ` Daniel Mack 1 sibling, 1 reply; 48+ messages in thread From: The Source @ 2010-04-27 13:31 UTC (permalink / raw) To: alsa-devel 27.04.2010 17:23, adelias пишет: > On 2/3/2010 8:35 μμ, Daniel Mack wrote: > >> On Tue, Mar 02, 2010 at 11:13:04AM +0200, adelias wrote: >> >>> Thanks to all involved for working on usb audio v2. >>> >>> Last night I installed the 20100226 snapshot. I did a little testing >>> with my XMOS board using toslink out into may DAC. I tried various files >>> ranging 16bit/44110kHz-24bit/192000kHz. The 44110 files had quite a bit >>> of static, the higher bitrate files were better. As you stated the >>> sampling rate is not correct and be verified by looking at the flashing >>> LEDs on the XMOS board. They should flash faster as sampling rate >>> increase. In this case no change was observed. >>> >> Yes - this is all do be done. The sample rate setting is done with a >> different type of class request, which also addresses the interface now, >> unlike v1 devices which send that to the endpoint. But that's just one >> out of many differences that need to be addressed, and it's still a long >> way to go. I'm on it :) >> >> Daniel >> > I upgraded alsa to 1.0.23. The XMOS device is working great with the > exception of some mild clicks here and there. Is this a known issue or > might it be a problem with my specific configuration? > > _______________________________________________ > Alsa-devel mailing list > Alsa-devel@alsa-project.org > http://mailman.alsa-project.org/mailman/listinfo/alsa-devel > Perhaps I should've posted my problem in this thread earlier. Here's the summary: Creative X-Fi Notebook stopped working after upgrading from 1.0.22.1 to 1.0.23 (worked just fine before). dmesg gives the following: usb 8-2: new full speed USB device using uhci_hcd and address 2 usb 8-2: New USB device found, idVendor=041e, idProduct=30d2 usb 8-2: New USB device strings: Mfr=1, Product=2, SerialNumber=0 usb 8-2: Product: SB X-Fi Notebook usb 8-2: Manufacturer: Creative Technology Ltd usb 8-2: configuration #1 chosen from 1 choice input: Creative Technology Ltd SB X-Fi Notebook as /devices/pci0000:00/0000:00:1d.2/usb8/8-2/8-2:1.3/input/input11 generic-usb 0003:041E:30D2.0002: input,hidraw1: USB HID v1.11 Device [Creative Technology Ltd SB X-Fi Notebook] on usb-0000:00:1d.2-2/input3 input: Creative Technology Ltd SB X-Fi Notebook as /devices/pci0000:00/0000:00:1d.2/usb8/8-2/8-2:1.4/input/input12 generic-usb 0003:041E:30D2.0003: input,hidraw2: USB HID v1.11 Keyboard [Creative Technology Ltd SB X-Fi Notebook] on usb-0000:00:1d.2-2/input4 ALSA pcm.c:174: 2:1:1: endpoint lacks sample rate attribute bit, cannot set. ALSA pcm.c:174: 2:2:1: endpoint lacks sample rate attribute bit, cannot set. Additionally, modprobe never exits after connecting the device using 100% CPU and disrupting system's work. _______________________________________________ Alsa-devel mailing list Alsa-devel@alsa-project.org http://mailman.alsa-project.org/mailman/listinfo/alsa-devel ^ permalink raw reply [flat|nested] 48+ messages in thread
* Re: usbaudio: Support for USB audio v2.0 devices 2010-04-27 13:31 ` The Source @ 2010-04-27 14:07 ` Daniel Mack 2010-04-27 15:29 ` The Source 0 siblings, 1 reply; 48+ messages in thread From: Daniel Mack @ 2010-04-27 14:07 UTC (permalink / raw) To: The Source; +Cc: alsa-devel On Tue, Apr 27, 2010 at 05:31:35PM +0400, The Source wrote: > Perhaps I should've posted my problem in this thread earlier. Here's the > summary: > Creative X-Fi Notebook stopped working after upgrading from 1.0.22.1 to > 1.0.23 (worked just fine before). > dmesg gives the following: > > usb 8-2: new full speed USB device using uhci_hcd and address 2 > usb 8-2: New USB device found, idVendor=041e, idProduct=30d2 > usb 8-2: New USB device strings: Mfr=1, Product=2, SerialNumber=0 > usb 8-2: Product: SB X-Fi Notebook > usb 8-2: Manufacturer: Creative Technology Ltd > usb 8-2: configuration #1 chosen from 1 choice > input: Creative Technology Ltd SB X-Fi Notebook as > /devices/pci0000:00/0000:00:1d.2/usb8/8-2/8-2:1.3/input/input11 > generic-usb 0003:041E:30D2.0002: input,hidraw1: USB HID v1.11 Device > [Creative Technology Ltd SB X-Fi Notebook] on usb-0000:00:1d.2-2/input3 > input: Creative Technology Ltd SB X-Fi Notebook as > /devices/pci0000:00/0000:00:1d.2/usb8/8-2/8-2:1.4/input/input12 > generic-usb 0003:041E:30D2.0003: input,hidraw2: USB HID v1.11 Keyboard > [Creative Technology Ltd SB X-Fi Notebook] on usb-0000:00:1d.2-2/input4 > ALSA pcm.c:174: 2:1:1: endpoint lacks sample rate attribute bit, cannot > set. > ALSA pcm.c:174: 2:2:1: endpoint lacks sample rate attribute bit, cannot > set. And you say this is a regression from earlier versions? Would you be able to bisect this problem? Daniel ^ permalink raw reply [flat|nested] 48+ messages in thread
* Re: usbaudio: Support for USB audio v2.0 devices 2010-04-27 14:07 ` Daniel Mack @ 2010-04-27 15:29 ` The Source 2010-04-27 15:43 ` Daniel Mack 0 siblings, 1 reply; 48+ messages in thread From: The Source @ 2010-04-27 15:29 UTC (permalink / raw) To: Daniel Mack; +Cc: alsa-devel 27.04.2010 18:07, Daniel Mack пишет: > On Tue, Apr 27, 2010 at 05:31:35PM +0400, The Source wrote: > >> Perhaps I should've posted my problem in this thread earlier. Here's the >> summary: >> Creative X-Fi Notebook stopped working after upgrading from 1.0.22.1 to >> 1.0.23 (worked just fine before). >> dmesg gives the following: >> >> usb 8-2: new full speed USB device using uhci_hcd and address 2 >> usb 8-2: New USB device found, idVendor=041e, idProduct=30d2 >> usb 8-2: New USB device strings: Mfr=1, Product=2, SerialNumber=0 >> usb 8-2: Product: SB X-Fi Notebook >> usb 8-2: Manufacturer: Creative Technology Ltd >> usb 8-2: configuration #1 chosen from 1 choice >> input: Creative Technology Ltd SB X-Fi Notebook as >> /devices/pci0000:00/0000:00:1d.2/usb8/8-2/8-2:1.3/input/input11 >> generic-usb 0003:041E:30D2.0002: input,hidraw1: USB HID v1.11 Device >> [Creative Technology Ltd SB X-Fi Notebook] on usb-0000:00:1d.2-2/input3 >> input: Creative Technology Ltd SB X-Fi Notebook as >> /devices/pci0000:00/0000:00:1d.2/usb8/8-2/8-2:1.4/input/input12 >> generic-usb 0003:041E:30D2.0003: input,hidraw2: USB HID v1.11 Keyboard >> [Creative Technology Ltd SB X-Fi Notebook] on usb-0000:00:1d.2-2/input4 >> ALSA pcm.c:174: 2:1:1: endpoint lacks sample rate attribute bit, cannot >> set. >> ALSA pcm.c:174: 2:2:1: endpoint lacks sample rate attribute bit, cannot >> set. >> > And you say this is a regression from earlier versions? Would you be > able to bisect this problem? > > Daniel > > Gladly, if you just tell me how :) _______________________________________________ Alsa-devel mailing list Alsa-devel@alsa-project.org http://mailman.alsa-project.org/mailman/listinfo/alsa-devel ^ permalink raw reply [flat|nested] 48+ messages in thread
* Re: usbaudio: Support for USB audio v2.0 devices 2010-04-27 15:29 ` The Source @ 2010-04-27 15:43 ` Daniel Mack 2010-04-27 17:27 ` The Source 0 siblings, 1 reply; 48+ messages in thread From: Daniel Mack @ 2010-04-27 15:43 UTC (permalink / raw) To: The Source; +Cc: alsa-devel On Tue, Apr 27, 2010 at 07:29:52PM +0400, The Source wrote: > 27.04.2010 18:07, Daniel Mack пишет: > >On Tue, Apr 27, 2010 at 05:31:35PM +0400, The Source wrote: > >>Perhaps I should've posted my problem in this thread earlier. Here's the > >>summary: > >>Creative X-Fi Notebook stopped working after upgrading from 1.0.22.1 to > >>1.0.23 (worked just fine before). > >>dmesg gives the following: > >> > >>usb 8-2: new full speed USB device using uhci_hcd and address 2 > >>usb 8-2: New USB device found, idVendor=041e, idProduct=30d2 > >>usb 8-2: New USB device strings: Mfr=1, Product=2, SerialNumber=0 > >>usb 8-2: Product: SB X-Fi Notebook > >>usb 8-2: Manufacturer: Creative Technology Ltd > >>usb 8-2: configuration #1 chosen from 1 choice > >>input: Creative Technology Ltd SB X-Fi Notebook as > >>/devices/pci0000:00/0000:00:1d.2/usb8/8-2/8-2:1.3/input/input11 > >>generic-usb 0003:041E:30D2.0002: input,hidraw1: USB HID v1.11 Device > >>[Creative Technology Ltd SB X-Fi Notebook] on usb-0000:00:1d.2-2/input3 > >>input: Creative Technology Ltd SB X-Fi Notebook as > >>/devices/pci0000:00/0000:00:1d.2/usb8/8-2/8-2:1.4/input/input12 > >>generic-usb 0003:041E:30D2.0003: input,hidraw2: USB HID v1.11 Keyboard > >>[Creative Technology Ltd SB X-Fi Notebook] on usb-0000:00:1d.2-2/input4 > >>ALSA pcm.c:174: 2:1:1: endpoint lacks sample rate attribute bit, cannot > >>set. > >>ALSA pcm.c:174: 2:2:1: endpoint lacks sample rate attribute bit, cannot > >>set. > >And you say this is a regression from earlier versions? Would you be > >able to bisect this problem? > > > >Daniel > > > Gladly, if you just tell me how :) You would check out the latest mainline sources: $ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git $ cd linux-2.6 Then create a branch and merge the latest ALSA patches: $ git checkout -b alsa $ git pull git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6.git Then build and install the kernel and verify it still shows the error. Start the bisect and mark the current revision as 'bad': $ git bisect start $ git bisect bad Assuming that v2.6.34-rc5 (before the merge) still works, you would mark this as 'good': $ git bisect good v2.6.34-rc5 git will now iterate you thru the changes and drop you off at chosen points. Just compile the tree you get, and tell git whether this is a good or bad one: $ git bisect good or $ git bisect bad Then recompile and test again After some steps, it will tell you which commit precisely broke it. HTH, Daniel _______________________________________________ Alsa-devel mailing list Alsa-devel@alsa-project.org http://mailman.alsa-project.org/mailman/listinfo/alsa-devel ^ permalink raw reply [flat|nested] 48+ messages in thread
* Re: usbaudio: Support for USB audio v2.0 devices 2010-04-27 15:43 ` Daniel Mack @ 2010-04-27 17:27 ` The Source 2010-04-27 17:33 ` Daniel Mack 0 siblings, 1 reply; 48+ messages in thread From: The Source @ 2010-04-27 17:27 UTC (permalink / raw) To: Daniel Mack; +Cc: alsa-devel 27.04.2010 19:43, Daniel Mack пишет: > On Tue, Apr 27, 2010 at 07:29:52PM +0400, The Source wrote: > >> 27.04.2010 18:07, Daniel Mack пишет: >> >>> On Tue, Apr 27, 2010 at 05:31:35PM +0400, The Source wrote: >>> >>>> Perhaps I should've posted my problem in this thread earlier. Here's the >>>> summary: >>>> Creative X-Fi Notebook stopped working after upgrading from 1.0.22.1 to >>>> 1.0.23 (worked just fine before). >>>> dmesg gives the following: >>>> >>>> usb 8-2: new full speed USB device using uhci_hcd and address 2 >>>> usb 8-2: New USB device found, idVendor=041e, idProduct=30d2 >>>> usb 8-2: New USB device strings: Mfr=1, Product=2, SerialNumber=0 >>>> usb 8-2: Product: SB X-Fi Notebook >>>> usb 8-2: Manufacturer: Creative Technology Ltd >>>> usb 8-2: configuration #1 chosen from 1 choice >>>> input: Creative Technology Ltd SB X-Fi Notebook as >>>> /devices/pci0000:00/0000:00:1d.2/usb8/8-2/8-2:1.3/input/input11 >>>> generic-usb 0003:041E:30D2.0002: input,hidraw1: USB HID v1.11 Device >>>> [Creative Technology Ltd SB X-Fi Notebook] on usb-0000:00:1d.2-2/input3 >>>> input: Creative Technology Ltd SB X-Fi Notebook as >>>> /devices/pci0000:00/0000:00:1d.2/usb8/8-2/8-2:1.4/input/input12 >>>> generic-usb 0003:041E:30D2.0003: input,hidraw2: USB HID v1.11 Keyboard >>>> [Creative Technology Ltd SB X-Fi Notebook] on usb-0000:00:1d.2-2/input4 >>>> ALSA pcm.c:174: 2:1:1: endpoint lacks sample rate attribute bit, cannot >>>> set. >>>> ALSA pcm.c:174: 2:2:1: endpoint lacks sample rate attribute bit, cannot >>>> set. >>>> >>> And you say this is a regression from earlier versions? Would you be >>> able to bisect this problem? >>> >>> Daniel >>> >>> >> Gladly, if you just tell me how :) >> > You would check out the latest mainline sources: > > $ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git > $ cd linux-2.6 > > Then create a branch and merge the latest ALSA patches: > > $ git checkout -b alsa > $ git pull git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6.git > > Then build and install the kernel and verify it still shows the error. > Start the bisect and mark the current revision as 'bad': > > $ git bisect start > $ git bisect bad > > Assuming that v2.6.34-rc5 (before the merge) still works, you would mark > this as 'good': > > $ git bisect good v2.6.34-rc5 > > git will now iterate you thru the changes and drop you off at chosen > points. Just compile the tree you get, and tell git whether this is a > good or bad one: > > $ git bisect good > or > $ git bisect bad > > Then recompile and test again After some steps, it will tell you which > commit precisely broke it. > > HTH, > Daniel > > > I'll try that. But is there any way to do this just with alsa and not with entire kernel? Compiling kernel is a loooong process. _______________________________________________ Alsa-devel mailing list Alsa-devel@alsa-project.org http://mailman.alsa-project.org/mailman/listinfo/alsa-devel ^ permalink raw reply [flat|nested] 48+ messages in thread
* Re: usbaudio: Support for USB audio v2.0 devices 2010-04-27 17:27 ` The Source @ 2010-04-27 17:33 ` Daniel Mack 2010-05-02 16:56 ` The Source 0 siblings, 1 reply; 48+ messages in thread From: Daniel Mack @ 2010-04-27 17:33 UTC (permalink / raw) To: The Source; +Cc: alsa-devel On Tue, Apr 27, 2010 at 09:27:15PM +0400, The Source wrote: > 27.04.2010 19:43, Daniel Mack пишет: > >You would check out the latest mainline sources: > > > > $ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git > > $ cd linux-2.6 > > > >Then create a branch and merge the latest ALSA patches: > > > > $ git checkout -b alsa > > $ git pull git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6.git > > > >Then build and install the kernel and verify it still shows the error. > >Start the bisect and mark the current revision as 'bad': > > > > $ git bisect start > > $ git bisect bad > > > >Assuming that v2.6.34-rc5 (before the merge) still works, you would mark > >this as 'good': > > > > $ git bisect good v2.6.34-rc5 > > > >git will now iterate you thru the changes and drop you off at chosen > >points. Just compile the tree you get, and tell git whether this is a > >good or bad one: > > > > $ git bisect good > > or > > $ git bisect bad > > > >Then recompile and test again After some steps, it will tell you which > >commit precisely broke it. > > > >HTH, > >Daniel > > > > > I'll try that. But is there any way to do this just with alsa and > not with entire kernel? Compiling kernel is a loooong process. The description above won't touch much things outside the ALSA tree during the bisect, so it shouldn't take long to compile. Thanks for helping, Daniel _______________________________________________ Alsa-devel mailing list Alsa-devel@alsa-project.org http://mailman.alsa-project.org/mailman/listinfo/alsa-devel ^ permalink raw reply [flat|nested] 48+ messages in thread
* Re: usbaudio: Support for USB audio v2.0 devices 2010-04-27 17:33 ` Daniel Mack @ 2010-05-02 16:56 ` The Source 2010-05-03 20:55 ` Daniel Mack 0 siblings, 1 reply; 48+ messages in thread From: The Source @ 2010-05-02 16:56 UTC (permalink / raw) To: Daniel Mack; +Cc: alsa-devel 27.04.2010 21:33, Daniel Mack пишет: > On Tue, Apr 27, 2010 at 09:27:15PM +0400, The Source wrote: > >> 27.04.2010 19:43, Daniel Mack пишет: >> >>> You would check out the latest mainline sources: >>> >>> $ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git >>> $ cd linux-2.6 >>> >>> Then create a branch and merge the latest ALSA patches: >>> >>> $ git checkout -b alsa >>> $ git pull git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6.git >>> >>> Then build and install the kernel and verify it still shows the error. >>> Start the bisect and mark the current revision as 'bad': >>> >>> $ git bisect start >>> $ git bisect bad >>> >>> Assuming that v2.6.34-rc5 (before the merge) still works, you would mark >>> this as 'good': >>> >>> $ git bisect good v2.6.34-rc5 >>> >>> git will now iterate you thru the changes and drop you off at chosen >>> points. Just compile the tree you get, and tell git whether this is a >>> good or bad one: >>> >>> $ git bisect good >>> or >>> $ git bisect bad >>> >>> Then recompile and test again After some steps, it will tell you which >>> commit precisely broke it. >>> >>> HTH, >>> Daniel >>> >>> >>> >> I'll try that. But is there any way to do this just with alsa and >> not with entire kernel? Compiling kernel is a loooong process. >> > The description above won't touch much things outside the ALSA tree > during the bisect, so it shouldn't take long to compile. > > Thanks for helping, > Daniel > > > I'm sorry, but after 2 or 3 steps (of ~10) I got kernel that doesn't even boot properly (2.6.34-rc4, something with sata is broken) so I can't test my card with this kernel. Should I mark current version as bad and continue or something else can be done? _______________________________________________ Alsa-devel mailing list Alsa-devel@alsa-project.org http://mailman.alsa-project.org/mailman/listinfo/alsa-devel ^ permalink raw reply [flat|nested] 48+ messages in thread
* Re: usbaudio: Support for USB audio v2.0 devices 2010-05-02 16:56 ` The Source @ 2010-05-03 20:55 ` Daniel Mack 2010-05-07 13:19 ` The Source 0 siblings, 1 reply; 48+ messages in thread From: Daniel Mack @ 2010-05-03 20:55 UTC (permalink / raw) To: The Source; +Cc: alsa-devel On Sun, May 02, 2010 at 08:56:18PM +0400, The Source wrote: > 27.04.2010 21:33, Daniel Mack пишет: > >On Tue, Apr 27, 2010 at 09:27:15PM +0400, The Source wrote: > >>27.04.2010 19:43, Daniel Mack пишет: > >>>You would check out the latest mainline sources: > >>> > >>> $ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git > >>> $ cd linux-2.6 > >>> > >>>Then create a branch and merge the latest ALSA patches: > >>> > >>> $ git checkout -b alsa > >>> $ git pull git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6.git > >>> > >>>Then build and install the kernel and verify it still shows the error. > >>>Start the bisect and mark the current revision as 'bad': > >>> > >>> $ git bisect start > >>> $ git bisect bad > >>> > >>>Assuming that v2.6.34-rc5 (before the merge) still works, you would mark > >>>this as 'good': > >>> > >>> $ git bisect good v2.6.34-rc5 > >>> > >>>git will now iterate you thru the changes and drop you off at chosen > >>>points. Just compile the tree you get, and tell git whether this is a > >>>good or bad one: > >>> > >>> $ git bisect good > >>> or > >>> $ git bisect bad > >>> > >>>Then recompile and test again After some steps, it will tell you which > >>>commit precisely broke it. > >>> > >>>HTH, > >>>Daniel > >>> > >>> > >>I'll try that. But is there any way to do this just with alsa and > >>not with entire kernel? Compiling kernel is a loooong process. > >The description above won't touch much things outside the ALSA tree > >during the bisect, so it shouldn't take long to compile. > > > >Thanks for helping, > >Daniel > > > > > I'm sorry, but after 2 or 3 steps (of ~10) I got kernel that doesn't > even boot properly (2.6.34-rc4, something with sata is broken) so I > can't test my card with this kernel. Should I mark current version > as bad and continue or something else can be done? Hmm, so you say you can't boot a vanilla (unmodified) 2.6.34-rc4? Is your problem fixed in the current git HEAD? The bisect procedure I described shouldn't touch anything else than sound code, so SATA should be unaffected. Anyway, you can skip unbootable or uncompilable versions with $ git bisect skip HTH, Daniel _______________________________________________ Alsa-devel mailing list Alsa-devel@alsa-project.org http://mailman.alsa-project.org/mailman/listinfo/alsa-devel ^ permalink raw reply [flat|nested] 48+ messages in thread
* Re: usbaudio: Support for USB audio v2.0 devices 2010-05-03 20:55 ` Daniel Mack @ 2010-05-07 13:19 ` The Source 2010-05-07 13:22 ` Daniel Mack 2010-05-07 20:12 ` Daniel Mack 0 siblings, 2 replies; 48+ messages in thread From: The Source @ 2010-05-07 13:19 UTC (permalink / raw) To: Daniel Mack; +Cc: alsa-devel 04.05.2010 00:55, Daniel Mack пишет: > On Sun, May 02, 2010 at 08:56:18PM +0400, The Source wrote: > >> 27.04.2010 21:33, Daniel Mack пишет: >> >>> On Tue, Apr 27, 2010 at 09:27:15PM +0400, The Source wrote: >>> >>>> 27.04.2010 19:43, Daniel Mack пишет: >>>> >>>>> You would check out the latest mainline sources: >>>>> >>>>> $ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git >>>>> $ cd linux-2.6 >>>>> >>>>> Then create a branch and merge the latest ALSA patches: >>>>> >>>>> $ git checkout -b alsa >>>>> $ git pull git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6.git >>>>> >>>>> Then build and install the kernel and verify it still shows the error. >>>>> Start the bisect and mark the current revision as 'bad': >>>>> >>>>> $ git bisect start >>>>> $ git bisect bad >>>>> >>>>> Assuming that v2.6.34-rc5 (before the merge) still works, you would mark >>>>> this as 'good': >>>>> >>>>> $ git bisect good v2.6.34-rc5 >>>>> >>>>> git will now iterate you thru the changes and drop you off at chosen >>>>> points. Just compile the tree you get, and tell git whether this is a >>>>> good or bad one: >>>>> >>>>> $ git bisect good >>>>> or >>>>> $ git bisect bad >>>>> >>>>> Then recompile and test again After some steps, it will tell you which >>>>> commit precisely broke it. >>>>> >>>>> HTH, >>>>> Daniel >>>>> >>>>> >>>>> >>>> I'll try that. But is there any way to do this just with alsa and >>>> not with entire kernel? Compiling kernel is a loooong process. >>>> >>> The description above won't touch much things outside the ALSA tree >>> during the bisect, so it shouldn't take long to compile. >>> >>> Thanks for helping, >>> Daniel >>> >>> >>> >> I'm sorry, but after 2 or 3 steps (of ~10) I got kernel that doesn't >> even boot properly (2.6.34-rc4, something with sata is broken) so I >> can't test my card with this kernel. Should I mark current version >> as bad and continue or something else can be done? >> > Hmm, so you say you can't boot a vanilla (unmodified) 2.6.34-rc4? Is > your problem fixed in the current git HEAD? The bisect procedure I > described shouldn't touch anything else than sound code, so SATA should > be unaffected. Anyway, you can skip unbootable or uncompilable versions > with > > $ git bisect skip > > HTH, > Daniel > > > Bisect results: 23caaf19b11eda7054348452e1618d4512a86907 is the first bad commit commit 23caaf19b11eda7054348452e1618d4512a86907 Author: Daniel Mack <daniel@caiaq.de> Date: Thu Mar 11 21:13:25 2010 +0100 ALSA: usb-mixer: Add support for Audio Class v2.0 USB Audio Class v2.0 compliant devices have different descriptors and a different way of setting/getting min/max/res/cur properties. This patch adds support for them. Signed-off-by: Daniel Mack <daniel@caiaq.de> Cc: Clemens Ladisch <clemens@ladisch.de> Signed-off-by: Takashi Iwai <tiwai@suse.de> :040000 040000 db0691095b20f0872c9042e6498ce40693d69241 7cd9e29352fd45e50968b4a17891d1c3225aaba9 M include :040000 040000 981c7c69fc8695281929677ebccf3bdae5ef41de c5bec5c3954278601ec4b29226f4671333262f04 M sound _______________________________________________ Alsa-devel mailing list Alsa-devel@alsa-project.org http://mailman.alsa-project.org/mailman/listinfo/alsa-devel ^ permalink raw reply [flat|nested] 48+ messages in thread
* Re: usbaudio: Support for USB audio v2.0 devices 2010-05-07 13:19 ` The Source @ 2010-05-07 13:22 ` Daniel Mack 2010-05-07 20:12 ` Daniel Mack 1 sibling, 0 replies; 48+ messages in thread From: Daniel Mack @ 2010-05-07 13:22 UTC (permalink / raw) To: The Source; +Cc: alsa-devel On Fri, May 07, 2010 at 05:19:24PM +0400, The Source wrote: > Bisect results: > > 23caaf19b11eda7054348452e1618d4512a86907 is the first bad commit > commit 23caaf19b11eda7054348452e1618d4512a86907 > Author: Daniel Mack <daniel@caiaq.de> > Date: Thu Mar 11 21:13:25 2010 +0100 Thanks a lot! I'll have a close look again where I might have broken anything. I'll let you know. Daniel > > ALSA: usb-mixer: Add support for Audio Class v2.0 > > USB Audio Class v2.0 compliant devices have different descriptors and a > different way of setting/getting min/max/res/cur properties. This patch > adds support for them. > > Signed-off-by: Daniel Mack <daniel@caiaq.de> > Cc: Clemens Ladisch <clemens@ladisch.de> > Signed-off-by: Takashi Iwai <tiwai@suse.de> > > :040000 040000 db0691095b20f0872c9042e6498ce40693d69241 > 7cd9e29352fd45e50968b4a17891d1c3225aaba9 M include > :040000 040000 981c7c69fc8695281929677ebccf3bdae5ef41de > c5bec5c3954278601ec4b29226f4671333262f04 M sound > ^ permalink raw reply [flat|nested] 48+ messages in thread
* Re: usbaudio: Support for USB audio v2.0 devices 2010-05-07 13:19 ` The Source 2010-05-07 13:22 ` Daniel Mack @ 2010-05-07 20:12 ` Daniel Mack 2010-05-07 21:32 ` The Source 2010-05-08 7:26 ` The Source 1 sibling, 2 replies; 48+ messages in thread From: Daniel Mack @ 2010-05-07 20:12 UTC (permalink / raw) To: The Source; +Cc: alsa-devel On Fri, May 07, 2010 at 05:19:24PM +0400, The Source wrote: > Bisect results: > > 23caaf19b11eda7054348452e1618d4512a86907 is the first bad commit > commit 23caaf19b11eda7054348452e1618d4512a86907 > Author: Daniel Mack <daniel@caiaq.de> > Date: Thu Mar 11 21:13:25 2010 +0100 > > ALSA: usb-mixer: Add support for Audio Class v2.0 > > USB Audio Class v2.0 compliant devices have different descriptors and a > different way of setting/getting min/max/res/cur properties. This patch > adds support for them. > > Signed-off-by: Daniel Mack <daniel@caiaq.de> > Cc: Clemens Ladisch <clemens@ladisch.de> > Signed-off-by: Takashi Iwai <tiwai@suse.de> > I've found two changes in this commit that are obviously wrong. Could you try the patch below please? Sorry for the trouble. Daniel diff --git a/include/linux/usb/audio.h b/include/linux/usb/audio.h index 905a87c..57f2055 100644 --- a/include/linux/usb/audio.h +++ b/include/linux/usb/audio.h @@ -244,7 +244,7 @@ struct uac_selector_unit_descriptor { static inline __u8 uac_selector_unit_iSelector(struct uac_selector_unit_descriptor *desc) { __u8 *raw = (__u8 *) desc; - return raw[desc->bLength - 1]; + return raw[9 + desc->bLength - 1]; } /* 4.3.2.5 Feature Unit Descriptor */ diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c index 21613fe..fa0fb77 100644 --- a/sound/usb/mixer.c +++ b/sound/usb/mixer.c @@ -656,7 +656,7 @@ static int check_input_term(struct mixer_build *state, int id, struct usb_audio_ case UAC_FEATURE_UNIT: { /* the header is the same for v1 and v2 */ struct uac_feature_unit_descriptor *d = p1; - id = d->bUnitID; + id = d->bSourceID; break; /* continue to parse */ } case UAC_MIXER_UNIT: { ^ permalink raw reply related [flat|nested] 48+ messages in thread
* Re: usbaudio: Support for USB audio v2.0 devices 2010-05-07 20:12 ` Daniel Mack @ 2010-05-07 21:32 ` The Source 2010-05-08 1:38 ` Daniel Mack 2010-05-08 7:26 ` The Source 1 sibling, 1 reply; 48+ messages in thread From: The Source @ 2010-05-07 21:32 UTC (permalink / raw) To: Daniel Mack; +Cc: alsa-devel 08.05.2010 00:12, Daniel Mack пишет: > On Fri, May 07, 2010 at 05:19:24PM +0400, The Source wrote: > >> Bisect results: >> >> 23caaf19b11eda7054348452e1618d4512a86907 is the first bad commit >> commit 23caaf19b11eda7054348452e1618d4512a86907 >> Author: Daniel Mack<daniel@caiaq.de> >> Date: Thu Mar 11 21:13:25 2010 +0100 >> >> ALSA: usb-mixer: Add support for Audio Class v2.0 >> >> USB Audio Class v2.0 compliant devices have different descriptors and a >> different way of setting/getting min/max/res/cur properties. This patch >> adds support for them. >> >> Signed-off-by: Daniel Mack<daniel@caiaq.de> >> Cc: Clemens Ladisch<clemens@ladisch.de> >> Signed-off-by: Takashi Iwai<tiwai@suse.de> >> >> > I've found two changes in this commit that are obviously wrong. > Could you try the patch below please? > > Sorry for the trouble. > > Daniel > > > diff --git a/include/linux/usb/audio.h b/include/linux/usb/audio.h > index 905a87c..57f2055 100644 > --- a/include/linux/usb/audio.h > +++ b/include/linux/usb/audio.h > @@ -244,7 +244,7 @@ struct uac_selector_unit_descriptor { > static inline __u8 uac_selector_unit_iSelector(struct uac_selector_unit_descriptor *desc) > { > __u8 *raw = (__u8 *) desc; > - return raw[desc->bLength - 1]; > + return raw[9 + desc->bLength - 1]; > } > > /* 4.3.2.5 Feature Unit Descriptor */ > diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c > index 21613fe..fa0fb77 100644 > --- a/sound/usb/mixer.c > +++ b/sound/usb/mixer.c > @@ -656,7 +656,7 @@ static int check_input_term(struct mixer_build *state, int id, struct usb_audio_ > case UAC_FEATURE_UNIT: { > /* the header is the same for v1 and v2 */ > struct uac_feature_unit_descriptor *d = p1; > - id = d->bUnitID; > + id = d->bSourceID; > break; /* continue to parse */ > } > case UAC_MIXER_UNIT: { > > Can you create a patch against 1.0.23 alsa-driver package? It would be much easier (and faster) to test, thank you. _______________________________________________ Alsa-devel mailing list Alsa-devel@alsa-project.org http://mailman.alsa-project.org/mailman/listinfo/alsa-devel ^ permalink raw reply [flat|nested] 48+ messages in thread
* Re: usbaudio: Support for USB audio v2.0 devices 2010-05-07 21:32 ` The Source @ 2010-05-08 1:38 ` Daniel Mack 0 siblings, 0 replies; 48+ messages in thread From: Daniel Mack @ 2010-05-08 1:38 UTC (permalink / raw) To: The Source; +Cc: alsa-devel On Sat, May 08, 2010 at 01:32:49AM +0400, The Source wrote: > Can you create a patch against 1.0.23 alsa-driver package? It would > be much easier (and faster) to test, thank you. Is it really? The patch I sent should apply cleanly to a checkout of Linus' master + Takashi's sound-2.6.git, just like the tree you used for bisecting. This is also usually a much better way to keep up-to-date, and patches against ALSA releases are rather uncommon. Daniel ^ permalink raw reply [flat|nested] 48+ messages in thread
* Re: usbaudio: Support for USB audio v2.0 devices 2010-05-07 20:12 ` Daniel Mack 2010-05-07 21:32 ` The Source @ 2010-05-08 7:26 ` The Source 2010-05-08 9:19 ` Daniel Mack 1 sibling, 1 reply; 48+ messages in thread From: The Source @ 2010-05-08 7:26 UTC (permalink / raw) To: Daniel Mack; +Cc: alsa-devel 08.05.2010 00:12, Daniel Mack пишет: > On Fri, May 07, 2010 at 05:19:24PM +0400, The Source wrote: > >> Bisect results: >> >> 23caaf19b11eda7054348452e1618d4512a86907 is the first bad commit >> commit 23caaf19b11eda7054348452e1618d4512a86907 >> Author: Daniel Mack<daniel@caiaq.de> >> Date: Thu Mar 11 21:13:25 2010 +0100 >> >> ALSA: usb-mixer: Add support for Audio Class v2.0 >> >> USB Audio Class v2.0 compliant devices have different descriptors and a >> different way of setting/getting min/max/res/cur properties. This patch >> adds support for them. >> >> Signed-off-by: Daniel Mack<daniel@caiaq.de> >> Cc: Clemens Ladisch<clemens@ladisch.de> >> Signed-off-by: Takashi Iwai<tiwai@suse.de> >> >> > I've found two changes in this commit that are obviously wrong. > Could you try the patch below please? > > Sorry for the trouble. > > Daniel > > > diff --git a/include/linux/usb/audio.h b/include/linux/usb/audio.h > index 905a87c..57f2055 100644 > --- a/include/linux/usb/audio.h > +++ b/include/linux/usb/audio.h > @@ -244,7 +244,7 @@ struct uac_selector_unit_descriptor { > static inline __u8 uac_selector_unit_iSelector(struct uac_selector_unit_descriptor *desc) > { > __u8 *raw = (__u8 *) desc; > - return raw[desc->bLength - 1]; > + return raw[9 + desc->bLength - 1]; > } > > /* 4.3.2.5 Feature Unit Descriptor */ > diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c > index 21613fe..fa0fb77 100644 > --- a/sound/usb/mixer.c > +++ b/sound/usb/mixer.c > @@ -656,7 +656,7 @@ static int check_input_term(struct mixer_build *state, int id, struct usb_audio_ > case UAC_FEATURE_UNIT: { > /* the header is the same for v1 and v2 */ > struct uac_feature_unit_descriptor *d = p1; > - id = d->bUnitID; > + id = d->bSourceID; > break; /* continue to parse */ > } > case UAC_MIXER_UNIT: { > > The patch did it (applied to latest git, or so I think - I used 'git bisect reset' to return to latest), now the card works properly (both playback and record), thank you very much. _______________________________________________ Alsa-devel mailing list Alsa-devel@alsa-project.org http://mailman.alsa-project.org/mailman/listinfo/alsa-devel ^ permalink raw reply [flat|nested] 48+ messages in thread
* Re: usbaudio: Support for USB audio v2.0 devices 2010-05-08 7:26 ` The Source @ 2010-05-08 9:19 ` Daniel Mack 0 siblings, 0 replies; 48+ messages in thread From: Daniel Mack @ 2010-05-08 9:19 UTC (permalink / raw) To: The Source; +Cc: alsa-devel On Sat, May 08, 2010 at 11:26:03AM +0400, The Source wrote: > 08.05.2010 00:12, Daniel Mack пишет: > >On Fri, May 07, 2010 at 05:19:24PM +0400, The Source wrote: > >>Bisect results: > >> > >>23caaf19b11eda7054348452e1618d4512a86907 is the first bad commit > >>commit 23caaf19b11eda7054348452e1618d4512a86907 > >>Author: Daniel Mack<daniel@caiaq.de> > >>Date: Thu Mar 11 21:13:25 2010 +0100 > >> > >> ALSA: usb-mixer: Add support for Audio Class v2.0 > >> > >> USB Audio Class v2.0 compliant devices have different descriptors and a > >> different way of setting/getting min/max/res/cur properties. This patch > >> adds support for them. > >> > >> Signed-off-by: Daniel Mack<daniel@caiaq.de> > >> Cc: Clemens Ladisch<clemens@ladisch.de> > >> Signed-off-by: Takashi Iwai<tiwai@suse.de> > >> > >I've found two changes in this commit that are obviously wrong. > >Could you try the patch below please? > > > >Sorry for the trouble. > > > >Daniel > > > > > >diff --git a/include/linux/usb/audio.h b/include/linux/usb/audio.h > >index 905a87c..57f2055 100644 > >--- a/include/linux/usb/audio.h > >+++ b/include/linux/usb/audio.h > >@@ -244,7 +244,7 @@ struct uac_selector_unit_descriptor { > > static inline __u8 uac_selector_unit_iSelector(struct uac_selector_unit_descriptor *desc) > > { > > __u8 *raw = (__u8 *) desc; > >- return raw[desc->bLength - 1]; > >+ return raw[9 + desc->bLength - 1]; > > } > > > > /* 4.3.2.5 Feature Unit Descriptor */ > >diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c > >index 21613fe..fa0fb77 100644 > >--- a/sound/usb/mixer.c > >+++ b/sound/usb/mixer.c > >@@ -656,7 +656,7 @@ static int check_input_term(struct mixer_build *state, int id, struct usb_audio_ > > case UAC_FEATURE_UNIT: { > > /* the header is the same for v1 and v2 */ > > struct uac_feature_unit_descriptor *d = p1; > >- id = d->bUnitID; > >+ id = d->bSourceID; > > break; /* continue to parse */ > > } > > case UAC_MIXER_UNIT: { > > > The patch did it (applied to latest git, or so I think - I used 'git > bisect reset' to return to latest), now the card works properly > (both playback and record), thank you very much. Thank you for helping - much appreciated! Daniel _______________________________________________ Alsa-devel mailing list Alsa-devel@alsa-project.org http://mailman.alsa-project.org/mailman/listinfo/alsa-devel ^ permalink raw reply [flat|nested] 48+ messages in thread
* Re: usbaudio: Support for USB audio v2.0 devices 2010-04-27 13:23 ` adelias 2010-04-27 13:31 ` The Source @ 2010-04-27 14:06 ` Daniel Mack 2010-05-03 12:49 ` adelias 1 sibling, 1 reply; 48+ messages in thread From: Daniel Mack @ 2010-04-27 14:06 UTC (permalink / raw) To: adelias; +Cc: alsa-devel On Tue, Apr 27, 2010 at 04:23:48PM +0300, adelias wrote: > On 2/3/2010 8:35 μμ, Daniel Mack wrote: > > On Tue, Mar 02, 2010 at 11:13:04AM +0200, adelias wrote: > >> Thanks to all involved for working on usb audio v2. > >> > >> Last night I installed the 20100226 snapshot. I did a little testing > >> with my XMOS board using toslink out into may DAC. I tried various files > >> ranging 16bit/44110kHz-24bit/192000kHz. The 44110 files had quite a bit > >> of static, the higher bitrate files were better. As you stated the > >> sampling rate is not correct and be verified by looking at the flashing > >> LEDs on the XMOS board. They should flash faster as sampling rate > >> increase. In this case no change was observed. > > > > Yes - this is all do be done. The sample rate setting is done with a > > different type of class request, which also addresses the interface now, > > unlike v1 devices which send that to the endpoint. But that's just one > > out of many differences that need to be addressed, and it's still a long > > way to go. I'm on it :) > > > > Daniel > > I upgraded alsa to 1.0.23. The XMOS device is working great with the > exception of some mild clicks here and there. Is this a known issue or > might it be a problem with my specific configuration? What specific configuration are you testing with? As you have such an evaluation kit, I believe you're also provided with the XMOS development platform - which firmware did you install to the board? Daniel _______________________________________________ Alsa-devel mailing list Alsa-devel@alsa-project.org http://mailman.alsa-project.org/mailman/listinfo/alsa-devel ^ permalink raw reply [flat|nested] 48+ messages in thread
* Re: usbaudio: Support for USB audio v2.0 devices 2010-04-27 14:06 ` Daniel Mack @ 2010-05-03 12:49 ` adelias 2010-05-04 10:48 ` Daniel Mack 0 siblings, 1 reply; 48+ messages in thread From: adelias @ 2010-05-03 12:49 UTC (permalink / raw) To: alsa-devel On 27/4/2010 5:06 μμ, Daniel Mack wrote: > On Tue, Apr 27, 2010 at 04:23:48PM +0300, adelias wrote: >> On 2/3/2010 8:35 μμ, Daniel Mack wrote: >>> On Tue, Mar 02, 2010 at 11:13:04AM +0200, adelias wrote: >>>> Thanks to all involved for working on usb audio v2. >>>> >>>> Last night I installed the 20100226 snapshot. I did a little testing >>>> with my XMOS board using toslink out into may DAC. I tried various files >>>> ranging 16bit/44110kHz-24bit/192000kHz. The 44110 files had quite a bit >>>> of static, the higher bitrate files were better. As you stated the >>>> sampling rate is not correct and be verified by looking at the flashing >>>> LEDs on the XMOS board. They should flash faster as sampling rate >>>> increase. In this case no change was observed. >>> >>> Yes - this is all do be done. The sample rate setting is done with a >>> different type of class request, which also addresses the interface now, >>> unlike v1 devices which send that to the endpoint. But that's just one >>> out of many differences that need to be addressed, and it's still a long >>> way to go. I'm on it :) >>> >>> Daniel >> >> I upgraded alsa to 1.0.23. The XMOS device is working great with the >> exception of some mild clicks here and there. Is this a known issue or >> might it be a problem with my specific configuration? > > What specific configuration are you testing with? As you have such an > evaluation kit, I believe you're also provided with the XMOS development > platform - which firmware did you install to the board? > > Daniel Firmware is on 1v2. I'm not getting clicks on OSX 10.6.2 or Windows 7 with the ASIO driver. _______________________________________________ Alsa-devel mailing list Alsa-devel@alsa-project.org http://mailman.alsa-project.org/mailman/listinfo/alsa-devel ^ permalink raw reply [flat|nested] 48+ messages in thread
* Re: usbaudio: Support for USB audio v2.0 devices 2010-05-03 12:49 ` adelias @ 2010-05-04 10:48 ` Daniel Mack 2010-05-18 7:07 ` adelias 0 siblings, 1 reply; 48+ messages in thread From: Daniel Mack @ 2010-05-04 10:48 UTC (permalink / raw) To: adelias; +Cc: alsa-devel On Mon, May 03, 2010 at 03:49:05PM +0300, adelias wrote: > On 27/4/2010 5:06 μμ, Daniel Mack wrote: > >What specific configuration are you testing with? As you have such an > >evaluation kit, I believe you're also provided with the XMOS development > >platform - which firmware did you install to the board? > > > >Daniel > > Firmware is on 1v2. I'm not getting clicks on OSX 10.6.2 or Windows > 7 with the ASIO driver. Well, at least for OS X 10.6.2, there are problems in the class driver. Do some long-time measurements with inputs and outputs to meet them. I would also suggest to try a newer firmware, 1v2 is rather old. If you still happen to have problems, let me know and I'll have another look. Ironically, things don't work for me anymore currently with the Linux master git + sound-2.6. I'm getting XActErrors all over the place, but that's most probably not related to the driver itself but some regression in the Linux USB stack I believe. Could you try that as well? Thanks, Daniel _______________________________________________ Alsa-devel mailing list Alsa-devel@alsa-project.org http://mailman.alsa-project.org/mailman/listinfo/alsa-devel ^ permalink raw reply [flat|nested] 48+ messages in thread
* Re: usbaudio: Support for USB audio v2.0 devices 2010-05-04 10:48 ` Daniel Mack @ 2010-05-18 7:07 ` adelias 2010-05-18 7:40 ` Daniel Mack 2010-05-27 18:21 ` Daniel Mack 0 siblings, 2 replies; 48+ messages in thread From: adelias @ 2010-05-18 7:07 UTC (permalink / raw) To: alsa-devel On 4/5/2010 1:48 μμ, Daniel Mack wrote: > On Mon, May 03, 2010 at 03:49:05PM +0300, adelias wrote: >> On 27/4/2010 5:06 μμ, Daniel Mack wrote: >>> What specific configuration are you testing with? As you have such an >>> evaluation kit, I believe you're also provided with the XMOS development >>> platform - which firmware did you install to the board? >>> >>> Daniel >> >> Firmware is on 1v2. I'm not getting clicks on OSX 10.6.2 or Windows >> 7 with the ASIO driver. > > Well, at least for OS X 10.6.2, there are problems in the class driver. > Do some long-time measurements with inputs and outputs to meet them. > > I would also suggest to try a newer firmware, 1v2 is rather old. If you > still happen to have problems, let me know and I'll have another look. > > Ironically, things don't work for me anymore currently with the Linux > master git + sound-2.6. I'm getting XActErrors all over the place, but > that's most probably not related to the driver itself but some > regression in the Linux USB stack I believe. Could you try that as well? > > Thanks, > Daniel > After upgrading XMOS firmware to 1v5, although the board is recognized, it no longer functions with alsa. Also needs to be reset before it is recognized in Windows. _______________________________________________ Alsa-devel mailing list Alsa-devel@alsa-project.org http://mailman.alsa-project.org/mailman/listinfo/alsa-devel ^ permalink raw reply [flat|nested] 48+ messages in thread
* Re: usbaudio: Support for USB audio v2.0 devices 2010-05-18 7:07 ` adelias @ 2010-05-18 7:40 ` Daniel Mack 2010-05-18 8:32 ` adelias 2010-05-27 18:21 ` Daniel Mack 1 sibling, 1 reply; 48+ messages in thread From: Daniel Mack @ 2010-05-18 7:40 UTC (permalink / raw) To: adelias; +Cc: alsa-devel On Tue, May 18, 2010 at 10:07:57AM +0300, adelias wrote: > On 4/5/2010 1:48 μμ, Daniel Mack wrote: > > On Mon, May 03, 2010 at 03:49:05PM +0300, adelias wrote: > >> On 27/4/2010 5:06 μμ, Daniel Mack wrote: > >>> What specific configuration are you testing with? As you have such an > >>> evaluation kit, I believe you're also provided with the XMOS development > >>> platform - which firmware did you install to the board? > >>> > >>> Daniel > >> > >> Firmware is on 1v2. I'm not getting clicks on OSX 10.6.2 or Windows > >> 7 with the ASIO driver. > > > > Well, at least for OS X 10.6.2, there are problems in the class driver. > > Do some long-time measurements with inputs and outputs to meet them. > > > > I would also suggest to try a newer firmware, 1v2 is rather old. If you > > still happen to have problems, let me know and I'll have another look. > > > > Ironically, things don't work for me anymore currently with the Linux > > master git + sound-2.6. I'm getting XActErrors all over the place, but > > that's most probably not related to the driver itself but some > > regression in the Linux USB stack I believe. Could you try that as well? > > > > Thanks, > > Daniel > > > > After upgrading XMOS firmware to 1v5, although the board is recognized, > it no longer functions with alsa. Also needs to be reset before it is > recognized in Windows. Jup. I believe this is a firmware bug though, but I need to investigate again. Just to make sure you're seeing the same kind of error, could you send me your dmesg output that is produced when the device is plugged in? Thanks, Daniel _______________________________________________ Alsa-devel mailing list Alsa-devel@alsa-project.org http://mailman.alsa-project.org/mailman/listinfo/alsa-devel ^ permalink raw reply [flat|nested] 48+ messages in thread
* Re: usbaudio: Support for USB audio v2.0 devices 2010-05-18 7:40 ` Daniel Mack @ 2010-05-18 8:32 ` adelias 0 siblings, 0 replies; 48+ messages in thread From: adelias @ 2010-05-18 8:32 UTC (permalink / raw) Cc: alsa-devel On 18/5/2010 10:40 πμ, Daniel Mack wrote: > On Tue, May 18, 2010 at 10:07:57AM +0300, adelias wrote: >> On 4/5/2010 1:48 μμ, Daniel Mack wrote: >>> On Mon, May 03, 2010 at 03:49:05PM +0300, adelias wrote: >>>> On 27/4/2010 5:06 μμ, Daniel Mack wrote: >>>>> What specific configuration are you testing with? As you have such an >>>>> evaluation kit, I believe you're also provided with the XMOS development >>>>> platform - which firmware did you install to the board? >>>>> >>>>> Daniel >>>> >>>> Firmware is on 1v2. I'm not getting clicks on OSX 10.6.2 or Windows >>>> 7 with the ASIO driver. >>> >>> Well, at least for OS X 10.6.2, there are problems in the class driver. >>> Do some long-time measurements with inputs and outputs to meet them. >>> >>> I would also suggest to try a newer firmware, 1v2 is rather old. If you >>> still happen to have problems, let me know and I'll have another look. >>> >>> Ironically, things don't work for me anymore currently with the Linux >>> master git + sound-2.6. I'm getting XActErrors all over the place, but >>> that's most probably not related to the driver itself but some >>> regression in the Linux USB stack I believe. Could you try that as well? >>> >>> Thanks, >>> Daniel >>> >> >> After upgrading XMOS firmware to 1v5, although the board is recognized, >> it no longer functions with alsa. Also needs to be reset before it is >> recognized in Windows. > > Jup. I believe this is a firmware bug though, but I need to investigate > again. Just to make sure you're seeing the same kind of error, could you > send me your dmesg output that is produced when the device is plugged > in? > > Thanks, > Daniel Sorry but I have already downgraded the firmware to 1v45 and will be testing with it this afternoon. Might there be anything of value in /var/log/messages? _______________________________________________ Alsa-devel mailing list Alsa-devel@alsa-project.org http://mailman.alsa-project.org/mailman/listinfo/alsa-devel ^ permalink raw reply [flat|nested] 48+ messages in thread
* Re: usbaudio: Support for USB audio v2.0 devices 2010-05-18 7:07 ` adelias 2010-05-18 7:40 ` Daniel Mack @ 2010-05-27 18:21 ` Daniel Mack 1 sibling, 0 replies; 48+ messages in thread From: Daniel Mack @ 2010-05-27 18:21 UTC (permalink / raw) To: adelias; +Cc: alsa-devel On Tue, May 18, 2010 at 10:07:57AM +0300, adelias wrote: > On 4/5/2010 1:48 μμ, Daniel Mack wrote: > >On Mon, May 03, 2010 at 03:49:05PM +0300, adelias wrote: > >>On 27/4/2010 5:06 μμ, Daniel Mack wrote: > >>>What specific configuration are you testing with? As you have such an > >>>evaluation kit, I believe you're also provided with the XMOS development > >>>platform - which firmware did you install to the board? > >>> > >>>Daniel > >> > >>Firmware is on 1v2. I'm not getting clicks on OSX 10.6.2 or Windows > >>7 with the ASIO driver. > > > >Well, at least for OS X 10.6.2, there are problems in the class driver. > >Do some long-time measurements with inputs and outputs to meet them. > > > >I would also suggest to try a newer firmware, 1v2 is rather old. If you > >still happen to have problems, let me know and I'll have another look. > > > >Ironically, things don't work for me anymore currently with the Linux > >master git + sound-2.6. I'm getting XActErrors all over the place, but > >that's most probably not related to the driver itself but some > >regression in the Linux USB stack I believe. Could you try that as well? > > > >Thanks, > >Daniel > > > > After upgrading XMOS firmware to 1v5, although the board is > recognized, it no longer functions with alsa. Also needs to be reset > before it is > recognized in Windows. I fixed this problem now - see my latest email to Takashi. The patch will likely be merged in a few days, but you could also give it a try by applying it manually (see below). And I would still appreciate some testing feedback :) Daniel From 3beee40982b98314f8d58c775cc8b40a8e25ce18 Mon Sep 17 00:00:00 2001 From: Daniel Mack <daniel@caiaq.de> Date: Thu, 27 May 2010 18:28:25 +0200 Subject: [PATCH] ALSA: usb-audio: fix feature unit parser for UAC2 Fix a small off-by-one bug which causes the feature unit to announce a wrong number of channels. This leads to illegal requests sent to the firmware eventually. Signed-off-by: Daniel Mack <daniel@caiaq.de> --- sound/usb/mixer.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c index 97dd176..03ce971 100644 --- a/sound/usb/mixer.c +++ b/sound/usb/mixer.c @@ -1126,7 +1126,7 @@ static int parse_audio_feature_unit(struct mixer_build *state, int unitid, void } else { struct uac2_feature_unit_descriptor *ftr = _ftr; csize = 4; - channels = (hdr->bLength - 6) / 4; + channels = (hdr->bLength - 6) / 4 - 1; bmaControls = ftr->bmaControls; } -- 1.7.1 _______________________________________________ Alsa-devel mailing list Alsa-devel@alsa-project.org http://mailman.alsa-project.org/mailman/listinfo/alsa-devel ^ permalink raw reply related [flat|nested] 48+ messages in thread
end of thread, other threads:[~2010-05-27 18:21 UTC | newest]
Thread overview: 48+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-02-22 22:49 usbaudio: Support for USB audio v2.0 devices Daniel Mack
2010-02-22 22:49 ` [PATCH 1/5] ALSA: usbaudio: parse USB descriptors with structs Daniel Mack
2010-02-23 7:50 ` Clemens Ladisch
2010-02-23 7:57 ` Takashi Iwai
2010-02-23 8:10 ` Daniel Mack
2010-02-23 8:22 ` Takashi Iwai
2010-02-23 8:26 ` Daniel Mack
2010-02-23 9:30 ` [PATCH] usb/gadget/{f_audio, gmidi}.c: follow recent changes in audio.h Daniel Mack
2010-02-23 9:51 ` Takashi Iwai
2010-02-23 10:14 ` Paul Menzel
2010-02-23 10:29 ` Daniel Mack
2010-02-23 11:03 ` Takashi Iwai
2010-02-23 23:31 ` Greg KH
2010-02-23 8:07 ` [PATCH 1/5] ALSA: usbaudio: parse USB descriptors with structs Daniel Mack
2010-02-23 7:56 ` Takashi Iwai
2010-02-22 22:49 ` [PATCH 2/5] ALSA: usbaudio: introduce new types for audio class v2 Daniel Mack
2010-02-22 22:49 ` [PATCH 3/5] ALSA: usbaudio: implement basic set of class v2.0 parser Daniel Mack
2010-02-22 22:49 ` [PATCH 4/5] ALSA: usbmixer: bail out early when parsing audio class v2 descriptors Daniel Mack
2010-02-22 22:49 ` [PATCH 5/5] ALSA: usbaudio: consolidate header files Daniel Mack
2010-02-23 7:58 ` Takashi Iwai
-- strict thread matches above, loose matches on Subject: below --
2010-02-22 16:28 usbaudio: Support for USB audio v2.0 devices Daniel Mack
2010-02-22 17:40 ` Clemens Ladisch
2010-02-22 17:50 ` Daniel Mack
2010-03-02 9:13 ` adelias
2010-03-02 18:35 ` Daniel Mack
2010-04-27 13:23 ` adelias
2010-04-27 13:31 ` The Source
2010-04-27 14:07 ` Daniel Mack
2010-04-27 15:29 ` The Source
2010-04-27 15:43 ` Daniel Mack
2010-04-27 17:27 ` The Source
2010-04-27 17:33 ` Daniel Mack
2010-05-02 16:56 ` The Source
2010-05-03 20:55 ` Daniel Mack
2010-05-07 13:19 ` The Source
2010-05-07 13:22 ` Daniel Mack
2010-05-07 20:12 ` Daniel Mack
2010-05-07 21:32 ` The Source
2010-05-08 1:38 ` Daniel Mack
2010-05-08 7:26 ` The Source
2010-05-08 9:19 ` Daniel Mack
2010-04-27 14:06 ` Daniel Mack
2010-05-03 12:49 ` adelias
2010-05-04 10:48 ` Daniel Mack
2010-05-18 7:07 ` adelias
2010-05-18 7:40 ` Daniel Mack
2010-05-18 8:32 ` adelias
2010-05-27 18:21 ` Daniel Mack
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).