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