root/sound/usb/format.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. parse_audio_format_i_type
  2. parse_audio_format_rates_v1
  3. focusrite_valid_sample_rate
  4. parse_uac2_sample_rate_range
  5. line6_parse_audio_format_rates_quirk
  6. parse_audio_format_rates_v2v3
  7. parse_audio_format_i
  8. parse_audio_format_ii
  9. snd_usb_parse_audio_format
  10. snd_usb_parse_audio_format_v3

   1 // SPDX-License-Identifier: GPL-2.0-or-later
   2 /*
   3  */
   4 
   5 #include <linux/init.h>
   6 #include <linux/slab.h>
   7 #include <linux/usb.h>
   8 #include <linux/usb/audio.h>
   9 #include <linux/usb/audio-v2.h>
  10 #include <linux/usb/audio-v3.h>
  11 
  12 #include <sound/core.h>
  13 #include <sound/pcm.h>
  14 
  15 #include "usbaudio.h"
  16 #include "card.h"
  17 #include "quirks.h"
  18 #include "helper.h"
  19 #include "debug.h"
  20 #include "clock.h"
  21 #include "format.h"
  22 
  23 /*
  24  * parse the audio format type I descriptor
  25  * and returns the corresponding pcm format
  26  *
  27  * @dev: usb device
  28  * @fp: audioformat record
  29  * @format: the format tag (wFormatTag)
  30  * @fmt: the format type descriptor (v1/v2) or AudioStreaming descriptor (v3)
  31  */
  32 static u64 parse_audio_format_i_type(struct snd_usb_audio *chip,
  33                                      struct audioformat *fp,
  34                                      u64 format, void *_fmt)
  35 {
  36         int sample_width, sample_bytes;
  37         u64 pcm_formats = 0;
  38 
  39         switch (fp->protocol) {
  40         case UAC_VERSION_1:
  41         default: {
  42                 struct uac_format_type_i_discrete_descriptor *fmt = _fmt;
  43                 sample_width = fmt->bBitResolution;
  44                 sample_bytes = fmt->bSubframeSize;
  45                 format = 1ULL << format;
  46                 break;
  47         }
  48 
  49         case UAC_VERSION_2: {
  50                 struct uac_format_type_i_ext_descriptor *fmt = _fmt;
  51                 sample_width = fmt->bBitResolution;
  52                 sample_bytes = fmt->bSubslotSize;
  53 
  54                 if (format & UAC2_FORMAT_TYPE_I_RAW_DATA) {
  55                         pcm_formats |= SNDRV_PCM_FMTBIT_SPECIAL;
  56                         /* flag potentially raw DSD capable altsettings */
  57                         fp->dsd_raw = true;
  58                 }
  59 
  60                 format <<= 1;
  61                 break;
  62         }
  63         case UAC_VERSION_3: {
  64                 struct uac3_as_header_descriptor *as = _fmt;
  65 
  66                 sample_width = as->bBitResolution;
  67                 sample_bytes = as->bSubslotSize;
  68 
  69                 if (format & UAC3_FORMAT_TYPE_I_RAW_DATA)
  70                         pcm_formats |= SNDRV_PCM_FMTBIT_SPECIAL;
  71 
  72                 format <<= 1;
  73                 break;
  74         }
  75         }
  76 
  77         fp->fmt_bits = sample_width;
  78 
  79         if ((pcm_formats == 0) &&
  80             (format == 0 || format == (1 << UAC_FORMAT_TYPE_I_UNDEFINED))) {
  81                 /* some devices don't define this correctly... */
  82                 usb_audio_info(chip, "%u:%d : format type 0 is detected, processed as PCM\n",
  83                         fp->iface, fp->altsetting);
  84                 format = 1 << UAC_FORMAT_TYPE_I_PCM;
  85         }
  86         if (format & (1 << UAC_FORMAT_TYPE_I_PCM)) {
  87                 if (((chip->usb_id == USB_ID(0x0582, 0x0016)) ||
  88                      /* Edirol SD-90 */
  89                      (chip->usb_id == USB_ID(0x0582, 0x000c))) &&
  90                      /* Roland SC-D70 */
  91                     sample_width == 24 && sample_bytes == 2)
  92                         sample_bytes = 3;
  93                 else if (sample_width > sample_bytes * 8) {
  94                         usb_audio_info(chip, "%u:%d : sample bitwidth %d in over sample bytes %d\n",
  95                                  fp->iface, fp->altsetting,
  96                                  sample_width, sample_bytes);
  97                 }
  98                 /* check the format byte size */
  99                 switch (sample_bytes) {
 100                 case 1:
 101                         pcm_formats |= SNDRV_PCM_FMTBIT_S8;
 102                         break;
 103                 case 2:
 104                         if (snd_usb_is_big_endian_format(chip, fp))
 105                                 pcm_formats |= SNDRV_PCM_FMTBIT_S16_BE; /* grrr, big endian!! */
 106                         else
 107                                 pcm_formats |= SNDRV_PCM_FMTBIT_S16_LE;
 108                         break;
 109                 case 3:
 110                         if (snd_usb_is_big_endian_format(chip, fp))
 111                                 pcm_formats |= SNDRV_PCM_FMTBIT_S24_3BE; /* grrr, big endian!! */
 112                         else
 113                                 pcm_formats |= SNDRV_PCM_FMTBIT_S24_3LE;
 114                         break;
 115                 case 4:
 116                         pcm_formats |= SNDRV_PCM_FMTBIT_S32_LE;
 117                         break;
 118                 default:
 119                         usb_audio_info(chip,
 120                                  "%u:%d : unsupported sample bitwidth %d in %d bytes\n",
 121                                  fp->iface, fp->altsetting,
 122                                  sample_width, sample_bytes);
 123                         break;
 124                 }
 125         }
 126         if (format & (1 << UAC_FORMAT_TYPE_I_PCM8)) {
 127                 /* Dallas DS4201 workaround: it advertises U8 format, but really
 128                    supports S8. */
 129                 if (chip->usb_id == USB_ID(0x04fa, 0x4201))
 130                         pcm_formats |= SNDRV_PCM_FMTBIT_S8;
 131                 else
 132                         pcm_formats |= SNDRV_PCM_FMTBIT_U8;
 133         }
 134         if (format & (1 << UAC_FORMAT_TYPE_I_IEEE_FLOAT)) {
 135                 pcm_formats |= SNDRV_PCM_FMTBIT_FLOAT_LE;
 136         }
 137         if (format & (1 << UAC_FORMAT_TYPE_I_ALAW)) {
 138                 pcm_formats |= SNDRV_PCM_FMTBIT_A_LAW;
 139         }
 140         if (format & (1 << UAC_FORMAT_TYPE_I_MULAW)) {
 141                 pcm_formats |= SNDRV_PCM_FMTBIT_MU_LAW;
 142         }
 143         if (format & ~0x3f) {
 144                 usb_audio_info(chip,
 145                          "%u:%d : unsupported format bits %#llx\n",
 146                          fp->iface, fp->altsetting, format);
 147         }
 148 
 149         pcm_formats |= snd_usb_interface_dsd_format_quirks(chip, fp, sample_bytes);
 150 
 151         return pcm_formats;
 152 }
 153 
 154 
 155 /*
 156  * parse the format descriptor and stores the possible sample rates
 157  * on the audioformat table (audio class v1).
 158  *
 159  * @dev: usb device
 160  * @fp: audioformat record
 161  * @fmt: the format descriptor
 162  * @offset: the start offset of descriptor pointing the rate type
 163  *          (7 for type I and II, 8 for type II)
 164  */
 165 static int parse_audio_format_rates_v1(struct snd_usb_audio *chip, struct audioformat *fp,
 166                                        unsigned char *fmt, int offset)
 167 {
 168         int nr_rates = fmt[offset];
 169 
 170         if (fmt[0] < offset + 1 + 3 * (nr_rates ? nr_rates : 2)) {
 171                 usb_audio_err(chip,
 172                         "%u:%d : invalid UAC_FORMAT_TYPE desc\n",
 173                         fp->iface, fp->altsetting);
 174                 return -EINVAL;
 175         }
 176 
 177         if (nr_rates) {
 178                 /*
 179                  * build the rate table and bitmap flags
 180                  */
 181                 int r, idx;
 182 
 183                 fp->rate_table = kmalloc_array(nr_rates, sizeof(int),
 184                                                GFP_KERNEL);
 185                 if (fp->rate_table == NULL)
 186                         return -ENOMEM;
 187 
 188                 fp->nr_rates = 0;
 189                 fp->rate_min = fp->rate_max = 0;
 190                 for (r = 0, idx = offset + 1; r < nr_rates; r++, idx += 3) {
 191                         unsigned int rate = combine_triple(&fmt[idx]);
 192                         if (!rate)
 193                                 continue;
 194                         /* C-Media CM6501 mislabels its 96 kHz altsetting */
 195                         /* Terratec Aureon 7.1 USB C-Media 6206, too */
 196                         if (rate == 48000 && nr_rates == 1 &&
 197                             (chip->usb_id == USB_ID(0x0d8c, 0x0201) ||
 198                              chip->usb_id == USB_ID(0x0d8c, 0x0102) ||
 199                              chip->usb_id == USB_ID(0x0ccd, 0x00b1)) &&
 200                             fp->altsetting == 5 && fp->maxpacksize == 392)
 201                                 rate = 96000;
 202                         /* Creative VF0420/VF0470 Live Cams report 16 kHz instead of 8kHz */
 203                         if (rate == 16000 &&
 204                             (chip->usb_id == USB_ID(0x041e, 0x4064) ||
 205                              chip->usb_id == USB_ID(0x041e, 0x4068)))
 206                                 rate = 8000;
 207 
 208                         fp->rate_table[fp->nr_rates] = rate;
 209                         if (!fp->rate_min || rate < fp->rate_min)
 210                                 fp->rate_min = rate;
 211                         if (!fp->rate_max || rate > fp->rate_max)
 212                                 fp->rate_max = rate;
 213                         fp->rates |= snd_pcm_rate_to_rate_bit(rate);
 214                         fp->nr_rates++;
 215                 }
 216                 if (!fp->nr_rates) {
 217                         hwc_debug("All rates were zero. Skipping format!\n");
 218                         return -EINVAL;
 219                 }
 220         } else {
 221                 /* continuous rates */
 222                 fp->rates = SNDRV_PCM_RATE_CONTINUOUS;
 223                 fp->rate_min = combine_triple(&fmt[offset + 1]);
 224                 fp->rate_max = combine_triple(&fmt[offset + 4]);
 225         }
 226         return 0;
 227 }
 228 
 229 /*
 230  * Many Focusrite devices supports a limited set of sampling rates per
 231  * altsetting. Maximum rate is exposed in the last 4 bytes of Format Type
 232  * descriptor which has a non-standard bLength = 10.
 233  */
 234 static bool focusrite_valid_sample_rate(struct snd_usb_audio *chip,
 235                                         struct audioformat *fp,
 236                                         unsigned int rate)
 237 {
 238         struct usb_interface *iface;
 239         struct usb_host_interface *alts;
 240         unsigned char *fmt;
 241         unsigned int max_rate;
 242 
 243         iface = usb_ifnum_to_if(chip->dev, fp->iface);
 244         if (!iface)
 245                 return true;
 246 
 247         alts = &iface->altsetting[fp->altset_idx];
 248         fmt = snd_usb_find_csint_desc(alts->extra, alts->extralen,
 249                                       NULL, UAC_FORMAT_TYPE);
 250         if (!fmt)
 251                 return true;
 252 
 253         if (fmt[0] == 10) { /* bLength */
 254                 max_rate = combine_quad(&fmt[6]);
 255 
 256                 /* Validate max rate */
 257                 if (max_rate != 48000 &&
 258                     max_rate != 96000 &&
 259                     max_rate != 192000 &&
 260                     max_rate != 384000) {
 261 
 262                         usb_audio_info(chip,
 263                                 "%u:%d : unexpected max rate: %u\n",
 264                                 fp->iface, fp->altsetting, max_rate);
 265 
 266                         return true;
 267                 }
 268 
 269                 return rate <= max_rate;
 270         }
 271 
 272         return true;
 273 }
 274 
 275 /*
 276  * Helper function to walk the array of sample rate triplets reported by
 277  * the device. The problem is that we need to parse whole array first to
 278  * get to know how many sample rates we have to expect.
 279  * Then fp->rate_table can be allocated and filled.
 280  */
 281 static int parse_uac2_sample_rate_range(struct snd_usb_audio *chip,
 282                                         struct audioformat *fp, int nr_triplets,
 283                                         const unsigned char *data)
 284 {
 285         int i, nr_rates = 0;
 286 
 287         fp->rates = fp->rate_min = fp->rate_max = 0;
 288 
 289         for (i = 0; i < nr_triplets; i++) {
 290                 int min = combine_quad(&data[2 + 12 * i]);
 291                 int max = combine_quad(&data[6 + 12 * i]);
 292                 int res = combine_quad(&data[10 + 12 * i]);
 293                 unsigned int rate;
 294 
 295                 if ((max < 0) || (min < 0) || (res < 0) || (max < min))
 296                         continue;
 297 
 298                 /*
 299                  * for ranges with res == 1, we announce a continuous sample
 300                  * rate range, and this function should return 0 for no further
 301                  * parsing.
 302                  */
 303                 if (res == 1) {
 304                         fp->rate_min = min;
 305                         fp->rate_max = max;
 306                         fp->rates = SNDRV_PCM_RATE_CONTINUOUS;
 307                         return 0;
 308                 }
 309 
 310                 for (rate = min; rate <= max; rate += res) {
 311                         /* Filter out invalid rates on Focusrite devices */
 312                         if (USB_ID_VENDOR(chip->usb_id) == 0x1235 &&
 313                             !focusrite_valid_sample_rate(chip, fp, rate))
 314                                 goto skip_rate;
 315 
 316                         if (fp->rate_table)
 317                                 fp->rate_table[nr_rates] = rate;
 318                         if (!fp->rate_min || rate < fp->rate_min)
 319                                 fp->rate_min = rate;
 320                         if (!fp->rate_max || rate > fp->rate_max)
 321                                 fp->rate_max = rate;
 322                         fp->rates |= snd_pcm_rate_to_rate_bit(rate);
 323 
 324                         nr_rates++;
 325                         if (nr_rates >= MAX_NR_RATES) {
 326                                 usb_audio_err(chip, "invalid uac2 rates\n");
 327                                 break;
 328                         }
 329 
 330 skip_rate:
 331                         /* avoid endless loop */
 332                         if (res == 0)
 333                                 break;
 334                 }
 335         }
 336 
 337         return nr_rates;
 338 }
 339 
 340 /* Line6 Helix series don't support the UAC2_CS_RANGE usb function
 341  * call. Return a static table of known clock rates.
 342  */
 343 static int line6_parse_audio_format_rates_quirk(struct snd_usb_audio *chip,
 344                                                 struct audioformat *fp)
 345 {
 346         switch (chip->usb_id) {
 347         case USB_ID(0x0E41, 0x4241): /* Line6 Helix */
 348         case USB_ID(0x0E41, 0x4242): /* Line6 Helix Rack */
 349         case USB_ID(0x0E41, 0x4244): /* Line6 Helix LT */
 350         case USB_ID(0x0E41, 0x4246): /* Line6 HX-Stomp */
 351         case USB_ID(0x0E41, 0x4248): /* Line6 Helix >= fw 2.82 */
 352         case USB_ID(0x0E41, 0x4249): /* Line6 Helix Rack >= fw 2.82 */
 353         case USB_ID(0x0E41, 0x424a): /* Line6 Helix LT >= fw 2.82 */
 354                 /* supported rates: 48Khz */
 355                 kfree(fp->rate_table);
 356                 fp->rate_table = kmalloc(sizeof(int), GFP_KERNEL);
 357                 if (!fp->rate_table)
 358                         return -ENOMEM;
 359                 fp->nr_rates = 1;
 360                 fp->rate_min = 48000;
 361                 fp->rate_max = 48000;
 362                 fp->rates = SNDRV_PCM_RATE_48000;
 363                 fp->rate_table[0] = 48000;
 364                 return 0;
 365         }
 366 
 367         return -ENODEV;
 368 }
 369 
 370 /*
 371  * parse the format descriptor and stores the possible sample rates
 372  * on the audioformat table (audio class v2 and v3).
 373  */
 374 static int parse_audio_format_rates_v2v3(struct snd_usb_audio *chip,
 375                                        struct audioformat *fp)
 376 {
 377         struct usb_device *dev = chip->dev;
 378         unsigned char tmp[2], *data;
 379         int nr_triplets, data_size, ret = 0, ret_l6;
 380         int clock = snd_usb_clock_find_source(chip, fp, false);
 381 
 382         if (clock < 0) {
 383                 dev_err(&dev->dev,
 384                         "%s(): unable to find clock source (clock %d)\n",
 385                                 __func__, clock);
 386                 goto err;
 387         }
 388 
 389         /* get the number of sample rates first by only fetching 2 bytes */
 390         ret = snd_usb_ctl_msg(dev, usb_rcvctrlpipe(dev, 0), UAC2_CS_RANGE,
 391                               USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_IN,
 392                               UAC2_CS_CONTROL_SAM_FREQ << 8,
 393                               snd_usb_ctrl_intf(chip) | (clock << 8),
 394                               tmp, sizeof(tmp));
 395 
 396         if (ret < 0) {
 397                 /* line6 helix devices don't support UAC2_CS_CONTROL_SAM_FREQ call */
 398                 ret_l6 = line6_parse_audio_format_rates_quirk(chip, fp);
 399                 if (ret_l6 == -ENODEV) {
 400                         /* no line6 device found continue showing the error */
 401                         dev_err(&dev->dev,
 402                                 "%s(): unable to retrieve number of sample rates (clock %d)\n",
 403                                 __func__, clock);
 404                         goto err;
 405                 }
 406                 if (ret_l6 == 0) {
 407                         dev_info(&dev->dev,
 408                                 "%s(): unable to retrieve number of sample rates: set it to a predefined value (clock %d).\n",
 409                                 __func__, clock);
 410                         return 0;
 411                 }
 412                 ret = ret_l6;
 413                 goto err;
 414         }
 415 
 416         nr_triplets = (tmp[1] << 8) | tmp[0];
 417         data_size = 2 + 12 * nr_triplets;
 418         data = kzalloc(data_size, GFP_KERNEL);
 419         if (!data) {
 420                 ret = -ENOMEM;
 421                 goto err;
 422         }
 423 
 424         /* now get the full information */
 425         ret = snd_usb_ctl_msg(dev, usb_rcvctrlpipe(dev, 0), UAC2_CS_RANGE,
 426                               USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_IN,
 427                               UAC2_CS_CONTROL_SAM_FREQ << 8,
 428                               snd_usb_ctrl_intf(chip) | (clock << 8),
 429                               data, data_size);
 430 
 431         if (ret < 0) {
 432                 dev_err(&dev->dev,
 433                         "%s(): unable to retrieve sample rate range (clock %d)\n",
 434                                 __func__, clock);
 435                 ret = -EINVAL;
 436                 goto err_free;
 437         }
 438 
 439         /* Call the triplet parser, and make sure fp->rate_table is NULL.
 440          * We just use the return value to know how many sample rates we
 441          * will have to deal with. */
 442         kfree(fp->rate_table);
 443         fp->rate_table = NULL;
 444         fp->nr_rates = parse_uac2_sample_rate_range(chip, fp, nr_triplets, data);
 445 
 446         if (fp->nr_rates == 0) {
 447                 /* SNDRV_PCM_RATE_CONTINUOUS */
 448                 ret = 0;
 449                 goto err_free;
 450         }
 451 
 452         fp->rate_table = kmalloc_array(fp->nr_rates, sizeof(int), GFP_KERNEL);
 453         if (!fp->rate_table) {
 454                 ret = -ENOMEM;
 455                 goto err_free;
 456         }
 457 
 458         /* Call the triplet parser again, but this time, fp->rate_table is
 459          * allocated, so the rates will be stored */
 460         parse_uac2_sample_rate_range(chip, fp, nr_triplets, data);
 461 
 462 err_free:
 463         kfree(data);
 464 err:
 465         return ret;
 466 }
 467 
 468 /*
 469  * parse the format type I and III descriptors
 470  */
 471 static int parse_audio_format_i(struct snd_usb_audio *chip,
 472                                 struct audioformat *fp, u64 format,
 473                                 void *_fmt)
 474 {
 475         snd_pcm_format_t pcm_format;
 476         unsigned int fmt_type;
 477         int ret;
 478 
 479         switch (fp->protocol) {
 480         default:
 481         case UAC_VERSION_1:
 482         case UAC_VERSION_2: {
 483                 struct uac_format_type_i_continuous_descriptor *fmt = _fmt;
 484 
 485                 fmt_type = fmt->bFormatType;
 486                 break;
 487         }
 488         case UAC_VERSION_3: {
 489                 /* fp->fmt_type is already set in this case */
 490                 fmt_type = fp->fmt_type;
 491                 break;
 492         }
 493         }
 494 
 495         if (fmt_type == UAC_FORMAT_TYPE_III) {
 496                 /* FIXME: the format type is really IECxxx
 497                  *        but we give normal PCM format to get the existing
 498                  *        apps working...
 499                  */
 500                 switch (chip->usb_id) {
 501 
 502                 case USB_ID(0x0763, 0x2003): /* M-Audio Audiophile USB */
 503                         if (chip->setup == 0x00 && 
 504                             fp->altsetting == 6)
 505                                 pcm_format = SNDRV_PCM_FORMAT_S16_BE;
 506                         else
 507                                 pcm_format = SNDRV_PCM_FORMAT_S16_LE;
 508                         break;
 509                 default:
 510                         pcm_format = SNDRV_PCM_FORMAT_S16_LE;
 511                 }
 512                 fp->formats = pcm_format_to_bits(pcm_format);
 513         } else {
 514                 fp->formats = parse_audio_format_i_type(chip, fp, format, _fmt);
 515                 if (!fp->formats)
 516                         return -EINVAL;
 517         }
 518 
 519         /* gather possible sample rates */
 520         /* audio class v1 reports possible sample rates as part of the
 521          * proprietary class specific descriptor.
 522          * audio class v2 uses class specific EP0 range requests for that.
 523          */
 524         switch (fp->protocol) {
 525         default:
 526         case UAC_VERSION_1: {
 527                 struct uac_format_type_i_continuous_descriptor *fmt = _fmt;
 528 
 529                 fp->channels = fmt->bNrChannels;
 530                 ret = parse_audio_format_rates_v1(chip, fp, (unsigned char *) fmt, 7);
 531                 break;
 532         }
 533         case UAC_VERSION_2:
 534         case UAC_VERSION_3: {
 535                 /* fp->channels is already set in this case */
 536                 ret = parse_audio_format_rates_v2v3(chip, fp);
 537                 break;
 538         }
 539         }
 540 
 541         if (fp->channels < 1) {
 542                 usb_audio_err(chip,
 543                         "%u:%d : invalid channels %d\n",
 544                         fp->iface, fp->altsetting, fp->channels);
 545                 return -EINVAL;
 546         }
 547 
 548         return ret;
 549 }
 550 
 551 /*
 552  * parse the format type II descriptor
 553  */
 554 static int parse_audio_format_ii(struct snd_usb_audio *chip,
 555                                  struct audioformat *fp,
 556                                  u64 format, void *_fmt)
 557 {
 558         int brate, framesize, ret;
 559 
 560         switch (format) {
 561         case UAC_FORMAT_TYPE_II_AC3:
 562                 /* FIXME: there is no AC3 format defined yet */
 563                 // fp->formats = SNDRV_PCM_FMTBIT_AC3;
 564                 fp->formats = SNDRV_PCM_FMTBIT_U8; /* temporary hack to receive byte streams */
 565                 break;
 566         case UAC_FORMAT_TYPE_II_MPEG:
 567                 fp->formats = SNDRV_PCM_FMTBIT_MPEG;
 568                 break;
 569         default:
 570                 usb_audio_info(chip,
 571                          "%u:%d : unknown format tag %#llx is detected.  processed as MPEG.\n",
 572                          fp->iface, fp->altsetting, format);
 573                 fp->formats = SNDRV_PCM_FMTBIT_MPEG;
 574                 break;
 575         }
 576 
 577         fp->channels = 1;
 578 
 579         switch (fp->protocol) {
 580         default:
 581         case UAC_VERSION_1: {
 582                 struct uac_format_type_ii_discrete_descriptor *fmt = _fmt;
 583                 brate = le16_to_cpu(fmt->wMaxBitRate);
 584                 framesize = le16_to_cpu(fmt->wSamplesPerFrame);
 585                 usb_audio_info(chip, "found format II with max.bitrate = %d, frame size=%d\n", brate, framesize);
 586                 fp->frame_size = framesize;
 587                 ret = parse_audio_format_rates_v1(chip, fp, _fmt, 8); /* fmt[8..] sample rates */
 588                 break;
 589         }
 590         case UAC_VERSION_2: {
 591                 struct uac_format_type_ii_ext_descriptor *fmt = _fmt;
 592                 brate = le16_to_cpu(fmt->wMaxBitRate);
 593                 framesize = le16_to_cpu(fmt->wSamplesPerFrame);
 594                 usb_audio_info(chip, "found format II with max.bitrate = %d, frame size=%d\n", brate, framesize);
 595                 fp->frame_size = framesize;
 596                 ret = parse_audio_format_rates_v2v3(chip, fp);
 597                 break;
 598         }
 599         }
 600 
 601         return ret;
 602 }
 603 
 604 int snd_usb_parse_audio_format(struct snd_usb_audio *chip,
 605                                struct audioformat *fp, u64 format,
 606                                struct uac_format_type_i_continuous_descriptor *fmt,
 607                                int stream)
 608 {
 609         int err;
 610 
 611         switch (fmt->bFormatType) {
 612         case UAC_FORMAT_TYPE_I:
 613         case UAC_FORMAT_TYPE_III:
 614                 err = parse_audio_format_i(chip, fp, format, fmt);
 615                 break;
 616         case UAC_FORMAT_TYPE_II:
 617                 err = parse_audio_format_ii(chip, fp, format, fmt);
 618                 break;
 619         default:
 620                 usb_audio_info(chip,
 621                          "%u:%d : format type %d is not supported yet\n",
 622                          fp->iface, fp->altsetting,
 623                          fmt->bFormatType);
 624                 return -ENOTSUPP;
 625         }
 626         fp->fmt_type = fmt->bFormatType;
 627         if (err < 0)
 628                 return err;
 629 #if 1
 630         /* FIXME: temporary hack for extigy/audigy 2 nx/zs */
 631         /* extigy apparently supports sample rates other than 48k
 632          * but not in ordinary way.  so we enable only 48k atm.
 633          */
 634         if (chip->usb_id == USB_ID(0x041e, 0x3000) ||
 635             chip->usb_id == USB_ID(0x041e, 0x3020) ||
 636             chip->usb_id == USB_ID(0x041e, 0x3061)) {
 637                 if (fmt->bFormatType == UAC_FORMAT_TYPE_I &&
 638                     fp->rates != SNDRV_PCM_RATE_48000 &&
 639                     fp->rates != SNDRV_PCM_RATE_96000)
 640                         return -ENOTSUPP;
 641         }
 642 #endif
 643         return 0;
 644 }
 645 
 646 int snd_usb_parse_audio_format_v3(struct snd_usb_audio *chip,
 647                                struct audioformat *fp,
 648                                struct uac3_as_header_descriptor *as,
 649                                int stream)
 650 {
 651         u64 format = le64_to_cpu(as->bmFormats);
 652         int err;
 653 
 654         /*
 655          * Type I format bits are D0..D6
 656          * This test works because type IV is not supported
 657          */
 658         if (format & 0x7f)
 659                 fp->fmt_type = UAC_FORMAT_TYPE_I;
 660         else
 661                 fp->fmt_type = UAC_FORMAT_TYPE_III;
 662 
 663         err = parse_audio_format_i(chip, fp, format, as);
 664         if (err < 0)
 665                 return err;
 666 
 667         return 0;
 668 }

/* [<][>][^][v][top][bottom][index][help] */