]> bbs.cooldavid.org Git - net-next-2.6.git/blob - sound/usb/format.c
linux/usb/audio.h: split header
[net-next-2.6.git] / sound / usb / format.c
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/usb.h>
20 #include <linux/usb/audio.h>
21 #include <linux/usb/audio-v2.h>
22
23 #include <sound/core.h>
24 #include <sound/pcm.h>
25
26 #include "usbaudio.h"
27 #include "card.h"
28 #include "quirks.h"
29 #include "helper.h"
30 #include "debug.h"
31
32 /*
33  * parse the audio format type I descriptor
34  * and returns the corresponding pcm format
35  *
36  * @dev: usb device
37  * @fp: audioformat record
38  * @format: the format tag (wFormatTag)
39  * @fmt: the format type descriptor
40  */
41 static u64 parse_audio_format_i_type(struct snd_usb_audio *chip,
42                                      struct audioformat *fp,
43                                      int format, void *_fmt,
44                                      int protocol)
45 {
46         int sample_width, sample_bytes;
47         u64 pcm_formats;
48
49         switch (protocol) {
50         case UAC_VERSION_1: {
51                 struct uac_format_type_i_discrete_descriptor *fmt = _fmt;
52                 sample_width = fmt->bBitResolution;
53                 sample_bytes = fmt->bSubframeSize;
54                 format = 1 << format;
55                 break;
56         }
57
58         case UAC_VERSION_2: {
59                 struct uac_format_type_i_ext_descriptor *fmt = _fmt;
60                 sample_width = fmt->bBitResolution;
61                 sample_bytes = fmt->bSubslotSize;
62                 format <<= 1;
63                 break;
64         }
65
66         default:
67                 return -EINVAL;
68         }
69
70         pcm_formats = 0;
71
72         if (format == 0 || format == (1 << UAC_FORMAT_TYPE_I_UNDEFINED)) {
73                 /* some devices don't define this correctly... */
74                 snd_printdd(KERN_INFO "%d:%u:%d : format type 0 is detected, processed as PCM\n",
75                             chip->dev->devnum, fp->iface, fp->altsetting);
76                 format = 1 << UAC_FORMAT_TYPE_I_PCM;
77         }
78         if (format & (1 << UAC_FORMAT_TYPE_I_PCM)) {
79                 if (sample_width > sample_bytes * 8) {
80                         snd_printk(KERN_INFO "%d:%u:%d : sample bitwidth %d in over sample bytes %d\n",
81                                    chip->dev->devnum, fp->iface, fp->altsetting,
82                                    sample_width, sample_bytes);
83                 }
84                 /* check the format byte size */
85                 switch (sample_bytes) {
86                 case 1:
87                         pcm_formats |= SNDRV_PCM_FMTBIT_S8;
88                         break;
89                 case 2:
90                         if (snd_usb_is_big_endian_format(chip, fp))
91                                 pcm_formats |= SNDRV_PCM_FMTBIT_S16_BE; /* grrr, big endian!! */
92                         else
93                                 pcm_formats |= SNDRV_PCM_FMTBIT_S16_LE;
94                         break;
95                 case 3:
96                         if (snd_usb_is_big_endian_format(chip, fp))
97                                 pcm_formats |= SNDRV_PCM_FMTBIT_S24_3BE; /* grrr, big endian!! */
98                         else
99                                 pcm_formats |= SNDRV_PCM_FMTBIT_S24_3LE;
100                         break;
101                 case 4:
102                         pcm_formats |= SNDRV_PCM_FMTBIT_S32_LE;
103                         break;
104                 default:
105                         snd_printk(KERN_INFO "%d:%u:%d : unsupported sample bitwidth %d in %d bytes\n",
106                                    chip->dev->devnum, fp->iface, fp->altsetting,
107                                    sample_width, sample_bytes);
108                         break;
109                 }
110         }
111         if (format & (1 << UAC_FORMAT_TYPE_I_PCM8)) {
112                 /* Dallas DS4201 workaround: it advertises U8 format, but really
113                    supports S8. */
114                 if (chip->usb_id == USB_ID(0x04fa, 0x4201))
115                         pcm_formats |= SNDRV_PCM_FMTBIT_S8;
116                 else
117                         pcm_formats |= SNDRV_PCM_FMTBIT_U8;
118         }
119         if (format & (1 << UAC_FORMAT_TYPE_I_IEEE_FLOAT)) {
120                 pcm_formats |= SNDRV_PCM_FMTBIT_FLOAT_LE;
121         }
122         if (format & (1 << UAC_FORMAT_TYPE_I_ALAW)) {
123                 pcm_formats |= SNDRV_PCM_FMTBIT_A_LAW;
124         }
125         if (format & (1 << UAC_FORMAT_TYPE_I_MULAW)) {
126                 pcm_formats |= SNDRV_PCM_FMTBIT_MU_LAW;
127         }
128         if (format & ~0x3f) {
129                 snd_printk(KERN_INFO "%d:%u:%d : unsupported format bits %#x\n",
130                            chip->dev->devnum, fp->iface, fp->altsetting, format);
131         }
132         return pcm_formats;
133 }
134
135
136 /*
137  * parse the format descriptor and stores the possible sample rates
138  * on the audioformat table (audio class v1).
139  *
140  * @dev: usb device
141  * @fp: audioformat record
142  * @fmt: the format descriptor
143  * @offset: the start offset of descriptor pointing the rate type
144  *          (7 for type I and II, 8 for type II)
145  */
146 static int parse_audio_format_rates_v1(struct snd_usb_audio *chip, struct audioformat *fp,
147                                        unsigned char *fmt, int offset)
148 {
149         int nr_rates = fmt[offset];
150
151         if (fmt[0] < offset + 1 + 3 * (nr_rates ? nr_rates : 2)) {
152                 snd_printk(KERN_ERR "%d:%u:%d : invalid UAC_FORMAT_TYPE desc\n",
153                                    chip->dev->devnum, fp->iface, fp->altsetting);
154                 return -1;
155         }
156
157         if (nr_rates) {
158                 /*
159                  * build the rate table and bitmap flags
160                  */
161                 int r, idx;
162
163                 fp->rate_table = kmalloc(sizeof(int) * nr_rates, GFP_KERNEL);
164                 if (fp->rate_table == NULL) {
165                         snd_printk(KERN_ERR "cannot malloc\n");
166                         return -1;
167                 }
168
169                 fp->nr_rates = 0;
170                 fp->rate_min = fp->rate_max = 0;
171                 for (r = 0, idx = offset + 1; r < nr_rates; r++, idx += 3) {
172                         unsigned int rate = combine_triple(&fmt[idx]);
173                         if (!rate)
174                                 continue;
175                         /* C-Media CM6501 mislabels its 96 kHz altsetting */
176                         if (rate == 48000 && nr_rates == 1 &&
177                             (chip->usb_id == USB_ID(0x0d8c, 0x0201) ||
178                              chip->usb_id == USB_ID(0x0d8c, 0x0102)) &&
179                             fp->altsetting == 5 && fp->maxpacksize == 392)
180                                 rate = 96000;
181                         /* Creative VF0470 Live Cam reports 16 kHz instead of 8kHz */
182                         if (rate == 16000 && chip->usb_id == USB_ID(0x041e, 0x4068))
183                                 rate = 8000;
184
185                         fp->rate_table[fp->nr_rates] = rate;
186                         if (!fp->rate_min || rate < fp->rate_min)
187                                 fp->rate_min = rate;
188                         if (!fp->rate_max || rate > fp->rate_max)
189                                 fp->rate_max = rate;
190                         fp->rates |= snd_pcm_rate_to_rate_bit(rate);
191                         fp->nr_rates++;
192                 }
193                 if (!fp->nr_rates) {
194                         hwc_debug("All rates were zero. Skipping format!\n");
195                         return -1;
196                 }
197         } else {
198                 /* continuous rates */
199                 fp->rates = SNDRV_PCM_RATE_CONTINUOUS;
200                 fp->rate_min = combine_triple(&fmt[offset + 1]);
201                 fp->rate_max = combine_triple(&fmt[offset + 4]);
202         }
203         return 0;
204 }
205
206 /*
207  * parse the format descriptor and stores the possible sample rates
208  * on the audioformat table (audio class v2).
209  */
210 static int parse_audio_format_rates_v2(struct snd_usb_audio *chip,
211                                        struct audioformat *fp,
212                                        struct usb_host_interface *iface)
213 {
214         struct usb_device *dev = chip->dev;
215         unsigned char tmp[2], *data;
216         int i, nr_rates, data_size, ret = 0;
217
218         /* get the number of sample rates first by only fetching 2 bytes */
219         ret = snd_usb_ctl_msg(dev, usb_rcvctrlpipe(dev, 0), UAC2_CS_RANGE,
220                               USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_IN,
221                               0x0100, chip->clock_id << 8, tmp, sizeof(tmp), 1000);
222
223         if (ret < 0) {
224                 snd_printk(KERN_ERR "unable to retrieve number of sample rates\n");
225                 goto err;
226         }
227
228         nr_rates = (tmp[1] << 8) | tmp[0];
229         data_size = 2 + 12 * nr_rates;
230         data = kzalloc(data_size, GFP_KERNEL);
231         if (!data) {
232                 ret = -ENOMEM;
233                 goto err;
234         }
235
236         /* now get the full information */
237         ret = snd_usb_ctl_msg(dev, usb_rcvctrlpipe(dev, 0), UAC2_CS_RANGE,
238                                USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_IN,
239                                0x0100, chip->clock_id << 8, data, data_size, 1000);
240
241         if (ret < 0) {
242                 snd_printk(KERN_ERR "unable to retrieve sample rate range\n");
243                 ret = -EINVAL;
244                 goto err_free;
245         }
246
247         fp->rate_table = kmalloc(sizeof(int) * nr_rates, GFP_KERNEL);
248         if (!fp->rate_table) {
249                 ret = -ENOMEM;
250                 goto err_free;
251         }
252
253         fp->nr_rates = 0;
254         fp->rate_min = fp->rate_max = 0;
255
256         for (i = 0; i < nr_rates; i++) {
257                 int rate = combine_quad(&data[2 + 12 * i]);
258
259                 fp->rate_table[fp->nr_rates] = rate;
260                 if (!fp->rate_min || rate < fp->rate_min)
261                         fp->rate_min = rate;
262                 if (!fp->rate_max || rate > fp->rate_max)
263                         fp->rate_max = rate;
264                 fp->rates |= snd_pcm_rate_to_rate_bit(rate);
265                 fp->nr_rates++;
266         }
267
268 err_free:
269         kfree(data);
270 err:
271         return ret;
272 }
273
274 /*
275  * parse the format type I and III descriptors
276  */
277 static int parse_audio_format_i(struct snd_usb_audio *chip,
278                                 struct audioformat *fp,
279                                 int format, void *_fmt,
280                                 struct usb_host_interface *iface)
281 {
282         struct usb_interface_descriptor *altsd = get_iface_desc(iface);
283         struct uac_format_type_i_discrete_descriptor *fmt = _fmt;
284         int protocol = altsd->bInterfaceProtocol;
285         int pcm_format, ret;
286
287         if (fmt->bFormatType == UAC_FORMAT_TYPE_III) {
288                 /* FIXME: the format type is really IECxxx
289                  *        but we give normal PCM format to get the existing
290                  *        apps working...
291                  */
292                 switch (chip->usb_id) {
293
294                 case USB_ID(0x0763, 0x2003): /* M-Audio Audiophile USB */
295                         if (chip->setup == 0x00 && 
296                             fp->altsetting == 6)
297                                 pcm_format = SNDRV_PCM_FORMAT_S16_BE;
298                         else
299                                 pcm_format = SNDRV_PCM_FORMAT_S16_LE;
300                         break;
301                 default:
302                         pcm_format = SNDRV_PCM_FORMAT_S16_LE;
303                 }
304                 fp->formats = 1uLL << pcm_format;
305         } else {
306                 fp->formats = parse_audio_format_i_type(chip, fp, format,
307                                                         fmt, protocol);
308                 if (!fp->formats)
309                         return -1;
310         }
311
312         /* gather possible sample rates */
313         /* audio class v1 reports possible sample rates as part of the
314          * proprietary class specific descriptor.
315          * audio class v2 uses class specific EP0 range requests for that.
316          */
317         switch (protocol) {
318         case UAC_VERSION_1:
319                 fp->channels = fmt->bNrChannels;
320                 ret = parse_audio_format_rates_v1(chip, fp, _fmt, 7);
321                 break;
322         case UAC_VERSION_2:
323                 /* fp->channels is already set in this case */
324                 ret = parse_audio_format_rates_v2(chip, fp, iface);
325                 break;
326         }
327
328         if (fp->channels < 1) {
329                 snd_printk(KERN_ERR "%d:%u:%d : invalid channels %d\n",
330                            chip->dev->devnum, fp->iface, fp->altsetting, fp->channels);
331                 return -1;
332         }
333
334         return ret;
335 }
336
337 /*
338  * parse the format type II descriptor
339  */
340 static int parse_audio_format_ii(struct snd_usb_audio *chip,
341                                  struct audioformat *fp,
342                                  int format, void *_fmt,
343                                  struct usb_host_interface *iface)
344 {
345         int brate, framesize, ret;
346         struct usb_interface_descriptor *altsd = get_iface_desc(iface);
347         int protocol = altsd->bInterfaceProtocol;
348
349         switch (format) {
350         case UAC_FORMAT_TYPE_II_AC3:
351                 /* FIXME: there is no AC3 format defined yet */
352                 // fp->formats = SNDRV_PCM_FMTBIT_AC3;
353                 fp->formats = SNDRV_PCM_FMTBIT_U8; /* temporary hack to receive byte streams */
354                 break;
355         case UAC_FORMAT_TYPE_II_MPEG:
356                 fp->formats = SNDRV_PCM_FMTBIT_MPEG;
357                 break;
358         default:
359                 snd_printd(KERN_INFO "%d:%u:%d : unknown format tag %#x is detected.  processed as MPEG.\n",
360                            chip->dev->devnum, fp->iface, fp->altsetting, format);
361                 fp->formats = SNDRV_PCM_FMTBIT_MPEG;
362                 break;
363         }
364
365         fp->channels = 1;
366
367         switch (protocol) {
368         case UAC_VERSION_1: {
369                 struct uac_format_type_ii_discrete_descriptor *fmt = _fmt;
370                 brate = le16_to_cpu(fmt->wMaxBitRate);
371                 framesize = le16_to_cpu(fmt->wSamplesPerFrame);
372                 snd_printd(KERN_INFO "found format II with max.bitrate = %d, frame size=%d\n", brate, framesize);
373                 fp->frame_size = framesize;
374                 ret = parse_audio_format_rates_v1(chip, fp, _fmt, 8); /* fmt[8..] sample rates */
375                 break;
376         }
377         case UAC_VERSION_2: {
378                 struct uac_format_type_ii_ext_descriptor *fmt = _fmt;
379                 brate = le16_to_cpu(fmt->wMaxBitRate);
380                 framesize = le16_to_cpu(fmt->wSamplesPerFrame);
381                 snd_printd(KERN_INFO "found format II with max.bitrate = %d, frame size=%d\n", brate, framesize);
382                 fp->frame_size = framesize;
383                 ret = parse_audio_format_rates_v2(chip, fp, iface);
384                 break;
385         }
386         }
387
388         return ret;
389 }
390
391 int snd_usb_parse_audio_format(struct snd_usb_audio *chip, struct audioformat *fp,
392                        int format, unsigned char *fmt, int stream,
393                        struct usb_host_interface *iface)
394 {
395         int err;
396
397         switch (fmt[3]) {
398         case UAC_FORMAT_TYPE_I:
399         case UAC_FORMAT_TYPE_III:
400                 err = parse_audio_format_i(chip, fp, format, fmt, iface);
401                 break;
402         case UAC_FORMAT_TYPE_II:
403                 err = parse_audio_format_ii(chip, fp, format, fmt, iface);
404                 break;
405         default:
406                 snd_printd(KERN_INFO "%d:%u:%d : format type %d is not supported yet\n",
407                            chip->dev->devnum, fp->iface, fp->altsetting, fmt[3]);
408                 return -1;
409         }
410         fp->fmt_type = fmt[3];
411         if (err < 0)
412                 return err;
413 #if 1
414         /* FIXME: temporary hack for extigy/audigy 2 nx/zs */
415         /* extigy apparently supports sample rates other than 48k
416          * but not in ordinary way.  so we enable only 48k atm.
417          */
418         if (chip->usb_id == USB_ID(0x041e, 0x3000) ||
419             chip->usb_id == USB_ID(0x041e, 0x3020) ||
420             chip->usb_id == USB_ID(0x041e, 0x3061)) {
421                 if (fmt[3] == UAC_FORMAT_TYPE_I &&
422                     fp->rates != SNDRV_PCM_RATE_48000 &&
423                     fp->rates != SNDRV_PCM_RATE_96000)
424                         return -1;
425         }
426 #endif
427         return 0;
428 }
429