2 * This program is free software; you can redistribute it and/or modify
3 * it under the terms of the GNU General Public License as published by
4 * the Free Software Foundation; either version 2 of the License, or
5 * (at your option) any later version.
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
12 * You should have received a copy of the GNU General Public License
13 * along with this program; if not, write to the Free Software
14 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 #include <linux/init.h>
19 #include <linux/slab.h>
20 #include <linux/usb.h>
21 #include <linux/usb/audio.h>
22 #include <linux/usb/audio-v2.h>
24 #include <sound/core.h>
25 #include <sound/pcm.h>
26 #include <sound/control.h>
27 #include <sound/tlv.h>
43 static void free_substream(struct snd_usb_substream
*subs
)
45 struct audioformat
*fp
, *n
;
47 if (!subs
->num_formats
)
48 return; /* not initialized */
49 list_for_each_entry_safe(fp
, n
, &subs
->fmt_list
, list
) {
50 kfree(fp
->rate_table
);
54 kfree(subs
->rate_list
.list
);
59 * free a usb stream instance
61 static void snd_usb_audio_stream_free(struct snd_usb_stream
*stream
)
63 free_substream(&stream
->substream
[0]);
64 free_substream(&stream
->substream
[1]);
65 list_del(&stream
->list
);
69 static void snd_usb_audio_pcm_free(struct snd_pcm
*pcm
)
71 struct snd_usb_stream
*stream
= pcm
->private_data
;
74 snd_usb_audio_stream_free(stream
);
79 * initialize the substream instance.
82 static void snd_usb_init_substream(struct snd_usb_stream
*as
,
84 struct audioformat
*fp
)
86 struct snd_usb_substream
*subs
= &as
->substream
[stream
];
88 INIT_LIST_HEAD(&subs
->fmt_list
);
89 spin_lock_init(&subs
->lock
);
92 subs
->direction
= stream
;
93 subs
->dev
= as
->chip
->dev
;
94 subs
->txfr_quirk
= as
->chip
->txfr_quirk
;
95 subs
->speed
= snd_usb_get_speed(subs
->dev
);
96 subs
->pkt_offset_adj
= 0;
98 snd_usb_set_pcm_ops(as
->pcm
, stream
);
100 list_add_tail(&fp
->list
, &subs
->fmt_list
);
101 subs
->formats
|= fp
->formats
;
103 subs
->fmt_type
= fp
->fmt_type
;
104 subs
->ep_num
= fp
->endpoint
;
105 if (fp
->channels
> subs
->channels_max
)
106 subs
->channels_max
= fp
->channels
;
109 /* kctl callbacks for usb-audio channel maps */
110 static int usb_chmap_ctl_info(struct snd_kcontrol
*kcontrol
,
111 struct snd_ctl_elem_info
*uinfo
)
113 struct snd_pcm_chmap
*info
= snd_kcontrol_chip(kcontrol
);
114 struct snd_usb_substream
*subs
= info
->private_data
;
116 uinfo
->type
= SNDRV_CTL_ELEM_TYPE_INTEGER
;
117 uinfo
->count
= subs
->channels_max
;
118 uinfo
->value
.integer
.min
= 0;
119 uinfo
->value
.integer
.max
= SNDRV_CHMAP_LAST
;
123 /* check whether a duplicated entry exists in the audiofmt list */
124 static bool have_dup_chmap(struct snd_usb_substream
*subs
,
125 struct audioformat
*fp
)
129 for (p
= fp
->list
.prev
; p
!= &subs
->fmt_list
; p
= p
->prev
) {
130 struct audioformat
*prev
;
131 prev
= list_entry(p
, struct audioformat
, list
);
133 !memcmp(prev
->chmap
, fp
->chmap
, sizeof(*fp
->chmap
)))
139 static int usb_chmap_ctl_tlv(struct snd_kcontrol
*kcontrol
, int op_flag
,
140 unsigned int size
, unsigned int __user
*tlv
)
142 struct snd_pcm_chmap
*info
= snd_kcontrol_chip(kcontrol
);
143 struct snd_usb_substream
*subs
= info
->private_data
;
144 struct audioformat
*fp
;
145 unsigned int __user
*dst
;
150 if (put_user(SNDRV_CTL_TLVT_CONTAINER
, tlv
))
154 list_for_each_entry(fp
, &subs
->fmt_list
, list
) {
159 if (have_dup_chmap(subs
, fp
))
162 ch_bytes
= fp
->chmap
->channels
* 4;
163 if (size
< 8 + ch_bytes
)
165 if (put_user(SNDRV_CTL_TLVT_CHMAP_FIXED
, dst
) ||
166 put_user(ch_bytes
, dst
+ 1))
169 for (i
= 0; i
< fp
->chmap
->channels
; i
++, dst
++) {
170 if (put_user(fp
->chmap
->map
[i
], dst
))
174 count
+= 8 + ch_bytes
;
175 size
-= 8 + ch_bytes
;
177 if (put_user(count
, tlv
+ 1))
182 static int usb_chmap_ctl_get(struct snd_kcontrol
*kcontrol
,
183 struct snd_ctl_elem_value
*ucontrol
)
185 struct snd_pcm_chmap
*info
= snd_kcontrol_chip(kcontrol
);
186 struct snd_usb_substream
*subs
= info
->private_data
;
187 struct snd_pcm_chmap_elem
*chmap
= NULL
;
190 memset(ucontrol
->value
.integer
.value
, 0,
191 sizeof(ucontrol
->value
.integer
.value
));
192 if (subs
->cur_audiofmt
)
193 chmap
= subs
->cur_audiofmt
->chmap
;
195 for (i
= 0; i
< chmap
->channels
; i
++)
196 ucontrol
->value
.integer
.value
[i
] = chmap
->map
[i
];
201 /* create a chmap kctl assigned to the given USB substream */
202 static int add_chmap(struct snd_pcm
*pcm
, int stream
,
203 struct snd_usb_substream
*subs
)
205 struct audioformat
*fp
;
206 struct snd_pcm_chmap
*chmap
;
207 struct snd_kcontrol
*kctl
;
210 list_for_each_entry(fp
, &subs
->fmt_list
, list
)
213 /* no chmap is found */
217 err
= snd_pcm_add_chmap_ctls(pcm
, stream
, NULL
, 0, 0, &chmap
);
221 /* override handlers */
222 chmap
->private_data
= subs
;
224 kctl
->info
= usb_chmap_ctl_info
;
225 kctl
->get
= usb_chmap_ctl_get
;
226 kctl
->tlv
.c
= usb_chmap_ctl_tlv
;
231 /* convert from USB ChannelConfig bits to ALSA chmap element */
232 static struct snd_pcm_chmap_elem
*convert_chmap(int channels
, unsigned int bits
,
235 static unsigned int uac1_maps
[] = {
236 SNDRV_CHMAP_FL
, /* left front */
237 SNDRV_CHMAP_FR
, /* right front */
238 SNDRV_CHMAP_FC
, /* center front */
239 SNDRV_CHMAP_LFE
, /* LFE */
240 SNDRV_CHMAP_SL
, /* left surround */
241 SNDRV_CHMAP_SR
, /* right surround */
242 SNDRV_CHMAP_FLC
, /* left of center */
243 SNDRV_CHMAP_FRC
, /* right of center */
244 SNDRV_CHMAP_RC
, /* surround */
245 SNDRV_CHMAP_SL
, /* side left */
246 SNDRV_CHMAP_SR
, /* side right */
247 SNDRV_CHMAP_TC
, /* top */
250 static unsigned int uac2_maps
[] = {
251 SNDRV_CHMAP_FL
, /* front left */
252 SNDRV_CHMAP_FR
, /* front right */
253 SNDRV_CHMAP_FC
, /* front center */
254 SNDRV_CHMAP_LFE
, /* LFE */
255 SNDRV_CHMAP_RL
, /* back left */
256 SNDRV_CHMAP_RR
, /* back right */
257 SNDRV_CHMAP_FLC
, /* front left of center */
258 SNDRV_CHMAP_FRC
, /* front right of center */
259 SNDRV_CHMAP_RC
, /* back center */
260 SNDRV_CHMAP_SL
, /* side left */
261 SNDRV_CHMAP_SR
, /* side right */
262 SNDRV_CHMAP_TC
, /* top center */
263 SNDRV_CHMAP_TFL
, /* top front left */
264 SNDRV_CHMAP_TFC
, /* top front center */
265 SNDRV_CHMAP_TFR
, /* top front right */
266 SNDRV_CHMAP_TRL
, /* top back left */
267 SNDRV_CHMAP_TRC
, /* top back center */
268 SNDRV_CHMAP_TRR
, /* top back right */
269 SNDRV_CHMAP_TFLC
, /* top front left of center */
270 SNDRV_CHMAP_TFRC
, /* top front right of center */
271 SNDRV_CHMAP_LLFE
, /* left LFE */
272 SNDRV_CHMAP_RLFE
, /* right LFE */
273 SNDRV_CHMAP_TSL
, /* top side left */
274 SNDRV_CHMAP_TSR
, /* top side right */
275 SNDRV_CHMAP_BC
, /* bottom center */
276 SNDRV_CHMAP_RLC
, /* back left of center */
277 SNDRV_CHMAP_RRC
, /* back right of center */
280 struct snd_pcm_chmap_elem
*chmap
;
281 const unsigned int *maps
;
284 if (channels
> ARRAY_SIZE(chmap
->map
))
287 chmap
= kzalloc(sizeof(*chmap
), GFP_KERNEL
);
291 maps
= protocol
== UAC_VERSION_2
? uac2_maps
: uac1_maps
;
292 chmap
->channels
= channels
;
296 for (; bits
&& *maps
; maps
++, bits
>>= 1)
298 chmap
->map
[c
++] = *maps
;
300 /* If we're missing wChannelConfig, then guess something
301 to make sure the channel map is not skipped entirely */
303 chmap
->map
[c
++] = SNDRV_CHMAP_MONO
;
305 for (; c
< channels
&& *maps
; maps
++)
306 chmap
->map
[c
++] = *maps
;
309 for (; c
< channels
; c
++)
310 chmap
->map
[c
] = SNDRV_CHMAP_UNKNOWN
;
316 * add this endpoint to the chip instance.
317 * if a stream with the same endpoint already exists, append to it.
318 * if not, create a new pcm stream.
320 int snd_usb_add_audio_stream(struct snd_usb_audio
*chip
,
322 struct audioformat
*fp
)
324 struct snd_usb_stream
*as
;
325 struct snd_usb_substream
*subs
;
329 list_for_each_entry(as
, &chip
->pcm_list
, list
) {
330 if (as
->fmt_type
!= fp
->fmt_type
)
332 subs
= &as
->substream
[stream
];
333 if (subs
->ep_num
== fp
->endpoint
) {
334 list_add_tail(&fp
->list
, &subs
->fmt_list
);
336 subs
->formats
|= fp
->formats
;
340 /* look for an empty stream */
341 list_for_each_entry(as
, &chip
->pcm_list
, list
) {
342 if (as
->fmt_type
!= fp
->fmt_type
)
344 subs
= &as
->substream
[stream
];
347 err
= snd_pcm_new_stream(as
->pcm
, stream
, 1);
350 snd_usb_init_substream(as
, stream
, fp
);
351 return add_chmap(as
->pcm
, stream
, subs
);
354 /* create a new pcm */
355 as
= kzalloc(sizeof(*as
), GFP_KERNEL
);
358 as
->pcm_index
= chip
->pcm_devs
;
360 as
->fmt_type
= fp
->fmt_type
;
361 err
= snd_pcm_new(chip
->card
, "USB Audio", chip
->pcm_devs
,
362 stream
== SNDRV_PCM_STREAM_PLAYBACK
? 1 : 0,
363 stream
== SNDRV_PCM_STREAM_PLAYBACK
? 0 : 1,
370 pcm
->private_data
= as
;
371 pcm
->private_free
= snd_usb_audio_pcm_free
;
373 if (chip
->pcm_devs
> 0)
374 sprintf(pcm
->name
, "USB Audio #%d", chip
->pcm_devs
);
376 strcpy(pcm
->name
, "USB Audio");
378 snd_usb_init_substream(as
, stream
, fp
);
380 list_add(&as
->list
, &chip
->pcm_list
);
383 snd_usb_proc_pcm_format_add(as
);
385 return add_chmap(pcm
, stream
, &as
->substream
[stream
]);
388 static int parse_uac_endpoint_attributes(struct snd_usb_audio
*chip
,
389 struct usb_host_interface
*alts
,
390 int protocol
, int iface_no
)
392 /* parsed with a v1 header here. that's ok as we only look at the
393 * header first which is the same for both versions */
394 struct uac_iso_endpoint_descriptor
*csep
;
395 struct usb_interface_descriptor
*altsd
= get_iface_desc(alts
);
398 csep
= snd_usb_find_desc(alts
->endpoint
[0].extra
, alts
->endpoint
[0].extralen
, NULL
, USB_DT_CS_ENDPOINT
);
400 /* Creamware Noah has this descriptor after the 2nd endpoint */
401 if (!csep
&& altsd
->bNumEndpoints
>= 2)
402 csep
= snd_usb_find_desc(alts
->endpoint
[1].extra
, alts
->endpoint
[1].extralen
, NULL
, USB_DT_CS_ENDPOINT
);
405 * If we can't locate the USB_DT_CS_ENDPOINT descriptor in the extra
406 * bytes after the first endpoint, go search the entire interface.
407 * Some devices have it directly *before* the standard endpoint.
410 csep
= snd_usb_find_desc(alts
->extra
, alts
->extralen
, NULL
, USB_DT_CS_ENDPOINT
);
412 if (!csep
|| csep
->bLength
< 7 ||
413 csep
->bDescriptorSubtype
!= UAC_EP_GENERAL
) {
414 snd_printk(KERN_WARNING
"%d:%u:%d : no or invalid"
415 " class specific endpoint descriptor\n",
416 chip
->dev
->devnum
, iface_no
,
417 altsd
->bAlternateSetting
);
421 if (protocol
== UAC_VERSION_1
) {
422 attributes
= csep
->bmAttributes
;
424 struct uac2_iso_endpoint_descriptor
*csep2
=
425 (struct uac2_iso_endpoint_descriptor
*) csep
;
427 attributes
= csep
->bmAttributes
& UAC_EP_CS_ATTR_FILL_MAX
;
429 /* emulate the endpoint attributes of a v1 device */
430 if (csep2
->bmControls
& UAC2_CONTROL_PITCH
)
431 attributes
|= UAC_EP_CS_ATTR_PITCH_CONTROL
;
437 /* find an input terminal descriptor (either UAC1 or UAC2) with the given
441 snd_usb_find_input_terminal_descriptor(struct usb_host_interface
*ctrl_iface
,
444 struct uac2_input_terminal_descriptor
*term
= NULL
;
446 while ((term
= snd_usb_find_csint_desc(ctrl_iface
->extra
,
447 ctrl_iface
->extralen
,
448 term
, UAC_INPUT_TERMINAL
))) {
449 if (term
->bTerminalID
== terminal_id
)
456 static struct uac2_output_terminal_descriptor
*
457 snd_usb_find_output_terminal_descriptor(struct usb_host_interface
*ctrl_iface
,
460 struct uac2_output_terminal_descriptor
*term
= NULL
;
462 while ((term
= snd_usb_find_csint_desc(ctrl_iface
->extra
,
463 ctrl_iface
->extralen
,
464 term
, UAC_OUTPUT_TERMINAL
))) {
465 if (term
->bTerminalID
== terminal_id
)
472 int snd_usb_parse_audio_interface(struct snd_usb_audio
*chip
, int iface_no
)
474 struct usb_device
*dev
;
475 struct usb_interface
*iface
;
476 struct usb_host_interface
*alts
;
477 struct usb_interface_descriptor
*altsd
;
478 int i
, altno
, err
, stream
;
479 unsigned int format
= 0, num_channels
= 0;
480 struct audioformat
*fp
= NULL
;
481 int num
, protocol
, clock
= 0;
482 struct uac_format_type_i_continuous_descriptor
*fmt
;
483 unsigned int chconfig
;
487 /* parse the interface's altsettings */
488 iface
= usb_ifnum_to_if(dev
, iface_no
);
490 num
= iface
->num_altsetting
;
493 * Dallas DS4201 workaround: It presents 5 altsettings, but the last
494 * one misses syncpipe, and does not produce any sound.
496 if (chip
->usb_id
== USB_ID(0x04fa, 0x4201))
499 for (i
= 0; i
< num
; i
++) {
500 alts
= &iface
->altsetting
[i
];
501 altsd
= get_iface_desc(alts
);
502 protocol
= altsd
->bInterfaceProtocol
;
503 /* skip invalid one */
504 if (((altsd
->bInterfaceClass
!= USB_CLASS_AUDIO
||
505 (altsd
->bInterfaceSubClass
!= USB_SUBCLASS_AUDIOSTREAMING
&&
506 altsd
->bInterfaceSubClass
!= USB_SUBCLASS_VENDOR_SPEC
)) &&
507 altsd
->bInterfaceClass
!= USB_CLASS_VENDOR_SPEC
) ||
508 altsd
->bNumEndpoints
< 1 ||
509 le16_to_cpu(get_endpoint(alts
, 0)->wMaxPacketSize
) == 0)
511 /* must be isochronous */
512 if ((get_endpoint(alts
, 0)->bmAttributes
& USB_ENDPOINT_XFERTYPE_MASK
) !=
513 USB_ENDPOINT_XFER_ISOC
)
515 /* check direction */
516 stream
= (get_endpoint(alts
, 0)->bEndpointAddress
& USB_DIR_IN
) ?
517 SNDRV_PCM_STREAM_CAPTURE
: SNDRV_PCM_STREAM_PLAYBACK
;
518 altno
= altsd
->bAlternateSetting
;
520 if (snd_usb_apply_interface_quirk(chip
, iface_no
, altno
))
524 * Roland audio streaming interfaces are marked with protocols
525 * 0/1/2, but are UAC 1 compatible.
527 if (USB_ID_VENDOR(chip
->usb_id
) == 0x0582 &&
528 altsd
->bInterfaceClass
== USB_CLASS_VENDOR_SPEC
&&
530 protocol
= UAC_VERSION_1
;
533 /* get audio formats */
536 snd_printdd(KERN_WARNING
"%d:%u:%d: unknown interface protocol %#02x, assuming v1\n",
537 dev
->devnum
, iface_no
, altno
, protocol
);
538 protocol
= UAC_VERSION_1
;
541 case UAC_VERSION_1
: {
542 struct uac1_as_header_descriptor
*as
=
543 snd_usb_find_csint_desc(alts
->extra
, alts
->extralen
, NULL
, UAC_AS_GENERAL
);
544 struct uac_input_terminal_descriptor
*iterm
;
547 snd_printk(KERN_ERR
"%d:%u:%d : UAC_AS_GENERAL descriptor not found\n",
548 dev
->devnum
, iface_no
, altno
);
552 if (as
->bLength
< sizeof(*as
)) {
553 snd_printk(KERN_ERR
"%d:%u:%d : invalid UAC_AS_GENERAL desc\n",
554 dev
->devnum
, iface_no
, altno
);
558 format
= le16_to_cpu(as
->wFormatTag
); /* remember the format value */
560 iterm
= snd_usb_find_input_terminal_descriptor(chip
->ctrl_intf
,
563 num_channels
= iterm
->bNrChannels
;
564 chconfig
= le16_to_cpu(iterm
->wChannelConfig
);
570 case UAC_VERSION_2
: {
571 struct uac2_input_terminal_descriptor
*input_term
;
572 struct uac2_output_terminal_descriptor
*output_term
;
573 struct uac2_as_header_descriptor
*as
=
574 snd_usb_find_csint_desc(alts
->extra
, alts
->extralen
, NULL
, UAC_AS_GENERAL
);
577 snd_printk(KERN_ERR
"%d:%u:%d : UAC_AS_GENERAL descriptor not found\n",
578 dev
->devnum
, iface_no
, altno
);
582 if (as
->bLength
< sizeof(*as
)) {
583 snd_printk(KERN_ERR
"%d:%u:%d : invalid UAC_AS_GENERAL desc\n",
584 dev
->devnum
, iface_no
, altno
);
588 num_channels
= as
->bNrChannels
;
589 format
= le32_to_cpu(as
->bmFormats
);
590 chconfig
= le32_to_cpu(as
->bmChannelConfig
);
592 /* lookup the terminal associated to this interface
593 * to extract the clock */
594 input_term
= snd_usb_find_input_terminal_descriptor(chip
->ctrl_intf
,
597 clock
= input_term
->bCSourceID
;
598 if (!chconfig
&& (num_channels
== input_term
->bNrChannels
))
599 chconfig
= le32_to_cpu(input_term
->bmChannelConfig
);
603 output_term
= snd_usb_find_output_terminal_descriptor(chip
->ctrl_intf
,
606 clock
= output_term
->bCSourceID
;
610 snd_printk(KERN_ERR
"%d:%u:%d : bogus bTerminalLink %d\n",
611 dev
->devnum
, iface_no
, altno
, as
->bTerminalLink
);
616 /* get format type */
617 fmt
= snd_usb_find_csint_desc(alts
->extra
, alts
->extralen
, NULL
, UAC_FORMAT_TYPE
);
619 snd_printk(KERN_ERR
"%d:%u:%d : no UAC_FORMAT_TYPE desc\n",
620 dev
->devnum
, iface_no
, altno
);
623 if (((protocol
== UAC_VERSION_1
) && (fmt
->bLength
< 8)) ||
624 ((protocol
== UAC_VERSION_2
) && (fmt
->bLength
< 6))) {
625 snd_printk(KERN_ERR
"%d:%u:%d : invalid UAC_FORMAT_TYPE desc\n",
626 dev
->devnum
, iface_no
, altno
);
631 * Blue Microphones workaround: The last altsetting is identical
632 * with the previous one, except for a larger packet size, but
633 * is actually a mislabeled two-channel setting; ignore it.
635 if (fmt
->bNrChannels
== 1 &&
636 fmt
->bSubframeSize
== 2 &&
637 altno
== 2 && num
== 3 &&
638 fp
&& fp
->altsetting
== 1 && fp
->channels
== 1 &&
639 fp
->formats
== SNDRV_PCM_FMTBIT_S16_LE
&&
640 protocol
== UAC_VERSION_1
&&
641 le16_to_cpu(get_endpoint(alts
, 0)->wMaxPacketSize
) ==
645 fp
= kzalloc(sizeof(*fp
), GFP_KERNEL
);
647 snd_printk(KERN_ERR
"cannot malloc\n");
651 fp
->iface
= iface_no
;
652 fp
->altsetting
= altno
;
654 fp
->endpoint
= get_endpoint(alts
, 0)->bEndpointAddress
;
655 fp
->ep_attr
= get_endpoint(alts
, 0)->bmAttributes
;
656 fp
->datainterval
= snd_usb_parse_datainterval(chip
, alts
);
657 fp
->protocol
= protocol
;
658 fp
->maxpacksize
= le16_to_cpu(get_endpoint(alts
, 0)->wMaxPacketSize
);
659 fp
->channels
= num_channels
;
660 if (snd_usb_get_speed(dev
) == USB_SPEED_HIGH
)
661 fp
->maxpacksize
= (((fp
->maxpacksize
>> 11) & 3) + 1)
662 * (fp
->maxpacksize
& 0x7ff);
663 fp
->attributes
= parse_uac_endpoint_attributes(chip
, alts
, protocol
, iface_no
);
666 /* some quirks for attributes here */
668 switch (chip
->usb_id
) {
669 case USB_ID(0x0a92, 0x0053): /* AudioTrak Optoplay */
670 /* Optoplay sets the sample rate attribute although
671 * it seems not supporting it in fact.
673 fp
->attributes
&= ~UAC_EP_CS_ATTR_SAMPLE_RATE
;
675 case USB_ID(0x041e, 0x3020): /* Creative SB Audigy 2 NX */
676 case USB_ID(0x0763, 0x2003): /* M-Audio Audiophile USB */
677 /* doesn't set the sample rate attribute, but supports it */
678 fp
->attributes
|= UAC_EP_CS_ATTR_SAMPLE_RATE
;
680 case USB_ID(0x0763, 0x2001): /* M-Audio Quattro USB */
681 case USB_ID(0x0763, 0x2012): /* M-Audio Fast Track Pro USB */
682 case USB_ID(0x047f, 0x0ca1): /* plantronics headset */
683 case USB_ID(0x077d, 0x07af): /* Griffin iMic (note that there is
684 an older model 77d:223) */
686 * plantronics headset and Griffin iMic have set adaptive-in
687 * although it's really not...
689 fp
->ep_attr
&= ~USB_ENDPOINT_SYNCTYPE
;
690 if (stream
== SNDRV_PCM_STREAM_PLAYBACK
)
691 fp
->ep_attr
|= USB_ENDPOINT_SYNC_ADAPTIVE
;
693 fp
->ep_attr
|= USB_ENDPOINT_SYNC_SYNC
;
697 /* ok, let's parse further... */
698 if (snd_usb_parse_audio_format(chip
, fp
, format
, fmt
, stream
) < 0) {
699 kfree(fp
->rate_table
);
706 if (fp
->channels
!= num_channels
)
708 fp
->chmap
= convert_chmap(fp
->channels
, chconfig
, protocol
);
710 snd_printdd(KERN_INFO
"%d:%u:%d: add audio endpoint %#x\n", dev
->devnum
, iface_no
, altno
, fp
->endpoint
);
711 err
= snd_usb_add_audio_stream(chip
, stream
, fp
);
713 kfree(fp
->rate_table
);
718 /* try to set the interface... */
719 usb_set_interface(chip
->dev
, iface_no
, altno
);
720 snd_usb_init_pitch(chip
, iface_no
, alts
, fp
);
721 snd_usb_init_sample_rate(chip
, iface_no
, alts
, fp
, fp
->rate_max
);