Blame view

sound/usb/format.c 14.8 KB
e5779998b   Daniel Mack   ALSA: usb-audio: ...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  /*
   *   This program is free software; you can redistribute it and/or modify
   *   it under the terms of the GNU General Public License as published by
   *   the Free Software Foundation; either version 2 of the License, or
   *   (at your option) any later version.
   *
   *   This program is distributed in the hope that it will be useful,
   *   but WITHOUT ANY WARRANTY; without even the implied warranty of
   *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   *   GNU General Public License for more details.
   *
   *   You should have received a copy of the GNU General Public License
   *   along with this program; if not, write to the Free Software
   *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
   *
   */
  
  #include <linux/init.h>
36db04565   Stephen Rothwell   ALSA: usb - use o...
19
  #include <linux/slab.h>
e5779998b   Daniel Mack   ALSA: usb-audio: ...
20
21
  #include <linux/usb.h>
  #include <linux/usb/audio.h>
7e8478940   Daniel Mack   linux/usb/audio.h...
22
  #include <linux/usb/audio-v2.h>
e5779998b   Daniel Mack   ALSA: usb-audio: ...
23
24
25
26
27
28
29
30
31
  
  #include <sound/core.h>
  #include <sound/pcm.h>
  
  #include "usbaudio.h"
  #include "card.h"
  #include "quirks.h"
  #include "helper.h"
  #include "debug.h"
79f920fbf   Daniel Mack   ALSA: usb-audio: ...
32
  #include "clock.h"
ee95cb612   Daniel Mack   ALSA: usb-audio: ...
33
  #include "format.h"
e5779998b   Daniel Mack   ALSA: usb-audio: ...
34
35
36
37
38
39
40
41
42
43
  
  /*
   * parse the audio format type I descriptor
   * and returns the corresponding pcm format
   *
   * @dev: usb device
   * @fp: audioformat record
   * @format: the format tag (wFormatTag)
   * @fmt: the format type descriptor
   */
29088fef3   Clemens Ladisch   ALSA: usb-audio: ...
44
  static u64 parse_audio_format_i_type(struct snd_usb_audio *chip,
e5779998b   Daniel Mack   ALSA: usb-audio: ...
45
46
47
48
  				     struct audioformat *fp,
  				     int format, void *_fmt,
  				     int protocol)
  {
e5779998b   Daniel Mack   ALSA: usb-audio: ...
49
  	int sample_width, sample_bytes;
29088fef3   Clemens Ladisch   ALSA: usb-audio: ...
50
  	u64 pcm_formats;
e5779998b   Daniel Mack   ALSA: usb-audio: ...
51
52
  
  	switch (protocol) {
a2acad829   Clemens Ladisch   ALSA: usb-audio: ...
53
54
  	case UAC_VERSION_1:
  	default: {
e5779998b   Daniel Mack   ALSA: usb-audio: ...
55
56
57
  		struct uac_format_type_i_discrete_descriptor *fmt = _fmt;
  		sample_width = fmt->bBitResolution;
  		sample_bytes = fmt->bSubframeSize;
29088fef3   Clemens Ladisch   ALSA: usb-audio: ...
58
  		format = 1 << format;
e5779998b   Daniel Mack   ALSA: usb-audio: ...
59
60
61
62
63
64
65
  		break;
  	}
  
  	case UAC_VERSION_2: {
  		struct uac_format_type_i_ext_descriptor *fmt = _fmt;
  		sample_width = fmt->bBitResolution;
  		sample_bytes = fmt->bSubslotSize;
29088fef3   Clemens Ladisch   ALSA: usb-audio: ...
66
  		format <<= 1;
e5779998b   Daniel Mack   ALSA: usb-audio: ...
67
68
  		break;
  	}
e5779998b   Daniel Mack   ALSA: usb-audio: ...
69
  	}
29088fef3   Clemens Ladisch   ALSA: usb-audio: ...
70
  	pcm_formats = 0;
e5779998b   Daniel Mack   ALSA: usb-audio: ...
71

29088fef3   Clemens Ladisch   ALSA: usb-audio: ...
72
73
  	if (format == 0 || format == (1 << UAC_FORMAT_TYPE_I_UNDEFINED)) {
  		/* some devices don't define this correctly... */
e5779998b   Daniel Mack   ALSA: usb-audio: ...
74
75
76
  		snd_printdd(KERN_INFO "%d:%u:%d : format type 0 is detected, processed as PCM
  ",
  			    chip->dev->devnum, fp->iface, fp->altsetting);
29088fef3   Clemens Ladisch   ALSA: usb-audio: ...
77
78
79
  		format = 1 << UAC_FORMAT_TYPE_I_PCM;
  	}
  	if (format & (1 << UAC_FORMAT_TYPE_I_PCM)) {
061b869ec   Clemens Ladisch   ALSA: usb-audio: ...
80
81
82
83
  		if (chip->usb_id == USB_ID(0x0582, 0x0016) /* Edirol SD-90 */ &&
  		    sample_width == 24 && sample_bytes == 2)
  			sample_bytes = 3;
  		else if (sample_width > sample_bytes * 8) {
e5779998b   Daniel Mack   ALSA: usb-audio: ...
84
85
86
87
88
89
90
91
  			snd_printk(KERN_INFO "%d:%u:%d : sample bitwidth %d in over sample bytes %d
  ",
  				   chip->dev->devnum, fp->iface, fp->altsetting,
  				   sample_width, sample_bytes);
  		}
  		/* check the format byte size */
  		switch (sample_bytes) {
  		case 1:
29088fef3   Clemens Ladisch   ALSA: usb-audio: ...
92
  			pcm_formats |= SNDRV_PCM_FMTBIT_S8;
e5779998b   Daniel Mack   ALSA: usb-audio: ...
93
94
95
  			break;
  		case 2:
  			if (snd_usb_is_big_endian_format(chip, fp))
29088fef3   Clemens Ladisch   ALSA: usb-audio: ...
96
  				pcm_formats |= SNDRV_PCM_FMTBIT_S16_BE; /* grrr, big endian!! */
e5779998b   Daniel Mack   ALSA: usb-audio: ...
97
  			else
29088fef3   Clemens Ladisch   ALSA: usb-audio: ...
98
  				pcm_formats |= SNDRV_PCM_FMTBIT_S16_LE;
e5779998b   Daniel Mack   ALSA: usb-audio: ...
99
100
101
  			break;
  		case 3:
  			if (snd_usb_is_big_endian_format(chip, fp))
29088fef3   Clemens Ladisch   ALSA: usb-audio: ...
102
  				pcm_formats |= SNDRV_PCM_FMTBIT_S24_3BE; /* grrr, big endian!! */
e5779998b   Daniel Mack   ALSA: usb-audio: ...
103
  			else
29088fef3   Clemens Ladisch   ALSA: usb-audio: ...
104
  				pcm_formats |= SNDRV_PCM_FMTBIT_S24_3LE;
e5779998b   Daniel Mack   ALSA: usb-audio: ...
105
106
  			break;
  		case 4:
29088fef3   Clemens Ladisch   ALSA: usb-audio: ...
107
  			pcm_formats |= SNDRV_PCM_FMTBIT_S32_LE;
e5779998b   Daniel Mack   ALSA: usb-audio: ...
108
109
110
111
112
113
114
115
  			break;
  		default:
  			snd_printk(KERN_INFO "%d:%u:%d : unsupported sample bitwidth %d in %d bytes
  ",
  				   chip->dev->devnum, fp->iface, fp->altsetting,
  				   sample_width, sample_bytes);
  			break;
  		}
29088fef3   Clemens Ladisch   ALSA: usb-audio: ...
116
117
  	}
  	if (format & (1 << UAC_FORMAT_TYPE_I_PCM8)) {
e5779998b   Daniel Mack   ALSA: usb-audio: ...
118
119
120
  		/* Dallas DS4201 workaround: it advertises U8 format, but really
  		   supports S8. */
  		if (chip->usb_id == USB_ID(0x04fa, 0x4201))
29088fef3   Clemens Ladisch   ALSA: usb-audio: ...
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
  			pcm_formats |= SNDRV_PCM_FMTBIT_S8;
  		else
  			pcm_formats |= SNDRV_PCM_FMTBIT_U8;
  	}
  	if (format & (1 << UAC_FORMAT_TYPE_I_IEEE_FLOAT)) {
  		pcm_formats |= SNDRV_PCM_FMTBIT_FLOAT_LE;
  	}
  	if (format & (1 << UAC_FORMAT_TYPE_I_ALAW)) {
  		pcm_formats |= SNDRV_PCM_FMTBIT_A_LAW;
  	}
  	if (format & (1 << UAC_FORMAT_TYPE_I_MULAW)) {
  		pcm_formats |= SNDRV_PCM_FMTBIT_MU_LAW;
  	}
  	if (format & ~0x3f) {
  		snd_printk(KERN_INFO "%d:%u:%d : unsupported format bits %#x
  ",
e5779998b   Daniel Mack   ALSA: usb-audio: ...
137
  			   chip->dev->devnum, fp->iface, fp->altsetting, format);
e5779998b   Daniel Mack   ALSA: usb-audio: ...
138
  	}
29088fef3   Clemens Ladisch   ALSA: usb-audio: ...
139
  	return pcm_formats;
e5779998b   Daniel Mack   ALSA: usb-audio: ...
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
  }
  
  
  /*
   * parse the format descriptor and stores the possible sample rates
   * on the audioformat table (audio class v1).
   *
   * @dev: usb device
   * @fp: audioformat record
   * @fmt: the format descriptor
   * @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_v1(struct snd_usb_audio *chip, struct audioformat *fp,
  				       unsigned char *fmt, int offset)
  {
  	int nr_rates = fmt[offset];
  
  	if (fmt[0] < offset + 1 + 3 * (nr_rates ? nr_rates : 2)) {
  		snd_printk(KERN_ERR "%d:%u:%d : invalid UAC_FORMAT_TYPE desc
  ",
  				   chip->dev->devnum, fp->iface, fp->altsetting);
  		return -1;
  	}
  
  	if (nr_rates) {
  		/*
  		 * build the rate table and bitmap flags
  		 */
  		int r, idx;
  
  		fp->rate_table = kmalloc(sizeof(int) * nr_rates, GFP_KERNEL);
  		if (fp->rate_table == NULL) {
  			snd_printk(KERN_ERR "cannot malloc
  ");
  			return -1;
  		}
  
  		fp->nr_rates = 0;
  		fp->rate_min = fp->rate_max = 0;
  		for (r = 0, idx = offset + 1; r < nr_rates; r++, idx += 3) {
  			unsigned int rate = combine_triple(&fmt[idx]);
  			if (!rate)
  				continue;
  			/* C-Media CM6501 mislabels its 96 kHz altsetting */
8129e79ed   Wolfgang Breyha   ALSA: usb-audio -...
185
  			/* Terratec Aureon 7.1 USB C-Media 6206, too */
e5779998b   Daniel Mack   ALSA: usb-audio: ...
186
187
  			if (rate == 48000 && nr_rates == 1 &&
  			    (chip->usb_id == USB_ID(0x0d8c, 0x0201) ||
8129e79ed   Wolfgang Breyha   ALSA: usb-audio -...
188
189
  			     chip->usb_id == USB_ID(0x0d8c, 0x0102) ||
  			     chip->usb_id == USB_ID(0x0ccd, 0x00b1)) &&
e5779998b   Daniel Mack   ALSA: usb-audio: ...
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
  			    fp->altsetting == 5 && fp->maxpacksize == 392)
  				rate = 96000;
  			/* Creative VF0470 Live Cam reports 16 kHz instead of 8kHz */
  			if (rate == 16000 && chip->usb_id == USB_ID(0x041e, 0x4068))
  				rate = 8000;
  
  			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++;
  		}
  		if (!fp->nr_rates) {
  			hwc_debug("All rates were zero. Skipping format!
  ");
  			return -1;
  		}
  	} else {
  		/* continuous rates */
  		fp->rates = SNDRV_PCM_RATE_CONTINUOUS;
  		fp->rate_min = combine_triple(&fmt[offset + 1]);
  		fp->rate_max = combine_triple(&fmt[offset + 4]);
  	}
  	return 0;
  }
4fa0e81b8   Xi Wang   ALSA: usb-audio: ...
217
  #define MAX_UAC2_NR_RATES 1024
e5779998b   Daniel Mack   ALSA: usb-audio: ...
218
  /*
67c103664   Daniel Mack   ALSA: usb-audio: ...
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
   * Helper function to walk the array of sample rate triplets reported by
   * the device. The problem is that we need to parse whole array first to
   * get to know how many sample rates we have to expect.
   * Then fp->rate_table can be allocated and filled.
   */
  static int parse_uac2_sample_rate_range(struct audioformat *fp, int nr_triplets,
  					const unsigned char *data)
  {
  	int i, nr_rates = 0;
  
  	fp->rates = fp->rate_min = fp->rate_max = 0;
  
  	for (i = 0; i < nr_triplets; i++) {
  		int min = combine_quad(&data[2 + 12 * i]);
  		int max = combine_quad(&data[6 + 12 * i]);
  		int res = combine_quad(&data[10 + 12 * i]);
4fa0e81b8   Xi Wang   ALSA: usb-audio: ...
235
  		unsigned int rate;
67c103664   Daniel Mack   ALSA: usb-audio: ...
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
  
  		if ((max < 0) || (min < 0) || (res < 0) || (max < min))
  			continue;
  
  		/*
  		 * for ranges with res == 1, we announce a continuous sample
  		 * rate range, and this function should return 0 for no further
  		 * parsing.
  		 */
  		if (res == 1) {
  			fp->rate_min = min;
  			fp->rate_max = max;
  			fp->rates = SNDRV_PCM_RATE_CONTINUOUS;
  			return 0;
  		}
  
  		for (rate = min; rate <= max; rate += res) {
  			if (fp->rate_table)
  				fp->rate_table[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);
  
  			nr_rates++;
4fa0e81b8   Xi Wang   ALSA: usb-audio: ...
262
263
264
265
266
  			if (nr_rates >= MAX_UAC2_NR_RATES) {
  				snd_printk(KERN_ERR "invalid uac2 rates
  ");
  				break;
  			}
67c103664   Daniel Mack   ALSA: usb-audio: ...
267
268
269
270
271
272
273
274
275
276
277
  
  			/* avoid endless loop */
  			if (res == 0)
  				break;
  		}
  	}
  
  	return nr_rates;
  }
  
  /*
e5779998b   Daniel Mack   ALSA: usb-audio: ...
278
279
280
281
   * 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,
3d8d4dcfd   Daniel Mack   ALSA: usb-audio: ...
282
  				       struct audioformat *fp)
e5779998b   Daniel Mack   ALSA: usb-audio: ...
283
284
285
  {
  	struct usb_device *dev = chip->dev;
  	unsigned char tmp[2], *data;
67c103664   Daniel Mack   ALSA: usb-audio: ...
286
  	int nr_triplets, data_size, ret = 0;
3d8d4dcfd   Daniel Mack   ALSA: usb-audio: ...
287
  	int clock = snd_usb_clock_find_source(chip, fp->clock);
e5779998b   Daniel Mack   ALSA: usb-audio: ...
288

d07140ba7   Daniel Mack   ALSA: usb-audio: ...
289
290
291
292
293
294
  	if (clock < 0) {
  		snd_printk(KERN_ERR "%s(): unable to find clock source (clock %d)
  ",
  				__func__, clock);
  		goto err;
  	}
e5779998b   Daniel Mack   ALSA: usb-audio: ...
295
296
297
  	/* get the number of sample rates first by only fetching 2 bytes */
  	ret = snd_usb_ctl_msg(dev, usb_rcvctrlpipe(dev, 0), UAC2_CS_RANGE,
  			      USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_IN,
11bcbc443   Daniel Mack   ALSA: usb-audio: ...
298
299
  			      UAC2_CS_CONTROL_SAM_FREQ << 8,
  			      snd_usb_ctrl_intf(chip) | (clock << 8),
17d900c4a   Clemens Ladisch   ALSA: usb-audio: ...
300
  			      tmp, sizeof(tmp));
e5779998b   Daniel Mack   ALSA: usb-audio: ...
301
302
  
  	if (ret < 0) {
79f920fbf   Daniel Mack   ALSA: usb-audio: ...
303
304
305
  		snd_printk(KERN_ERR "%s(): unable to retrieve number of sample rates (clock %d)
  ",
  				__func__, clock);
e5779998b   Daniel Mack   ALSA: usb-audio: ...
306
307
  		goto err;
  	}
67c103664   Daniel Mack   ALSA: usb-audio: ...
308
309
  	nr_triplets = (tmp[1] << 8) | tmp[0];
  	data_size = 2 + 12 * nr_triplets;
e5779998b   Daniel Mack   ALSA: usb-audio: ...
310
311
312
313
314
315
316
317
  	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), UAC2_CS_RANGE,
79f920fbf   Daniel Mack   ALSA: usb-audio: ...
318
  			      USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_IN,
11bcbc443   Daniel Mack   ALSA: usb-audio: ...
319
320
  			      UAC2_CS_CONTROL_SAM_FREQ << 8,
  			      snd_usb_ctrl_intf(chip) | (clock << 8),
17d900c4a   Clemens Ladisch   ALSA: usb-audio: ...
321
  			      data, data_size);
e5779998b   Daniel Mack   ALSA: usb-audio: ...
322
323
  
  	if (ret < 0) {
79f920fbf   Daniel Mack   ALSA: usb-audio: ...
324
325
326
  		snd_printk(KERN_ERR "%s(): unable to retrieve sample rate range (clock %d)
  ",
  				__func__, clock);
e5779998b   Daniel Mack   ALSA: usb-audio: ...
327
328
329
  		ret = -EINVAL;
  		goto err_free;
  	}
67c103664   Daniel Mack   ALSA: usb-audio: ...
330
331
332
333
334
335
336
337
338
339
340
341
342
343
  	/* Call the triplet parser, and make sure fp->rate_table is NULL.
  	 * We just use the return value to know how many sample rates we
  	 * will have to deal with. */
  	kfree(fp->rate_table);
  	fp->rate_table = NULL;
  	fp->nr_rates = parse_uac2_sample_rate_range(fp, nr_triplets, data);
  
  	if (fp->nr_rates == 0) {
  		/* SNDRV_PCM_RATE_CONTINUOUS */
  		ret = 0;
  		goto err_free;
  	}
  
  	fp->rate_table = kmalloc(sizeof(int) * fp->nr_rates, GFP_KERNEL);
e5779998b   Daniel Mack   ALSA: usb-audio: ...
344
345
346
347
  	if (!fp->rate_table) {
  		ret = -ENOMEM;
  		goto err_free;
  	}
67c103664   Daniel Mack   ALSA: usb-audio: ...
348
349
350
  	/* Call the triplet parser again, but this time, fp->rate_table is
  	 * allocated, so the rates will be stored */
  	parse_uac2_sample_rate_range(fp, nr_triplets, data);
e5779998b   Daniel Mack   ALSA: usb-audio: ...
351
352
353
354
355
356
357
358
359
360
361
  
  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,
74754f974   Daniel Mack   ALSA: usb-audio: ...
362
363
  				struct audioformat *fp, int format,
  				struct uac_format_type_i_continuous_descriptor *fmt,
e5779998b   Daniel Mack   ALSA: usb-audio: ...
364
365
366
  				struct usb_host_interface *iface)
  {
  	struct usb_interface_descriptor *altsd = get_iface_desc(iface);
e5779998b   Daniel Mack   ALSA: usb-audio: ...
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
  	int protocol = altsd->bInterfaceProtocol;
  	int pcm_format, ret;
  
  	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...
  		 */
  		switch (chip->usb_id) {
  
  		case USB_ID(0x0763, 0x2003): /* M-Audio Audiophile USB */
  			if (chip->setup == 0x00 && 
  			    fp->altsetting == 6)
  				pcm_format = SNDRV_PCM_FORMAT_S16_BE;
  			else
  				pcm_format = SNDRV_PCM_FORMAT_S16_LE;
  			break;
  		default:
  			pcm_format = SNDRV_PCM_FORMAT_S16_LE;
  		}
29088fef3   Clemens Ladisch   ALSA: usb-audio: ...
387
  		fp->formats = 1uLL << pcm_format;
e5779998b   Daniel Mack   ALSA: usb-audio: ...
388
  	} else {
29088fef3   Clemens Ladisch   ALSA: usb-audio: ...
389
390
391
  		fp->formats = parse_audio_format_i_type(chip, fp, format,
  							fmt, protocol);
  		if (!fp->formats)
e5779998b   Daniel Mack   ALSA: usb-audio: ...
392
393
  			return -1;
  	}
e5779998b   Daniel Mack   ALSA: usb-audio: ...
394
395
396
397
398
399
  	/* 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) {
a2acad829   Clemens Ladisch   ALSA: usb-audio: ...
400
401
402
403
404
  	default:
  		snd_printdd(KERN_WARNING "%d:%u:%d : invalid protocol version %d, assuming v1
  ",
  			   chip->dev->devnum, fp->iface, fp->altsetting, protocol);
  		/* fall through */
e5779998b   Daniel Mack   ALSA: usb-audio: ...
405
406
  	case UAC_VERSION_1:
  		fp->channels = fmt->bNrChannels;
74754f974   Daniel Mack   ALSA: usb-audio: ...
407
  		ret = parse_audio_format_rates_v1(chip, fp, (unsigned char *) fmt, 7);
e5779998b   Daniel Mack   ALSA: usb-audio: ...
408
409
410
  		break;
  	case UAC_VERSION_2:
  		/* fp->channels is already set in this case */
3d8d4dcfd   Daniel Mack   ALSA: usb-audio: ...
411
  		ret = parse_audio_format_rates_v2(chip, fp);
e5779998b   Daniel Mack   ALSA: usb-audio: ...
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
  		break;
  	}
  
  	if (fp->channels < 1) {
  		snd_printk(KERN_ERR "%d:%u:%d : invalid channels %d
  ",
  			   chip->dev->devnum, fp->iface, fp->altsetting, fp->channels);
  		return -1;
  	}
  
  	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,
  				 struct usb_host_interface *iface)
  {
  	int brate, framesize, ret;
  	struct usb_interface_descriptor *altsd = get_iface_desc(iface);
  	int protocol = altsd->bInterfaceProtocol;
  
  	switch (format) {
  	case UAC_FORMAT_TYPE_II_AC3:
  		/* FIXME: there is no AC3 format defined yet */
015eb0b08   Clemens Ladisch   ALSA: usb-audio: ...
440
441
  		// fp->formats = SNDRV_PCM_FMTBIT_AC3;
  		fp->formats = SNDRV_PCM_FMTBIT_U8; /* temporary hack to receive byte streams */
e5779998b   Daniel Mack   ALSA: usb-audio: ...
442
443
  		break;
  	case UAC_FORMAT_TYPE_II_MPEG:
015eb0b08   Clemens Ladisch   ALSA: usb-audio: ...
444
  		fp->formats = SNDRV_PCM_FMTBIT_MPEG;
e5779998b   Daniel Mack   ALSA: usb-audio: ...
445
446
447
448
449
  		break;
  	default:
  		snd_printd(KERN_INFO "%d:%u:%d : unknown format tag %#x is detected.  processed as MPEG.
  ",
  			   chip->dev->devnum, fp->iface, fp->altsetting, format);
015eb0b08   Clemens Ladisch   ALSA: usb-audio: ...
450
  		fp->formats = SNDRV_PCM_FMTBIT_MPEG;
e5779998b   Daniel Mack   ALSA: usb-audio: ...
451
452
453
454
455
456
  		break;
  	}
  
  	fp->channels = 1;
  
  	switch (protocol) {
a2acad829   Clemens Ladisch   ALSA: usb-audio: ...
457
458
459
460
461
  	default:
  		snd_printdd(KERN_WARNING "%d:%u:%d : invalid protocol version %d, assuming v1
  ",
  			   chip->dev->devnum, fp->iface, fp->altsetting, protocol);
  		/* fall through */
e5779998b   Daniel Mack   ALSA: usb-audio: ...
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
  	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
  ", 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
  ", brate, framesize);
  		fp->frame_size = framesize;
3d8d4dcfd   Daniel Mack   ALSA: usb-audio: ...
479
  		ret = parse_audio_format_rates_v2(chip, fp);
e5779998b   Daniel Mack   ALSA: usb-audio: ...
480
481
482
483
484
485
486
487
  		break;
  	}
  	}
  
  	return ret;
  }
  
  int snd_usb_parse_audio_format(struct snd_usb_audio *chip, struct audioformat *fp,
74754f974   Daniel Mack   ALSA: usb-audio: ...
488
489
  			       int format, struct uac_format_type_i_continuous_descriptor *fmt,
  			       int stream, struct usb_host_interface *iface)
e5779998b   Daniel Mack   ALSA: usb-audio: ...
490
491
  {
  	int err;
74754f974   Daniel Mack   ALSA: usb-audio: ...
492
  	switch (fmt->bFormatType) {
e5779998b   Daniel Mack   ALSA: usb-audio: ...
493
494
495
496
497
498
499
500
501
502
  	case UAC_FORMAT_TYPE_I:
  	case UAC_FORMAT_TYPE_III:
  		err = parse_audio_format_i(chip, fp, format, fmt, iface);
  		break;
  	case UAC_FORMAT_TYPE_II:
  		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
  ",
74754f974   Daniel Mack   ALSA: usb-audio: ...
503
504
  			   chip->dev->devnum, fp->iface, fp->altsetting,
  			   fmt->bFormatType);
8d0912427   Daniel Mack   ALSA: usb-audio: ...
505
  		return -ENOTSUPP;
e5779998b   Daniel Mack   ALSA: usb-audio: ...
506
  	}
74754f974   Daniel Mack   ALSA: usb-audio: ...
507
  	fp->fmt_type = fmt->bFormatType;
e5779998b   Daniel Mack   ALSA: usb-audio: ...
508
509
510
511
512
513
514
515
516
517
  	if (err < 0)
  		return err;
  #if 1
  	/* FIXME: temporary hack for extigy/audigy 2 nx/zs */
  	/* extigy apparently supports sample rates other than 48k
  	 * but not in ordinary way.  so we enable only 48k atm.
  	 */
  	if (chip->usb_id == USB_ID(0x041e, 0x3000) ||
  	    chip->usb_id == USB_ID(0x041e, 0x3020) ||
  	    chip->usb_id == USB_ID(0x041e, 0x3061)) {
74754f974   Daniel Mack   ALSA: usb-audio: ...
518
  		if (fmt->bFormatType == UAC_FORMAT_TYPE_I &&
e5779998b   Daniel Mack   ALSA: usb-audio: ...
519
520
  		    fp->rates != SNDRV_PCM_RATE_48000 &&
  		    fp->rates != SNDRV_PCM_RATE_96000)
8d0912427   Daniel Mack   ALSA: usb-audio: ...
521
  			return -ENOTSUPP;
e5779998b   Daniel Mack   ALSA: usb-audio: ...
522
523
524
525
  	}
  #endif
  	return 0;
  }