xref: /openbmc/linux/sound/usb/format.c (revision ee89bd6b)
1 /*
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.
6  *
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.
11  *
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
15  *
16  */
17 
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>
23 
24 #include <sound/core.h>
25 #include <sound/pcm.h>
26 
27 #include "usbaudio.h"
28 #include "card.h"
29 #include "quirks.h"
30 #include "helper.h"
31 #include "debug.h"
32 #include "clock.h"
33 #include "format.h"
34 
35 /*
36  * parse the audio format type I descriptor
37  * and returns the corresponding pcm format
38  *
39  * @dev: usb device
40  * @fp: audioformat record
41  * @format: the format tag (wFormatTag)
42  * @fmt: the format type descriptor
43  */
44 static u64 parse_audio_format_i_type(struct snd_usb_audio *chip,
45 				     struct audioformat *fp,
46 				     unsigned int format, void *_fmt,
47 				     int protocol)
48 {
49 	int sample_width, sample_bytes;
50 	u64 pcm_formats = 0;
51 
52 	switch (protocol) {
53 	case UAC_VERSION_1:
54 	default: {
55 		struct uac_format_type_i_discrete_descriptor *fmt = _fmt;
56 		sample_width = fmt->bBitResolution;
57 		sample_bytes = fmt->bSubframeSize;
58 		format = 1 << format;
59 		break;
60 	}
61 
62 	case UAC_VERSION_2: {
63 		struct uac_format_type_i_ext_descriptor *fmt = _fmt;
64 		sample_width = fmt->bBitResolution;
65 		sample_bytes = fmt->bSubslotSize;
66 
67 		if (format & UAC2_FORMAT_TYPE_I_RAW_DATA)
68 			pcm_formats |= SNDRV_PCM_FMTBIT_SPECIAL;
69 
70 		format <<= 1;
71 		break;
72 	}
73 	}
74 
75 	if ((pcm_formats == 0) &&
76 	    (format == 0 || format == (1 << UAC_FORMAT_TYPE_I_UNDEFINED))) {
77 		/* some devices don't define this correctly... */
78 		snd_printdd(KERN_INFO "%d:%u:%d : format type 0 is detected, processed as PCM\n",
79 			    chip->dev->devnum, fp->iface, fp->altsetting);
80 		format = 1 << UAC_FORMAT_TYPE_I_PCM;
81 	}
82 	if (format & (1 << UAC_FORMAT_TYPE_I_PCM)) {
83 		if (chip->usb_id == USB_ID(0x0582, 0x0016) /* Edirol SD-90 */ &&
84 		    sample_width == 24 && sample_bytes == 2)
85 			sample_bytes = 3;
86 		else if (sample_width > sample_bytes * 8) {
87 			snd_printk(KERN_INFO "%d:%u:%d : sample bitwidth %d in over sample bytes %d\n",
88 				   chip->dev->devnum, fp->iface, fp->altsetting,
89 				   sample_width, sample_bytes);
90 		}
91 		/* check the format byte size */
92 		switch (sample_bytes) {
93 		case 1:
94 			pcm_formats |= SNDRV_PCM_FMTBIT_S8;
95 			break;
96 		case 2:
97 			if (snd_usb_is_big_endian_format(chip, fp))
98 				pcm_formats |= SNDRV_PCM_FMTBIT_S16_BE; /* grrr, big endian!! */
99 			else
100 				pcm_formats |= SNDRV_PCM_FMTBIT_S16_LE;
101 			break;
102 		case 3:
103 			if (snd_usb_is_big_endian_format(chip, fp))
104 				pcm_formats |= SNDRV_PCM_FMTBIT_S24_3BE; /* grrr, big endian!! */
105 			else
106 				pcm_formats |= SNDRV_PCM_FMTBIT_S24_3LE;
107 			break;
108 		case 4:
109 			pcm_formats |= SNDRV_PCM_FMTBIT_S32_LE;
110 			break;
111 		default:
112 			snd_printk(KERN_INFO "%d:%u:%d : unsupported sample bitwidth %d in %d bytes\n",
113 				   chip->dev->devnum, fp->iface, fp->altsetting,
114 				   sample_width, sample_bytes);
115 			break;
116 		}
117 	}
118 	if (format & (1 << UAC_FORMAT_TYPE_I_PCM8)) {
119 		/* Dallas DS4201 workaround: it advertises U8 format, but really
120 		   supports S8. */
121 		if (chip->usb_id == USB_ID(0x04fa, 0x4201))
122 			pcm_formats |= SNDRV_PCM_FMTBIT_S8;
123 		else
124 			pcm_formats |= SNDRV_PCM_FMTBIT_U8;
125 	}
126 	if (format & (1 << UAC_FORMAT_TYPE_I_IEEE_FLOAT)) {
127 		pcm_formats |= SNDRV_PCM_FMTBIT_FLOAT_LE;
128 	}
129 	if (format & (1 << UAC_FORMAT_TYPE_I_ALAW)) {
130 		pcm_formats |= SNDRV_PCM_FMTBIT_A_LAW;
131 	}
132 	if (format & (1 << UAC_FORMAT_TYPE_I_MULAW)) {
133 		pcm_formats |= SNDRV_PCM_FMTBIT_MU_LAW;
134 	}
135 	if (format & ~0x3f) {
136 		snd_printk(KERN_INFO "%d:%u:%d : unsupported format bits %#x\n",
137 			   chip->dev->devnum, fp->iface, fp->altsetting, format);
138 	}
139 
140 	pcm_formats |= snd_usb_interface_dsd_format_quirks(chip, fp, sample_bytes);
141 
142 	return pcm_formats;
143 }
144 
145 
146 /*
147  * parse the format descriptor and stores the possible sample rates
148  * on the audioformat table (audio class v1).
149  *
150  * @dev: usb device
151  * @fp: audioformat record
152  * @fmt: the format descriptor
153  * @offset: the start offset of descriptor pointing the rate type
154  *          (7 for type I and II, 8 for type II)
155  */
156 static int parse_audio_format_rates_v1(struct snd_usb_audio *chip, struct audioformat *fp,
157 				       unsigned char *fmt, int offset)
158 {
159 	int nr_rates = fmt[offset];
160 
161 	if (fmt[0] < offset + 1 + 3 * (nr_rates ? nr_rates : 2)) {
162 		snd_printk(KERN_ERR "%d:%u:%d : invalid UAC_FORMAT_TYPE desc\n",
163 				   chip->dev->devnum, fp->iface, fp->altsetting);
164 		return -EINVAL;
165 	}
166 
167 	if (nr_rates) {
168 		/*
169 		 * build the rate table and bitmap flags
170 		 */
171 		int r, idx;
172 
173 		fp->rate_table = kmalloc(sizeof(int) * nr_rates, GFP_KERNEL);
174 		if (fp->rate_table == NULL) {
175 			snd_printk(KERN_ERR "cannot malloc\n");
176 			return -ENOMEM;
177 		}
178 
179 		fp->nr_rates = 0;
180 		fp->rate_min = fp->rate_max = 0;
181 		for (r = 0, idx = offset + 1; r < nr_rates; r++, idx += 3) {
182 			unsigned int rate = combine_triple(&fmt[idx]);
183 			if (!rate)
184 				continue;
185 			/* C-Media CM6501 mislabels its 96 kHz altsetting */
186 			/* Terratec Aureon 7.1 USB C-Media 6206, too */
187 			if (rate == 48000 && nr_rates == 1 &&
188 			    (chip->usb_id == USB_ID(0x0d8c, 0x0201) ||
189 			     chip->usb_id == USB_ID(0x0d8c, 0x0102) ||
190 			     chip->usb_id == USB_ID(0x0ccd, 0x00b1)) &&
191 			    fp->altsetting == 5 && fp->maxpacksize == 392)
192 				rate = 96000;
193 			/* Creative VF0470 Live Cam reports 16 kHz instead of 8kHz */
194 			if (rate == 16000 && chip->usb_id == USB_ID(0x041e, 0x4068))
195 				rate = 8000;
196 
197 			fp->rate_table[fp->nr_rates] = rate;
198 			if (!fp->rate_min || rate < fp->rate_min)
199 				fp->rate_min = rate;
200 			if (!fp->rate_max || rate > fp->rate_max)
201 				fp->rate_max = rate;
202 			fp->rates |= snd_pcm_rate_to_rate_bit(rate);
203 			fp->nr_rates++;
204 		}
205 		if (!fp->nr_rates) {
206 			hwc_debug("All rates were zero. Skipping format!\n");
207 			return -EINVAL;
208 		}
209 	} else {
210 		/* continuous rates */
211 		fp->rates = SNDRV_PCM_RATE_CONTINUOUS;
212 		fp->rate_min = combine_triple(&fmt[offset + 1]);
213 		fp->rate_max = combine_triple(&fmt[offset + 4]);
214 	}
215 	return 0;
216 }
217 
218 /*
219  * Helper function to walk the array of sample rate triplets reported by
220  * the device. The problem is that we need to parse whole array first to
221  * get to know how many sample rates we have to expect.
222  * Then fp->rate_table can be allocated and filled.
223  */
224 static int parse_uac2_sample_rate_range(struct audioformat *fp, int nr_triplets,
225 					const unsigned char *data)
226 {
227 	int i, nr_rates = 0;
228 
229 	fp->rates = fp->rate_min = fp->rate_max = 0;
230 
231 	for (i = 0; i < nr_triplets; i++) {
232 		int min = combine_quad(&data[2 + 12 * i]);
233 		int max = combine_quad(&data[6 + 12 * i]);
234 		int res = combine_quad(&data[10 + 12 * i]);
235 		unsigned int rate;
236 
237 		if ((max < 0) || (min < 0) || (res < 0) || (max < min))
238 			continue;
239 
240 		/*
241 		 * for ranges with res == 1, we announce a continuous sample
242 		 * rate range, and this function should return 0 for no further
243 		 * parsing.
244 		 */
245 		if (res == 1) {
246 			fp->rate_min = min;
247 			fp->rate_max = max;
248 			fp->rates = SNDRV_PCM_RATE_CONTINUOUS;
249 			return 0;
250 		}
251 
252 		for (rate = min; rate <= max; rate += res) {
253 			if (fp->rate_table)
254 				fp->rate_table[nr_rates] = rate;
255 			if (!fp->rate_min || rate < fp->rate_min)
256 				fp->rate_min = rate;
257 			if (!fp->rate_max || rate > fp->rate_max)
258 				fp->rate_max = rate;
259 			fp->rates |= snd_pcm_rate_to_rate_bit(rate);
260 
261 			nr_rates++;
262 			if (nr_rates >= MAX_NR_RATES) {
263 				snd_printk(KERN_ERR "invalid uac2 rates\n");
264 				break;
265 			}
266 
267 			/* avoid endless loop */
268 			if (res == 0)
269 				break;
270 		}
271 	}
272 
273 	return nr_rates;
274 }
275 
276 /*
277  * parse the format descriptor and stores the possible sample rates
278  * on the audioformat table (audio class v2).
279  */
280 static int parse_audio_format_rates_v2(struct snd_usb_audio *chip,
281 				       struct audioformat *fp)
282 {
283 	struct usb_device *dev = chip->dev;
284 	unsigned char tmp[2], *data;
285 	int nr_triplets, data_size, ret = 0;
286 	int clock = snd_usb_clock_find_source(chip, fp->clock, false);
287 
288 	if (clock < 0) {
289 		snd_printk(KERN_ERR "%s(): unable to find clock source (clock %d)\n",
290 				__func__, clock);
291 		goto err;
292 	}
293 
294 	/* get the number of sample rates first by only fetching 2 bytes */
295 	ret = snd_usb_ctl_msg(dev, usb_rcvctrlpipe(dev, 0), UAC2_CS_RANGE,
296 			      USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_IN,
297 			      UAC2_CS_CONTROL_SAM_FREQ << 8,
298 			      snd_usb_ctrl_intf(chip) | (clock << 8),
299 			      tmp, sizeof(tmp));
300 
301 	if (ret < 0) {
302 		snd_printk(KERN_ERR "%s(): unable to retrieve number of sample rates (clock %d)\n",
303 				__func__, clock);
304 		goto err;
305 	}
306 
307 	nr_triplets = (tmp[1] << 8) | tmp[0];
308 	data_size = 2 + 12 * nr_triplets;
309 	data = kzalloc(data_size, GFP_KERNEL);
310 	if (!data) {
311 		ret = -ENOMEM;
312 		goto err;
313 	}
314 
315 	/* now get the full information */
316 	ret = snd_usb_ctl_msg(dev, usb_rcvctrlpipe(dev, 0), UAC2_CS_RANGE,
317 			      USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_IN,
318 			      UAC2_CS_CONTROL_SAM_FREQ << 8,
319 			      snd_usb_ctrl_intf(chip) | (clock << 8),
320 			      data, data_size);
321 
322 	if (ret < 0) {
323 		snd_printk(KERN_ERR "%s(): unable to retrieve sample rate range (clock %d)\n",
324 				__func__, clock);
325 		ret = -EINVAL;
326 		goto err_free;
327 	}
328 
329 	/* Call the triplet parser, and make sure fp->rate_table is NULL.
330 	 * We just use the return value to know how many sample rates we
331 	 * will have to deal with. */
332 	kfree(fp->rate_table);
333 	fp->rate_table = NULL;
334 	fp->nr_rates = parse_uac2_sample_rate_range(fp, nr_triplets, data);
335 
336 	if (fp->nr_rates == 0) {
337 		/* SNDRV_PCM_RATE_CONTINUOUS */
338 		ret = 0;
339 		goto err_free;
340 	}
341 
342 	fp->rate_table = kmalloc(sizeof(int) * fp->nr_rates, GFP_KERNEL);
343 	if (!fp->rate_table) {
344 		ret = -ENOMEM;
345 		goto err_free;
346 	}
347 
348 	/* Call the triplet parser again, but this time, fp->rate_table is
349 	 * allocated, so the rates will be stored */
350 	parse_uac2_sample_rate_range(fp, nr_triplets, data);
351 
352 err_free:
353 	kfree(data);
354 err:
355 	return ret;
356 }
357 
358 /*
359  * parse the format type I and III descriptors
360  */
361 static int parse_audio_format_i(struct snd_usb_audio *chip,
362 				struct audioformat *fp, unsigned int format,
363 				struct uac_format_type_i_continuous_descriptor *fmt,
364 				struct usb_host_interface *iface)
365 {
366 	struct usb_interface_descriptor *altsd = get_iface_desc(iface);
367 	int protocol = altsd->bInterfaceProtocol;
368 	snd_pcm_format_t pcm_format;
369 	int ret;
370 
371 	if (fmt->bFormatType == UAC_FORMAT_TYPE_III) {
372 		/* FIXME: the format type is really IECxxx
373 		 *        but we give normal PCM format to get the existing
374 		 *        apps working...
375 		 */
376 		switch (chip->usb_id) {
377 
378 		case USB_ID(0x0763, 0x2003): /* M-Audio Audiophile USB */
379 			if (chip->setup == 0x00 &&
380 			    fp->altsetting == 6)
381 				pcm_format = SNDRV_PCM_FORMAT_S16_BE;
382 			else
383 				pcm_format = SNDRV_PCM_FORMAT_S16_LE;
384 			break;
385 		default:
386 			pcm_format = SNDRV_PCM_FORMAT_S16_LE;
387 		}
388 		fp->formats = pcm_format_to_bits(pcm_format);
389 	} else {
390 		fp->formats = parse_audio_format_i_type(chip, fp, format,
391 							fmt, protocol);
392 		if (!fp->formats)
393 			return -EINVAL;
394 	}
395 
396 	/* gather possible sample rates */
397 	/* audio class v1 reports possible sample rates as part of the
398 	 * proprietary class specific descriptor.
399 	 * audio class v2 uses class specific EP0 range requests for that.
400 	 */
401 	switch (protocol) {
402 	default:
403 		snd_printdd(KERN_WARNING "%d:%u:%d : invalid protocol version %d, assuming v1\n",
404 			   chip->dev->devnum, fp->iface, fp->altsetting, protocol);
405 		/* fall through */
406 	case UAC_VERSION_1:
407 		fp->channels = fmt->bNrChannels;
408 		ret = parse_audio_format_rates_v1(chip, fp, (unsigned char *) fmt, 7);
409 		break;
410 	case UAC_VERSION_2:
411 		/* fp->channels is already set in this case */
412 		ret = parse_audio_format_rates_v2(chip, fp);
413 		break;
414 	}
415 
416 	if (fp->channels < 1) {
417 		snd_printk(KERN_ERR "%d:%u:%d : invalid channels %d\n",
418 			   chip->dev->devnum, fp->iface, fp->altsetting, fp->channels);
419 		return -EINVAL;
420 	}
421 
422 	return ret;
423 }
424 
425 /*
426  * parse the format type II descriptor
427  */
428 static int parse_audio_format_ii(struct snd_usb_audio *chip,
429 				 struct audioformat *fp,
430 				 int format, void *_fmt,
431 				 struct usb_host_interface *iface)
432 {
433 	int brate, framesize, ret;
434 	struct usb_interface_descriptor *altsd = get_iface_desc(iface);
435 	int protocol = altsd->bInterfaceProtocol;
436 
437 	switch (format) {
438 	case UAC_FORMAT_TYPE_II_AC3:
439 		/* FIXME: there is no AC3 format defined yet */
440 		// fp->formats = SNDRV_PCM_FMTBIT_AC3;
441 		fp->formats = SNDRV_PCM_FMTBIT_U8; /* temporary hack to receive byte streams */
442 		break;
443 	case UAC_FORMAT_TYPE_II_MPEG:
444 		fp->formats = SNDRV_PCM_FMTBIT_MPEG;
445 		break;
446 	default:
447 		snd_printd(KERN_INFO "%d:%u:%d : unknown format tag %#x is detected.  processed as MPEG.\n",
448 			   chip->dev->devnum, fp->iface, fp->altsetting, format);
449 		fp->formats = SNDRV_PCM_FMTBIT_MPEG;
450 		break;
451 	}
452 
453 	fp->channels = 1;
454 
455 	switch (protocol) {
456 	default:
457 		snd_printdd(KERN_WARNING "%d:%u:%d : invalid protocol version %d, assuming v1\n",
458 			   chip->dev->devnum, fp->iface, fp->altsetting, protocol);
459 		/* fall through */
460 	case UAC_VERSION_1: {
461 		struct uac_format_type_ii_discrete_descriptor *fmt = _fmt;
462 		brate = le16_to_cpu(fmt->wMaxBitRate);
463 		framesize = le16_to_cpu(fmt->wSamplesPerFrame);
464 		snd_printd(KERN_INFO "found format II with max.bitrate = %d, frame size=%d\n", brate, framesize);
465 		fp->frame_size = framesize;
466 		ret = parse_audio_format_rates_v1(chip, fp, _fmt, 8); /* fmt[8..] sample rates */
467 		break;
468 	}
469 	case UAC_VERSION_2: {
470 		struct uac_format_type_ii_ext_descriptor *fmt = _fmt;
471 		brate = le16_to_cpu(fmt->wMaxBitRate);
472 		framesize = le16_to_cpu(fmt->wSamplesPerFrame);
473 		snd_printd(KERN_INFO "found format II with max.bitrate = %d, frame size=%d\n", brate, framesize);
474 		fp->frame_size = framesize;
475 		ret = parse_audio_format_rates_v2(chip, fp);
476 		break;
477 	}
478 	}
479 
480 	return ret;
481 }
482 
483 int snd_usb_parse_audio_format(struct snd_usb_audio *chip,
484 			       struct audioformat *fp, unsigned int format,
485 			       struct uac_format_type_i_continuous_descriptor *fmt,
486 			       int stream, struct usb_host_interface *iface)
487 {
488 	int err;
489 
490 	switch (fmt->bFormatType) {
491 	case UAC_FORMAT_TYPE_I:
492 	case UAC_FORMAT_TYPE_III:
493 		err = parse_audio_format_i(chip, fp, format, fmt, iface);
494 		break;
495 	case UAC_FORMAT_TYPE_II:
496 		err = parse_audio_format_ii(chip, fp, format, fmt, iface);
497 		break;
498 	default:
499 		snd_printd(KERN_INFO "%d:%u:%d : format type %d is not supported yet\n",
500 			   chip->dev->devnum, fp->iface, fp->altsetting,
501 			   fmt->bFormatType);
502 		return -ENOTSUPP;
503 	}
504 	fp->fmt_type = fmt->bFormatType;
505 	if (err < 0)
506 		return err;
507 #if 1
508 	/* FIXME: temporary hack for extigy/audigy 2 nx/zs */
509 	/* extigy apparently supports sample rates other than 48k
510 	 * but not in ordinary way.  so we enable only 48k atm.
511 	 */
512 	if (chip->usb_id == USB_ID(0x041e, 0x3000) ||
513 	    chip->usb_id == USB_ID(0x041e, 0x3020) ||
514 	    chip->usb_id == USB_ID(0x041e, 0x3061)) {
515 		if (fmt->bFormatType == UAC_FORMAT_TYPE_I &&
516 		    fp->rates != SNDRV_PCM_RATE_48000 &&
517 		    fp->rates != SNDRV_PCM_RATE_96000)
518 			return -ENOTSUPP;
519 	}
520 #endif
521 	return 0;
522 }
523 
524