Quellcodebibliothek Statistik Leitseite products/sources/formale Sprachen/C/Linux/sound/usb/   (Open Source Betriebssystem Version 6.17.9©)  Datei vom 24.10.2025 mit Größe 78 kB image not shown  

Quelle  quirks.c   Sprache: C

 
// SPDX-License-Identifier: GPL-2.0-or-later
/*
 */


#include <linux/init.h>
#include <linux/slab.h>
#include <linux/usb.h>
#include <linux/usb/audio.h>
#include <linux/usb/midi.h>
#include <linux/bits.h>

#include <sound/control.h>
#include <sound/core.h>
#include <sound/info.h>
#include <sound/pcm.h>

#include "usbaudio.h"
#include "card.h"
#include "mixer.h"
#include "mixer_quirks.h"
#include "midi.h"
#include "midi2.h"
#include "quirks.h"
#include "helper.h"
#include "endpoint.h"
#include "pcm.h"
#include "clock.h"
#include "stream.h"

/*
 * handle the quirks for the contained interfaces
 */

static int create_composite_quirk(struct snd_usb_audio *chip,
      struct usb_interface *iface,
      struct usb_driver *driver,
      const struct snd_usb_audio_quirk *quirk_comp)
{
 int probed_ifnum = get_iface_desc(iface->altsetting)->bInterfaceNumber;
 const struct snd_usb_audio_quirk *quirk;
 int err;

 for (quirk = quirk_comp->data; quirk->ifnum >= 0; ++quirk) {
  iface = usb_ifnum_to_if(chip->dev, quirk->ifnum);
  if (!iface)
   continue;
  if (quirk->ifnum != probed_ifnum &&
      usb_interface_claimed(iface))
   continue;
  err = snd_usb_create_quirk(chip, iface, driver, quirk);
  if (err < 0)
   return err;
 }

 for (quirk = quirk_comp->data; quirk->ifnum >= 0; ++quirk) {
  iface = usb_ifnum_to_if(chip->dev, quirk->ifnum);
  if (!iface)
   continue;
  if (quirk->ifnum != probed_ifnum &&
      !usb_interface_claimed(iface)) {
   err = usb_driver_claim_interface(driver, iface,
        USB_AUDIO_IFACE_UNUSED);
   if (err < 0)
    return err;
  }
 }

 return 0;
}

static int ignore_interface_quirk(struct snd_usb_audio *chip,
      struct usb_interface *iface,
      struct usb_driver *driver,
      const struct snd_usb_audio_quirk *quirk)
{
 return 0;
}


static int create_any_midi_quirk(struct snd_usb_audio *chip,
     struct usb_interface *intf,
     struct usb_driver *driver,
     const struct snd_usb_audio_quirk *quirk)
{
 return snd_usb_midi_v2_create(chip, intf, quirk, 0);
}

/*
 * create a stream for an interface with proper descriptors
 */

static int create_standard_audio_quirk(struct snd_usb_audio *chip,
           struct usb_interface *iface,
           struct usb_driver *driver,
           const struct snd_usb_audio_quirk *quirk)
{
 struct usb_host_interface *alts;
 struct usb_interface_descriptor *altsd;
 int err;

 alts = &iface->altsetting[0];
 altsd = get_iface_desc(alts);
 err = snd_usb_parse_audio_interface(chip, altsd->bInterfaceNumber);
 if (err < 0) {
  usb_audio_err(chip, "cannot setup if %d: error %d\n",
      altsd->bInterfaceNumber, err);
  return err;
 }
 /* reset the current interface */
 usb_set_interface(chip->dev, altsd->bInterfaceNumber, 0);
 return 0;
}

/* create the audio stream and the corresponding endpoints from the fixed
 * audioformat object; this is used for quirks with the fixed EPs
 */

static int add_audio_stream_from_fixed_fmt(struct snd_usb_audio *chip,
        struct audioformat *fp)
{
 int stream, err;

 stream = (fp->endpoint & USB_DIR_IN) ?
  SNDRV_PCM_STREAM_CAPTURE : SNDRV_PCM_STREAM_PLAYBACK;

 snd_usb_audioformat_set_sync_ep(chip, fp);

 err = snd_usb_add_audio_stream(chip, stream, fp);
 if (err < 0)
  return err;

 err = snd_usb_add_endpoint(chip, fp->endpoint,
       SND_USB_ENDPOINT_TYPE_DATA);
 if (err < 0)
  return err;

 if (fp->sync_ep) {
  err = snd_usb_add_endpoint(chip, fp->sync_ep,
        fp->implicit_fb ?
        SND_USB_ENDPOINT_TYPE_DATA :
        SND_USB_ENDPOINT_TYPE_SYNC);
  if (err < 0)
   return err;
 }

 return 0;
}

/*
 * create a stream for an endpoint/altsetting without proper descriptors
 */

static int create_fixed_stream_quirk(struct snd_usb_audio *chip,
         struct usb_interface *iface,
         struct usb_driver *driver,
         const struct snd_usb_audio_quirk *quirk)
{
 struct audioformat *fp;
 struct usb_host_interface *alts;
 struct usb_interface_descriptor *altsd;
 unsigned *rate_table = NULL;
 int err;

 fp = kmemdup(quirk->data, sizeof(*fp), GFP_KERNEL);
 if (!fp)
  return -ENOMEM;

 INIT_LIST_HEAD(&fp->list);
 if (fp->nr_rates > MAX_NR_RATES) {
  kfree(fp);
  return -EINVAL;
 }
 if (fp->nr_rates > 0) {
  rate_table = kmemdup_array(fp->rate_table, fp->nr_rates, sizeof(int),
        GFP_KERNEL);
  if (!rate_table) {
   kfree(fp);
   return -ENOMEM;
  }
  fp->rate_table = rate_table;
 }

 if (fp->iface != get_iface_desc(&iface->altsetting[0])->bInterfaceNumber ||
     fp->altset_idx >= iface->num_altsetting) {
  err = -EINVAL;
  goto error;
 }
 alts = &iface->altsetting[fp->altset_idx];
 altsd = get_iface_desc(alts);
 if (altsd->bNumEndpoints <= fp->ep_idx) {
  err = -EINVAL;
  goto error;
 }

 fp->protocol = altsd->bInterfaceProtocol;

 if (fp->datainterval == 0)
  fp->datainterval = snd_usb_parse_datainterval(chip, alts);
 if (fp->maxpacksize == 0)
  fp->maxpacksize = le16_to_cpu(get_endpoint(alts, fp->ep_idx)->wMaxPacketSize);
 if (!fp->fmt_type)
  fp->fmt_type = UAC_FORMAT_TYPE_I;

 err = add_audio_stream_from_fixed_fmt(chip, fp);
 if (err < 0)
  goto error;

 usb_set_interface(chip->dev, fp->iface, 0);
 snd_usb_init_pitch(chip, fp);
 snd_usb_init_sample_rate(chip, fp, fp->rate_max);
 return 0;

 error:
 list_del(&fp->list); /* unlink for avoiding double-free */
 kfree(fp);
 kfree(rate_table);
 return err;
}

static int create_auto_pcm_quirk(struct snd_usb_audio *chip,
     struct usb_interface *iface,
     struct usb_driver *driver)
{
 struct usb_host_interface *alts;
 struct usb_interface_descriptor *altsd;
 struct usb_endpoint_descriptor *epd;
 struct uac1_as_header_descriptor *ashd;
 struct uac_format_type_i_discrete_descriptor *fmtd;

 /*
 * Most Roland/Yamaha audio streaming interfaces have more or less
 * standard descriptors, but older devices might lack descriptors, and
 * future ones might change, so ensure that we fail silently if the
 * interface doesn't look exactly right.
 */


 /* must have a non-zero altsetting for streaming */
 if (iface->num_altsetting < 2)
  return -ENODEV;
 alts = &iface->altsetting[1];
 altsd = get_iface_desc(alts);

 /* must have an isochronous endpoint for streaming */
 if (altsd->bNumEndpoints < 1)
  return -ENODEV;
 epd = get_endpoint(alts, 0);
 if (!usb_endpoint_xfer_isoc(epd))
  return -ENODEV;

 /* must have format descriptors */
 ashd = snd_usb_find_csint_desc(alts->extra, alts->extralen, NULL,
           UAC_AS_GENERAL);
 fmtd = snd_usb_find_csint_desc(alts->extra, alts->extralen, NULL,
           UAC_FORMAT_TYPE);
 if (!ashd || ashd->bLength < 7 ||
     !fmtd || fmtd->bLength < 8)
  return -ENODEV;

 return create_standard_audio_quirk(chip, iface, driver, NULL);
}

static int create_yamaha_midi_quirk(struct snd_usb_audio *chip,
        struct usb_interface *iface,
        struct usb_driver *driver,
        struct usb_host_interface *alts)
{
 static const struct snd_usb_audio_quirk yamaha_midi_quirk = {
  .type = QUIRK_MIDI_YAMAHA
 };
 struct usb_midi_in_jack_descriptor *injd;
 struct usb_midi_out_jack_descriptor *outjd;

 /* must have some valid jack descriptors */
 injd = snd_usb_find_csint_desc(alts->extra, alts->extralen,
           NULL, USB_MS_MIDI_IN_JACK);
 outjd = snd_usb_find_csint_desc(alts->extra, alts->extralen,
     NULL, USB_MS_MIDI_OUT_JACK);
 if (!injd && !outjd)
  return -ENODEV;
 if ((injd && !snd_usb_validate_midi_desc(injd)) ||
     (outjd && !snd_usb_validate_midi_desc(outjd)))
  return -ENODEV;
 if (injd && (injd->bLength < 5 ||
       (injd->bJackType != USB_MS_EMBEDDED &&
        injd->bJackType != USB_MS_EXTERNAL)))
  return -ENODEV;
 if (outjd && (outjd->bLength < 6 ||
        (outjd->bJackType != USB_MS_EMBEDDED &&
         outjd->bJackType != USB_MS_EXTERNAL)))
  return -ENODEV;
 return create_any_midi_quirk(chip, iface, driver, &yamaha_midi_quirk);
}

static int create_roland_midi_quirk(struct snd_usb_audio *chip,
        struct usb_interface *iface,
        struct usb_driver *driver,
        struct usb_host_interface *alts)
{
 static const struct snd_usb_audio_quirk roland_midi_quirk = {
  .type = QUIRK_MIDI_ROLAND
 };
 u8 *roland_desc = NULL;

 /* might have a vendor-specific descriptor <06 24 F1 02 ...> */
 for (;;) {
  roland_desc = snd_usb_find_csint_desc(alts->extra,
            alts->extralen,
            roland_desc, 0xf1);
  if (!roland_desc)
   return -ENODEV;
  if (roland_desc[0] < 6 || roland_desc[3] != 2)
   continue;
  return create_any_midi_quirk(chip, iface, driver,
          &roland_midi_quirk);
 }
}

static int create_std_midi_quirk(struct snd_usb_audio *chip,
     struct usb_interface *iface,
     struct usb_driver *driver,
     struct usb_host_interface *alts)
{
 struct usb_ms_header_descriptor *mshd;
 struct usb_ms_endpoint_descriptor *msepd;

 /* must have the MIDIStreaming interface header descriptor*/
 mshd = (struct usb_ms_header_descriptor *)alts->extra;
 if (alts->extralen < 7 ||
     mshd->bLength < 7 ||
     mshd->bDescriptorType != USB_DT_CS_INTERFACE ||
     mshd->bDescriptorSubtype != USB_MS_HEADER)
  return -ENODEV;
 /* must have the MIDIStreaming endpoint descriptor*/
 msepd = (struct usb_ms_endpoint_descriptor *)alts->endpoint[0].extra;
 if (alts->endpoint[0].extralen < 4 ||
     msepd->bLength < 4 ||
     msepd->bDescriptorType != USB_DT_CS_ENDPOINT ||
     msepd->bDescriptorSubtype != UAC_MS_GENERAL ||
     msepd->bNumEmbMIDIJack < 1 ||
     msepd->bNumEmbMIDIJack > 16)
  return -ENODEV;

 return create_any_midi_quirk(chip, iface, driver, NULL);
}

static int create_auto_midi_quirk(struct snd_usb_audio *chip,
      struct usb_interface *iface,
      struct usb_driver *driver)
{
 struct usb_host_interface *alts;
 struct usb_interface_descriptor *altsd;
 struct usb_endpoint_descriptor *epd;
 int err;

 alts = &iface->altsetting[0];
 altsd = get_iface_desc(alts);

 /* must have at least one bulk/interrupt endpoint for streaming */
 if (altsd->bNumEndpoints < 1)
  return -ENODEV;
 epd = get_endpoint(alts, 0);
 if (!usb_endpoint_xfer_bulk(epd) &&
     !usb_endpoint_xfer_int(epd))
  return -ENODEV;

 switch (USB_ID_VENDOR(chip->usb_id)) {
 case 0x0499: /* Yamaha */
  err = create_yamaha_midi_quirk(chip, iface, driver, alts);
  if (err != -ENODEV)
   return err;
  break;
 case 0x0582: /* Roland */
  err = create_roland_midi_quirk(chip, iface, driver, alts);
  if (err != -ENODEV)
   return err;
  break;
 }

 return create_std_midi_quirk(chip, iface, driver, alts);
}

static int create_autodetect_quirk(struct snd_usb_audio *chip,
       struct usb_interface *iface,
       struct usb_driver *driver,
       const struct snd_usb_audio_quirk *quirk)
{
 int err;

 err = create_auto_pcm_quirk(chip, iface, driver);
 if (err == -ENODEV)
  err = create_auto_midi_quirk(chip, iface, driver);
 return err;
}

/*
 * Create a stream for an Edirol UA-700/UA-25/UA-4FX interface.  
 * The only way to detect the sample rate is by looking at wMaxPacketSize.
 */

static int create_uaxx_quirk(struct snd_usb_audio *chip,
        struct usb_interface *iface,
        struct usb_driver *driver,
        const struct snd_usb_audio_quirk *quirk)
{
 static const struct audioformat ua_format = {
  .formats = SNDRV_PCM_FMTBIT_S24_3LE,
  .channels = 2,
  .fmt_type = UAC_FORMAT_TYPE_I,
  .altsetting = 1,
  .altset_idx = 1,
  .rates = SNDRV_PCM_RATE_CONTINUOUS,
 };
 struct usb_host_interface *alts;
 struct usb_interface_descriptor *altsd;
 struct audioformat *fp;
 int err;

 /* both PCM and MIDI interfaces have 2 or more altsettings */
 if (iface->num_altsetting < 2)
  return -ENXIO;
 alts = &iface->altsetting[1];
 altsd = get_iface_desc(alts);

 if (altsd->bNumEndpoints == 2) {
  static const struct snd_usb_midi_endpoint_info ua700_ep = {
   .out_cables = 0x0003,
   .in_cables  = 0x0003
  };
  static const struct snd_usb_audio_quirk ua700_quirk = {
   .type = QUIRK_MIDI_FIXED_ENDPOINT,
   .data = &ua700_ep
  };
  static const struct snd_usb_midi_endpoint_info uaxx_ep = {
   .out_cables = 0x0001,
   .in_cables  = 0x0001
  };
  static const struct snd_usb_audio_quirk uaxx_quirk = {
   .type = QUIRK_MIDI_FIXED_ENDPOINT,
   .data = &uaxx_ep
  };
  const struct snd_usb_audio_quirk *quirk =
   chip->usb_id == USB_ID(0x0582, 0x002b)
   ? &ua700_quirk : &uaxx_quirk;
  return __snd_usbmidi_create(chip->card, iface,
         &chip->midi_list, quirk,
         chip->usb_id,
         &chip->num_rawmidis);
 }

 if (altsd->bNumEndpoints != 1)
  return -ENXIO;

 fp = kmemdup(&ua_format, sizeof(*fp), GFP_KERNEL);
 if (!fp)
  return -ENOMEM;

 fp->iface = altsd->bInterfaceNumber;
 fp->endpoint = get_endpoint(alts, 0)->bEndpointAddress;
 fp->ep_attr = get_endpoint(alts, 0)->bmAttributes;
 fp->datainterval = 0;
 fp->maxpacksize = le16_to_cpu(get_endpoint(alts, 0)->wMaxPacketSize);
 INIT_LIST_HEAD(&fp->list);

 switch (fp->maxpacksize) {
 case 0x120:
  fp->rate_max = fp->rate_min = 44100;
  break;
 case 0x138:
 case 0x140:
  fp->rate_max = fp->rate_min = 48000;
  break;
 case 0x258:
 case 0x260:
  fp->rate_max = fp->rate_min = 96000;
  break;
 default:
  usb_audio_err(chip, "unknown sample rate\n");
  kfree(fp);
  return -ENXIO;
 }

 err = add_audio_stream_from_fixed_fmt(chip, fp);
 if (err < 0) {
  list_del(&fp->list); /* unlink for avoiding double-free */
  kfree(fp);
  return err;
 }
 usb_set_interface(chip->dev, fp->iface, 0);
 return 0;
}

/*
 * Create a standard mixer for the specified interface.
 */

static int create_standard_mixer_quirk(struct snd_usb_audio *chip,
           struct usb_interface *iface,
           struct usb_driver *driver,
           const struct snd_usb_audio_quirk *quirk)
{
 if (quirk->ifnum < 0)
  return 0;

 return snd_usb_create_mixer(chip, quirk->ifnum);
}

/*
 * audio-interface quirks
 *
 * returns zero if no standard audio/MIDI parsing is needed.
 * returns a positive value if standard audio/midi interfaces are parsed
 * after this.
 * returns a negative value at error.
 */

int snd_usb_create_quirk(struct snd_usb_audio *chip,
    struct usb_interface *iface,
    struct usb_driver *driver,
    const struct snd_usb_audio_quirk *quirk)
{
 typedef int (*quirk_func_t)(struct snd_usb_audio *,
        struct usb_interface *,
        struct usb_driver *,
        const struct snd_usb_audio_quirk *);
 static const quirk_func_t quirk_funcs[] = {
  [QUIRK_IGNORE_INTERFACE] = ignore_interface_quirk,
  [QUIRK_COMPOSITE] = create_composite_quirk,
  [QUIRK_AUTODETECT] = create_autodetect_quirk,
  [QUIRK_MIDI_STANDARD_INTERFACE] = create_any_midi_quirk,
  [QUIRK_MIDI_FIXED_ENDPOINT] = create_any_midi_quirk,
  [QUIRK_MIDI_YAMAHA] = create_any_midi_quirk,
  [QUIRK_MIDI_ROLAND] = create_any_midi_quirk,
  [QUIRK_MIDI_MIDIMAN] = create_any_midi_quirk,
  [QUIRK_MIDI_NOVATION] = create_any_midi_quirk,
  [QUIRK_MIDI_RAW_BYTES] = create_any_midi_quirk,
  [QUIRK_MIDI_EMAGIC] = create_any_midi_quirk,
  [QUIRK_MIDI_CME] = create_any_midi_quirk,
  [QUIRK_MIDI_AKAI] = create_any_midi_quirk,
  [QUIRK_MIDI_FTDI] = create_any_midi_quirk,
  [QUIRK_MIDI_CH345] = create_any_midi_quirk,
  [QUIRK_AUDIO_STANDARD_INTERFACE] = create_standard_audio_quirk,
  [QUIRK_AUDIO_FIXED_ENDPOINT] = create_fixed_stream_quirk,
  [QUIRK_AUDIO_EDIROL_UAXX] = create_uaxx_quirk,
  [QUIRK_AUDIO_STANDARD_MIXER] = create_standard_mixer_quirk,
 };

 if (quirk->type < QUIRK_TYPE_COUNT) {
  return quirk_funcs[quirk->type](chip, iface, driver, quirk);
 } else {
  usb_audio_err(chip, "invalid quirk type %d\n", quirk->type);
  return -ENXIO;
 }
}

/*
 * boot quirks
 */


#define EXTIGY_FIRMWARE_SIZE_OLD 794
#define EXTIGY_FIRMWARE_SIZE_NEW 483

static int snd_usb_extigy_boot_quirk(struct usb_device *dev, struct usb_interface *intf)
{
 struct usb_host_config *config = dev->actconfig;
 struct usb_device_descriptor *new_device_descriptor __free(kfree) = NULL;
 int err;

 if (le16_to_cpu(get_cfg_desc(config)->wTotalLength) == EXTIGY_FIRMWARE_SIZE_OLD ||
     le16_to_cpu(get_cfg_desc(config)->wTotalLength) == EXTIGY_FIRMWARE_SIZE_NEW) {
  dev_dbg(&dev->dev, "sending Extigy boot sequence...\n");
  /* Send message to force it to reconnect with full interface. */
  err = snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev,0),
          0x10, 0x43, 0x0001, 0x000a, NULL, 0);
  if (err < 0)
   dev_dbg(&dev->dev, "error sending boot message: %d\n", err);

  new_device_descriptor = kmalloc(sizeof(*new_device_descriptor), GFP_KERNEL);
  if (!new_device_descriptor)
   return -ENOMEM;
  err = usb_get_descriptor(dev, USB_DT_DEVICE, 0,
    new_device_descriptor, sizeof(*new_device_descriptor));
  if (err < 0)
   dev_dbg(&dev->dev, "error usb_get_descriptor: %d\n", err);
  if (new_device_descriptor->bNumConfigurations > dev->descriptor.bNumConfigurations)
   dev_dbg(&dev->dev, "error too large bNumConfigurations: %d\n",
    new_device_descriptor->bNumConfigurations);
  else
   memcpy(&dev->descriptor, new_device_descriptor, sizeof(dev->descriptor));
  err = usb_reset_configuration(dev);
  if (err < 0)
   dev_dbg(&dev->dev, "error usb_reset_configuration: %d\n", err);
  dev_dbg(&dev->dev, "extigy_boot: new boot length = %d\n",
       le16_to_cpu(get_cfg_desc(config)->wTotalLength));
  return -ENODEV; /* quit this anyway */
 }
 return 0;
}

static int snd_usb_audigy2nx_boot_quirk(struct usb_device *dev)
{
 u8 buf = 1;

 snd_usb_ctl_msg(dev, usb_rcvctrlpipe(dev, 0), 0x2a,
   USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_OTHER,
   0, 0, &buf, 1);
 if (buf == 0) {
  snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0), 0x29,
    USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER,
    1, 2000, NULL, 0);
  return -ENODEV;
 }
 return 0;
}

static int snd_usb_fasttrackpro_boot_quirk(struct usb_device *dev)
{
 int err;

 if (dev->actconfig->desc.bConfigurationValue == 1) {
  dev_info(&dev->dev,
      "Fast Track Pro switching to config #2\n");
  /* This function has to be available by the usb core module.
 * if it is not avialable the boot quirk has to be left out
 * and the configuration has to be set by udev or hotplug
 * rules
 */

  err = usb_driver_set_configuration(dev, 2);
  if (err < 0)
   dev_dbg(&dev->dev,
    "error usb_driver_set_configuration: %d\n",
    err);
  /* Always return an error, so that we stop creating a device
   that will just be destroyed and recreated with a new
   configuration */

  return -ENODEV;
 } else
  dev_info(&dev->dev, "Fast Track Pro config OK\n");

 return 0;
}

/*
 * C-Media CM106/CM106+ have four 16-bit internal registers that are nicely
 * documented in the device's data sheet.
 */

static int snd_usb_cm106_write_int_reg(struct usb_device *dev, int reg, u16 value)
{
 u8 buf[4];
 buf[0] = 0x20;
 buf[1] = value & 0xff;
 buf[2] = (value >> 8) & 0xff;
 buf[3] = reg;
 return snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0), USB_REQ_SET_CONFIGURATION,
          USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_ENDPOINT,
          0, 0, &buf, 4);
}

static int snd_usb_cm106_boot_quirk(struct usb_device *dev)
{
 /*
 * Enable line-out driver mode, set headphone source to front
 * channels, enable stereo mic.
 */

 return snd_usb_cm106_write_int_reg(dev, 2, 0x8004);
}

/*
 * CM6206 registers from the CM6206 datasheet rev 2.1
 */

#define CM6206_REG0_DMA_MASTER BIT(15)
#define CM6206_REG0_SPDIFO_RATE_48K (2 << 12)
#define CM6206_REG0_SPDIFO_RATE_96K (7 << 12)
/* Bit 4 thru 11 is the S/PDIF category code */
#define CM6206_REG0_SPDIFO_CAT_CODE_GENERAL (0 << 4)
#define CM6206_REG0_SPDIFO_EMPHASIS_CD BIT(3)
#define CM6206_REG0_SPDIFO_COPYRIGHT_NA BIT(2)
#define CM6206_REG0_SPDIFO_NON_AUDIO BIT(1)
#define CM6206_REG0_SPDIFO_PRO_FORMAT BIT(0)

#define CM6206_REG1_TEST_SEL_CLK BIT(14)
#define CM6206_REG1_PLLBIN_EN BIT(13)
#define CM6206_REG1_SOFT_MUTE_EN BIT(12)
#define CM6206_REG1_GPIO4_OUT BIT(11)
#define CM6206_REG1_GPIO4_OE BIT(10)
#define CM6206_REG1_GPIO3_OUT BIT(9)
#define CM6206_REG1_GPIO3_OE BIT(8)
#define CM6206_REG1_GPIO2_OUT BIT(7)
#define CM6206_REG1_GPIO2_OE BIT(6)
#define CM6206_REG1_GPIO1_OUT BIT(5)
#define CM6206_REG1_GPIO1_OE BIT(4)
#define CM6206_REG1_SPDIFO_INVALID BIT(3)
#define CM6206_REG1_SPDIF_LOOP_EN BIT(2)
#define CM6206_REG1_SPDIFO_DIS BIT(1)
#define CM6206_REG1_SPDIFI_MIX BIT(0)

#define CM6206_REG2_DRIVER_ON BIT(15)
#define CM6206_REG2_HEADP_SEL_SIDE_CHANNELS (0 << 13)
#define CM6206_REG2_HEADP_SEL_SURROUND_CHANNELS (1 << 13)
#define CM6206_REG2_HEADP_SEL_CENTER_SUBW (2 << 13)
#define CM6206_REG2_HEADP_SEL_FRONT_CHANNELS (3 << 13)
#define CM6206_REG2_MUTE_HEADPHONE_RIGHT BIT(12)
#define CM6206_REG2_MUTE_HEADPHONE_LEFT BIT(11)
#define CM6206_REG2_MUTE_REAR_SURROUND_RIGHT BIT(10)
#define CM6206_REG2_MUTE_REAR_SURROUND_LEFT BIT(9)
#define CM6206_REG2_MUTE_SIDE_SURROUND_RIGHT BIT(8)
#define CM6206_REG2_MUTE_SIDE_SURROUND_LEFT BIT(7)
#define CM6206_REG2_MUTE_SUBWOOFER BIT(6)
#define CM6206_REG2_MUTE_CENTER BIT(5)
#define CM6206_REG2_MUTE_RIGHT_FRONT BIT(3)
#define CM6206_REG2_MUTE_LEFT_FRONT BIT(3)
#define CM6206_REG2_EN_BTL BIT(2)
#define CM6206_REG2_MCUCLKSEL_1_5_MHZ (0)
#define CM6206_REG2_MCUCLKSEL_3_MHZ (1)
#define CM6206_REG2_MCUCLKSEL_6_MHZ (2)
#define CM6206_REG2_MCUCLKSEL_12_MHZ (3)

/* Bit 11..13 sets the sensitivity to FLY tuner volume control VP/VD signal */
#define CM6206_REG3_FLYSPEED_DEFAULT (2 << 11)
#define CM6206_REG3_VRAP25EN BIT(10)
#define CM6206_REG3_MSEL1 BIT(9)
#define CM6206_REG3_SPDIFI_RATE_44_1K BIT(0 << 7)
#define CM6206_REG3_SPDIFI_RATE_48K BIT(2 << 7)
#define CM6206_REG3_SPDIFI_RATE_32K BIT(3 << 7)
#define CM6206_REG3_PINSEL BIT(6)
#define CM6206_REG3_FOE BIT(5)
#define CM6206_REG3_ROE BIT(4)
#define CM6206_REG3_CBOE BIT(3)
#define CM6206_REG3_LOSE BIT(2)
#define CM6206_REG3_HPOE BIT(1)
#define CM6206_REG3_SPDIFI_CANREC BIT(0)

#define CM6206_REG5_DA_RSTN BIT(13)
#define CM6206_REG5_AD_RSTN BIT(12)
#define CM6206_REG5_SPDIFO_AD2SPDO BIT(12)
#define CM6206_REG5_SPDIFO_SEL_FRONT (0 << 9)
#define CM6206_REG5_SPDIFO_SEL_SIDE_SUR (1 << 9)
#define CM6206_REG5_SPDIFO_SEL_CEN_LFE (2 << 9)
#define CM6206_REG5_SPDIFO_SEL_REAR_SUR (3 << 9)
#define CM6206_REG5_CODECM BIT(8)
#define CM6206_REG5_EN_HPF BIT(7)
#define CM6206_REG5_T_SEL_DSDA4 BIT(6)
#define CM6206_REG5_T_SEL_DSDA3 BIT(5)
#define CM6206_REG5_T_SEL_DSDA2 BIT(4)
#define CM6206_REG5_T_SEL_DSDA1 BIT(3)
#define CM6206_REG5_T_SEL_DSDAD_NORMAL 0
#define CM6206_REG5_T_SEL_DSDAD_FRONT 4
#define CM6206_REG5_T_SEL_DSDAD_S_SURROUND 5
#define CM6206_REG5_T_SEL_DSDAD_CEN_LFE 6
#define CM6206_REG5_T_SEL_DSDAD_R_SURROUND 7

static int snd_usb_cm6206_boot_quirk(struct usb_device *dev)
{
 int err  = 0, reg;
 int val[] = {
  /*
 * Values here are chosen based on sniffing USB traffic
 * under Windows.
 *
 * REG0: DAC is master, sample rate 48kHz, no copyright
 */

  CM6206_REG0_SPDIFO_RATE_48K |
  CM6206_REG0_SPDIFO_COPYRIGHT_NA,
  /*
 * REG1: PLL binary search enable, soft mute enable.
 */

  CM6206_REG1_PLLBIN_EN |
  CM6206_REG1_SOFT_MUTE_EN,
  /*
 * REG2: enable output drivers,
 * select front channels to the headphone output,
 * then mute the headphone channels, run the MCU
 * at 1.5 MHz.
 */

  CM6206_REG2_DRIVER_ON |
  CM6206_REG2_HEADP_SEL_FRONT_CHANNELS |
  CM6206_REG2_MUTE_HEADPHONE_RIGHT |
  CM6206_REG2_MUTE_HEADPHONE_LEFT,
  /*
 * REG3: default flyspeed, set 2.5V mic bias
 * enable all line out ports and enable SPDIF
 */

  CM6206_REG3_FLYSPEED_DEFAULT |
  CM6206_REG3_VRAP25EN |
  CM6206_REG3_FOE |
  CM6206_REG3_ROE |
  CM6206_REG3_CBOE |
  CM6206_REG3_LOSE |
  CM6206_REG3_HPOE |
  CM6206_REG3_SPDIFI_CANREC,
  /* REG4 is just a bunch of GPIO lines */
  0x0000,
  /* REG5: de-assert AD/DA reset signals */
  CM6206_REG5_DA_RSTN |
  CM6206_REG5_AD_RSTN };

 for (reg = 0; reg < ARRAY_SIZE(val); reg++) {
  err = snd_usb_cm106_write_int_reg(dev, reg, val[reg]);
  if (err < 0)
   return err;
 }

 return err;
}

/* quirk for Plantronics GameCom 780 with CM6302 chip */
static int snd_usb_gamecon780_boot_quirk(struct usb_device *dev)
{
 /* set the initial volume and don't change; other values are either
 * too loud or silent due to firmware bug (bko#65251)
 */

 u8 buf[2] = { 0x74, 0xe3 };
 return snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0), UAC_SET_CUR,
   USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_OUT,
   UAC_FU_VOLUME << 8, 9 << 8, buf, 2);
}

/*
 * Novation Twitch DJ controller
 * Focusrite Novation Saffire 6 USB audio card
 */

static int snd_usb_novation_boot_quirk(struct usb_device *dev)
{
 /* preemptively set up the device because otherwise the
 * raw MIDI endpoints are not active */

 usb_set_interface(dev, 0, 1);
 return 0;
}

/*
 * This call will put the synth in "USB send" mode, i.e it will send MIDI
 * messages through USB (this is disabled at startup). The synth will
 * acknowledge by sending a sysex on endpoint 0x85 and by displaying a USB
 * sign on its LCD. Values here are chosen based on sniffing USB traffic
 * under Windows.
 */

static int snd_usb_accessmusic_boot_quirk(struct usb_device *dev)
{
 int err, actual_length;
 /* "midi send" enable */
 static const u8 seq[] = { 0x4e, 0x73, 0x52, 0x01 };
 void *buf;

 if (usb_pipe_type_check(dev, usb_sndintpipe(dev, 0x05)))
  return -EINVAL;
 buf = kmemdup(seq, ARRAY_SIZE(seq), GFP_KERNEL);
 if (!buf)
  return -ENOMEM;
 err = usb_interrupt_msg(dev, usb_sndintpipe(dev, 0x05), buf,
   ARRAY_SIZE(seq), &actual_length, 1000);
 kfree(buf);
 if (err < 0)
  return err;

 return 0;
}

/*
 * Some sound cards from Native Instruments are in fact compliant to the USB
 * audio standard of version 2 and other approved USB standards, even though
 * they come up as vendor-specific device when first connected.
 *
 * However, they can be told to come up with a new set of descriptors
 * upon their next enumeration, and the interfaces announced by the new
 * descriptors will then be handled by the kernel's class drivers. As the
 * product ID will also change, no further checks are required.
 */


static int snd_usb_nativeinstruments_boot_quirk(struct usb_device *dev)
{
 int ret;

 ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
      0xaf, USB_TYPE_VENDOR | USB_RECIP_DEVICE,
      1, 0, NULL, 0, 1000);

 if (ret < 0)
  return ret;

 usb_reset_device(dev);

 /* return -EAGAIN, so the creation of an audio interface for this
 * temporary device is aborted. The device will reconnect with a
 * new product ID */

 return -EAGAIN;
}

static void mbox2_setup_48_24_magic(struct usb_device *dev)
{
 u8 srate[3];
 u8 temp[12];

 /* Choose 48000Hz permanently */
 srate[0] = 0x80;
 srate[1] = 0xbb;
 srate[2] = 0x00;

 /* Send the magic! */
 snd_usb_ctl_msg(dev, usb_rcvctrlpipe(dev, 0),
  0x01, 0x22, 0x0100, 0x0085, &temp, 0x0003);
 snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
  0x81, 0xa2, 0x0100, 0x0085, &srate, 0x0003);
 snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
  0x81, 0xa2, 0x0100, 0x0086, &srate, 0x0003);
 snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
  0x81, 0xa2, 0x0100, 0x0003, &srate, 0x0003);
 return;
}

/* Digidesign Mbox 2 needs to load firmware onboard
 * and driver must wait a few seconds for initialisation.
 */


#define MBOX2_FIRMWARE_SIZE    646
#define MBOX2_BOOT_LOADING     0x01 /* Hard coded into the device */
#define MBOX2_BOOT_READY       0x02 /* Hard coded into the device */

static int snd_usb_mbox2_boot_quirk(struct usb_device *dev)
{
 struct usb_host_config *config = dev->actconfig;
 struct usb_device_descriptor *new_device_descriptor __free(kfree) = NULL;
 int err;
 u8 bootresponse[0x12];
 int fwsize;
 int count;

 fwsize = le16_to_cpu(get_cfg_desc(config)->wTotalLength);

 if (fwsize != MBOX2_FIRMWARE_SIZE) {
  dev_err(&dev->dev, "Invalid firmware size=%d.\n", fwsize);
  return -ENODEV;
 }

 dev_dbg(&dev->dev, "Sending Digidesign Mbox 2 boot sequence...\n");

 count = 0;
 bootresponse[0] = MBOX2_BOOT_LOADING;
 while ((bootresponse[0] == MBOX2_BOOT_LOADING) && (count < 10)) {
  msleep(500); /* 0.5 second delay */
  snd_usb_ctl_msg(dev, usb_rcvctrlpipe(dev, 0),
   /* Control magic - load onboard firmware */
   0x85, 0xc0, 0x0001, 0x0000, &bootresponse, 0x0012);
  if (bootresponse[0] == MBOX2_BOOT_READY)
   break;
  dev_dbg(&dev->dev, "device not ready, resending boot sequence...\n");
  count++;
 }

 if (bootresponse[0] != MBOX2_BOOT_READY) {
  dev_err(&dev->dev, "Unknown bootresponse=%d, or timed out, ignoring device.\n", bootresponse[0]);
  return -ENODEV;
 }

 dev_dbg(&dev->dev, "device initialised!\n");

 new_device_descriptor = kmalloc(sizeof(*new_device_descriptor), GFP_KERNEL);
 if (!new_device_descriptor)
  return -ENOMEM;

 err = usb_get_descriptor(dev, USB_DT_DEVICE, 0,
  new_device_descriptor, sizeof(*new_device_descriptor));
 if (err < 0)
  dev_dbg(&dev->dev, "error usb_get_descriptor: %d\n", err);
 if (new_device_descriptor->bNumConfigurations > dev->descriptor.bNumConfigurations)
  dev_dbg(&dev->dev, "error too large bNumConfigurations: %d\n",
   new_device_descriptor->bNumConfigurations);
 else
  memcpy(&dev->descriptor, new_device_descriptor, sizeof(dev->descriptor));

 rr = usb_reset_configuration(dev);
 if (err < 0)
  dev_dbg(&dev->dev, "error usb_reset_configuration: %d\n", err);
 dev_dbg(&dev->dev, "mbox2_boot: new boot length = %d\n",
  le16_to_cpu(get_cfg_desc(config)->wTotalLength));

 mbox2_setup_48_24_magic(dev);

 dev_info(&dev->dev, "Digidesign Mbox 2: 24bit 48kHz");

 return 0; /* Successful boot */
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0

intstruct *
quirks
 int;

dev_dbgdev->," forAxe-Fx IIItoboot ..\n");

 /* If the Axe-Fx III has not fully booted, it will timeout when trying
 * to enable the audio streaming interface. A more generous timeout is
 * used here to detect when the Axe-Fx III has finished booting as the
 * set interface message will be acked once it has
 */

 err =usb_control_msg(, usb_sndctrlpipe(dev 0,
    USB_REQ_SET_INTERFACE, USB_RECIP_INTERFACE,
   1 1 NULL, 0,12000);
 if (errjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
 (&>,
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
 eturn;
 }

dev_dbg(dev-dev Axe-Fxis\")

   (, ,0;
 if (err < 0)
  dev_dbg(&dev->dev,
   "error stopping Axe-Fx III interface: %d\n", err);

 return ;
}

static void mbox3_setup_defaults(struct usb_device *dev)
{
 /* The Mbox 3 is "little endian" */
 /* max volume is: 0x0000. */   continue  err = snd_usb_create_quirk(chip,   if 
 /* min volume is: 0x0080 (shown in little endian form) */

 u8 com_buff[2];

    return java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
 /* on  = 0x01*/
 /* off = 0x00*/
 com_buff[0] = 0x00;
 snd_usb_ctl_msg(dev usb_sndctrlpipedev 0,
  0x01, 0x21, 0x0003, 0x2001, &com_buff, 1);

 /* Set clock source to Internal (as opposed to S/PDIF) */
 /* Internal  = 0x01*/
 /* S/PDIF    = 0x02*/
 com_buff          structusb_driver *,
snd_usb_ctl_msgdev (dev 0,
   1, 0x21{

 /* Mute the hardware loopbacks to start the device in a known state. */
 com_buff[0] = 0x00;
 com_buff[1] = 0x80;
 /* Analogue input 1 left channel: */ structusb_interface_descriptor*ltsd
snd_usb_ctl_msg(, usb_sndctrlpipe(dev, 0,
   ,0, 0x01100x4001 &om_buff )java.lang.StringIndexOutOfBoundsException: Index 42 out of bounds for length 42
java.lang.StringIndexOutOfBoundsException: Range [38, 39) out of bounds for length 38
 nd_usb_ctl_msg(, usb_sndctrlpipe(dev 0,
   1, 0x21, 0x0111, 0x4001, &com_buff, 2);
 /* Analogue input 2 left channel: */
 nd_usb_ctl_msgdev,usb_sndctrlpipe(, 0)java.lang.StringIndexOutOfBoundsException: Index 46 out of bounds for length 46
 *
 input  rightchannel: *
 snd_usb_ctl_msg(, usb_sndctrlpipedev 0)java.lang.StringIndexOutOfBoundsException: Index 46 out of bounds for length 46
 , 2);
  SNDRV_PCM_STREAM_CAPTURE : SNDRV_PCM_STREAM_PLAYBACK;
 snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
   1, 0x21, 0x0118, 0x4001, &com_buff, 2);
 /* Analogue input 3 right channel: */
 snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev
   1, 0x21, 0x0119, 0x4001, &com_buff, 2);
 /* Analogue input 4 left channel: */
 nd_usb_ctl_msgdev,usb_sndctrlpipe(, )java.lang.StringIndexOutOfBoundsException: Index 46 out of bounds for length 46
  ,0x210, &, 2;
 /* Analogue input 4 right channel: */
 snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
   1, 0x21, 0x011d, 0x4001, &com_buff, 2);

 /* Set software sends to output */
 com_buff[0] = 0x00;
 com_buff[1] = 0x00;
 /* Analogue software return 1 left channel: */
 snd_usb_ctl_msg(,usb_sndctrlpipedev, 0,
   1, 0x21, 0x0100, 0x4001, &com_buff, 2);
 com_buff[0] = 0x00;
 com_buff1]=0x80
 /* Analogue software return 1 right channel: */
 snd_usb_ctl_msg(, usb_sndctrlpipedev 0,
   1, 0x21, 0x0101, 0x4001, &com_buff, 2);
 com_buff[0] = 0x00;
 com_buff[1] = 0x80;
   if(rr<0java.lang.StringIndexOutOfBoundsException: Index 14 out of bounds for length 14
 int (struct snd_usb_audio *hip,
  1,02, x01040x4001 &com_buff,2;
 com_buff[0] = 0x00;
 com_buff[1] = 0x00;
 /* Analogue software return 2 right channel: */
 snd_usb_ctl_msgdev usb_sndctrlpipedev 0
   1 0x21, 0x0105, 0x4001 com_buff 2

com_buff]=0;
com_buff=x80
 left: /
 snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
   1, 0x21, 0x0108, 0x4001, &com_buff, 2);
/* Analogue software return 3 right channel: */
(dev dev 0)java.lang.StringIndexOutOfBoundsException: Index 46 out of bounds for length 46
  ,,0,0, com_buff 2;
 /* Analogue software return 4 left channel: */
 snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
   , 0x21, 0x010c,0,&, 2);
 /* Analogue software return 4 right channel: */
 snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
  1,0, 0, 0, &, 2;

 /* Return to muting sends */
 com_buff[0] = 0x00;
 [1]= x80
 /* Analogue fx return left channel: */
 java.lang.StringIndexOutOfBoundsException: Index 5 out of bounds for length 0
  ,0x21, 0x01200x4001,&, 2);
 /* Analogue fx return right channel: */ =EINVAL
 snd_usb_ctl_msgalts= &>altsettingfp-];
   1, 0x210x0121, 0x4001 &, 2);

 /* Analogue software input 1 fx send: */
 snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
   1, 0x21, 0x0100, 0x4201, &com_buff, 2);
 /* Analogue software input 2 fx send: */ gotoerror;
snd_usb_ctl_msgdev,(dev,0,
   1 0x21, 0, 0, com_buff 2;
 /* Analogue software input 3 fx send: */
 snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
   1, 0x21, 0x0102, 0x4201,   fp-datainterval=snd_usb_parse_dataintervalchipalts);
 /* Analogue software input 4 fx send: */> = (get_endpoint(, >ep_idx)-wMaxPacketSize)
 fp-fmt_type UAC_FORMAT_TYPE_I;
0x21,x0103 x4201 &com_buff,2;
/* Analogueinput1  send /
 (,usb_sndctrlpipe(dev )java.lang.StringIndexOutOfBoundsException: Index 46 out of bounds for length 46
 , x21 000,0, &, )
 /* Analogue input 2 fx send: */
 snd_usb_ctl_msg(dev struct iface
   structusb_host_interface*alts
 /* Analogue input 3 fx send: */
 snd_usb_ctl_msgdev (dev,0,
   1,0,x01060, &, 2;
 /* Analogue input 4 fx send: */
 snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
   1, 0x21, 0x0107, 0x4201, &com_buff, 2);

 /*
/* Not needed
com_buff[0] = 0x02;
snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
3, 0x21, 0x0000, 0x2001, &com_buff, 1);
 */


 /* Do not dim fx returns */
 com_buff[0]  ififace- < )
 snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
   3, 0x21, 0x0002, 0x2001, &com_buff, 1);

 /* Do not set fx returns to mono */
 com_buff
 snd_usb_ctl_msg(dev, usb_sndctrlpipe(devif(altsd->bNumEndpoints <1java.lang.StringIndexOutOfBoundsException: Index 30 out of bounds for length 30
  3 x21 001, 0x2001 &, 1);

tethe / hardware
  * same odd volume if(! || ashd-bLength <  |java.lang.StringIndexOutOfBoundsException: Index 34 out of bounds for length 34
  /
 com_buff[0] = 0x00;
 com_buff intcreate_yamaha_midi_quirkstructsnd_usb_audio *,
 /* S/PDIF hardware input 1 left channel */
 snd_usb_ctl_msg(dev, usb_sndctrlpipe      struct usb_host_interface *)
   1 02, 0x0112,0x4001, &, 2;
 /* S/PDIF hardware input 1 right channel */
snd_usb_ctl_msg,usb_sndctrlpipedev )java.lang.StringIndexOutOfBoundsException: Index 46 out of bounds for length 46
 1 x21x0113, x4001&com_buff,2)java.lang.StringIndexOutOfBoundsException: Index 42 out of bounds for length 42
    NULL )
snd_usb_ctl_msg,(,0)java.lang.StringIndexOutOfBoundsException: Index 46 out of bounds for length 46
  ,x21, x0116 0x4001,&om_buff,2)
 /* S/PDIF hardware input 2 right channel */))
 snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
   1, 0x21, 0x0117, 0x4001, &com_buff, 2);
 /* S/PDIF hardware input 3 left channel */
 snd_usb_ctl_msg(ev,usb_sndctrlpipe(dev, 0),
   1 0x21, 0, 0, &com_buff, 2)java.lang.StringIndexOutOfBoundsException: Index 42 out of bounds for length 42
/* S/PDIF hardware input 3 right channel */
 snd_usb_ctl_msg(ev, usb_sndctrlpipedev,0)),
   1, 0x21 if(utjd& outjd-bLength <  |
 /* S/PDIF hardware input 4 left channel */
 snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
   1, 0x21, 0x011e, 0x4001, &com_buff, 2);
 
snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
1, 0x21, 0x011f, 0x4001, &com_buff, 2);
/* S/PDIF software return 1 left channel */

 snd_usb_ctl_msg  return ENODEV
   1 0, 0x0102x4001 &, )java.lang.StringIndexOutOfBoundsException: Index 42 out of bounds for length 42
 /* S/PDIF software return 1 right channel */
snd_usb_ctl_msgdevusb_sndctrlpipe,0,
   1, 0x21, 0x0103, 0x4001, &com_buff, 2);
 /* S/PDIF software return 2 left channel */
snd_usb_ctl_msgdev usb_sndctrlpipedev )
   1, 0x21, 0x0106, 0x4001, &com_buff, 2);
 /* S/PDIF software return 2 right channel */
 snd_usb_ctl_msg(dev{
 1, 02,0, x4001,&com_buff,2;

 com_buff[ 8* =NULL;
 com_buff[1]  0;
  for (;;) {
snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
1, 0x21, 0x010a, 0x4001, &com_buff, 2);

com_buff[0] = 0x00;
com_buff[1] = 0x80;
/* S/PDIF software return 3 right channel */

 snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
   , 0x21, 0x010b,0x4001,&om_buff, 2;
 
snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
1, 0x21, 0x010e, 0x4001, &com_buff, 2);

com_buff[0] = 0x00;
com_buff[1] = 0x00;
/* S/PDIF software return 4 right channel */

 snd_usb_ctl_msgdev,usb_sndctrlpipedev 0),
   , x21 001f 0401 com_buff);

 com_buff[0] = 0x00;
 com_buff[1] = 0x80;
 /* S/PDIF fx returns left channel */
 snd_usb_ctl_msgdev, usb_sndctrlpipedev, 0),
  1 x21 x0122 0x4001, &, 2)java.lang.StringIndexOutOfBoundsException: Index 42 out of bounds for length 42
 /* S/PDIF fx returns right channel */   structusb_interface *,
 snd_usb_ctl_msg(dev, usb_sndctrlpipe(     usb_host_interface *)
  , 021 0, 0x4001,&com_buff, 2)java.lang.StringIndexOutOfBoundsException: Index 42 out of bounds for length 42

 /* Set the dropdown "Effect" to the first option */
/
 /* Room2  = 0x01 */ f (>extralen<7||
 /* Room3  = 0x02 */
 /* Hall 1 = 0x03 */
 /* Hall 2 = 0x04 */
 /* Plate  = 0x05 */
 /* Delay  = 0x06 */
/* Echo   = 0x07 */
 [ =0x00
 snd_usb_ctl_msg(dev, usb_sndctrlpipedev, 0)java.lang.StringIndexOutOfBoundsException: Index 46 out of bounds for length 46
   1 0, x0200 x4301 com_buff 1 /* max is 0xff */
 /* min is 0x00 */


 /* Set the effect duration to 0 */
 /* max is 0xffff */
 /* min is 0x0000 */ msepd-bLength  java.lang.StringIndexOutOfBoundsException: Index 26 out of bounds for length 26
 com_buff0 =0;
 com_buff    msepd-> > 16)
 snd_usb_ctl_msgdev (dev 0,
   1, 0x21, 0x0400, 0x4301, &com_buff, 2);

 /* Set the effect volume and feedback to 0 */
 /* max is 0xff */
 /* min is 0x00 */
 com_buff[0] = 0x00;
 /* feedback: */
 snd_usb_ctl_msg(, usb_sndctrlpipedev,0,
   1, 0x21, 0x0500, 0x4301, &com_buff, 1);
/
 snd_usb_ctl_msg(dev,usb_sndctrlpipedev,)java.lang.StringIndexOutOfBoundsException: Index 46 out of bounds for length 46
  usb_interface_descriptoraltsd;

 /* Set soft button hold duration */
 /* 0x03 = 250ms */
 /* 0x05 = 500ms DEFAULT */
 /* 0x08 = 750ms */
 /* 0x0a = 1sec */alts=&>altsetting[0]
 []  x05;
 snd_usb_ctl_msgdev, (dev 0,
   3, 0x21, 0x0005, 0x2001, &com_buff, 1);

 /* Use dim LEDs for button of state */
 [] = 0x00java.lang.StringIndexOutOfBoundsException: Index 20 out of bounds for length 20
 snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev,0,
   3, 0x21, 0x0004, 0x2001, &com_buff, 1);
}

#define 

static int snd_usb_mbox3_boot_quirk(struct usb_device *dev)
{
 struct usb_host_config ase0: /* Yamaha */
 struct usb_device_descriptor *ew_device_descriptor_freekfree =NULL;
 int err;
 int descriptor_size;

 descriptor_size = le16_to_cpu(get_cfg_desc(config)->wTotalLength);

 if (descriptor_size != MBOX3_DESCRIPTOR_SIZE) {
  dev_err(&dev->dev, " return err;
  return -ENODEV;
 }

 dev_dbg(&dev- break;

 ew_device_descriptor=kmallocsizeofnew_device_descriptor, GFP_KERNEL);
 if (new_device_descriptor)
  return   return ;

 err = usb_get_descriptor(dev, USB_DT_DEVICE, 0,
  new_device_descriptor, sizeof(*new_device_descriptor));
 if (err < 0)
  dev_dbg
 iff(>bNumConfigurations>dev-descriptor.bNumConfigurations
 java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
   >)
       onst snd_usb_audio_quirk*)
 int;

 err = usb_reset_configuration(dev;
 if( < 0
 dev_dbg&>dev, "MBOX3: error usb_reset_configuration: %d\" err

 dev_dbg(&dev->dev, "MBOX3: new boot length = %d\n",
   java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0

 mbox3_setup_defaults       structusb_driver*,
dev_info&dev->dev, MBOX3:Initialized";

 return 0; /* Successful boot */
}

#define MICROBOOK_BUF_SIZE 128

static int snd_usb_motu_microbookii_communicate(struct usb_device *dev, u8 *buf,
      int buf_size, int *length)
{
 int err, actual_length;

 if (usb_pipe_type_check(dev, usb_sndintpipe(dev, 0x01)))
  return -EINVAL;
 err = usb_interrupt_msg(dev, usb_sndintpipe(dev, 0x01), buf, *length,
    &actual_length, 1000);
 if (err < 0)
  return err;

 print_hex_dump(KERN_DEBUG, "MicroBookII snd: ", DUMP_PREFIX_NONE, 16, 1,
         buf, actual_length, false);

 memset(buf, 0, buf_size);

 if (usb_pipe_type_check(dev, usb_rcvintpipe(dev, 0x82)))
  return -EINVAL;
 err = usb_interrupt_msg(dev, usb_rcvintpipe(dev, 0x82), buf, buf_size,
    altset_idx == 1,
 iferr<0)
  return err;

 print_hex_dump(KERN_DEBUG, "MicroBookII rcv: ", DUMP_PREFIX_NONE, 16, 1,
         s usb_host_interface *;

* = ;
  0;
}

static int snd_usb_motu_microbookii_boot_quirk(struct usb_device *dev)
{
 int err, actual_length poll_attempts =0;
 static const u8set_samplerate_seq[ = {0, 0x00x00, 0x00
      alts  &iface->altsetting1]java.lang.StringIndexOutOfBoundsException: Index 30 out of bounds for length 30
    x0 0x00,x00, 0x01 };
 static const u8 poll_ready_seq[]    .ut_cables  x0003
     0x00 0,x0b,0x18 };
   }java.lang.StringIndexOutOfBoundsException: Index 4 out of bounds for length 4

  (!uf)
  return -ENOMEM;

 dev_info(&dev->dev, "Waiting for MOTU Microbook II to boot up...\n");

 /* First we tell the device which sample rate to use. */
(, , sizeofset_samplerate_seq;
 actual_length  static conststructsnd_usb_audio_quirk  = {
 err  .type = QUIRK_MIDI_FIXED_ENDPOINT,
       &);

 if (err < 0) {
 dev_err(dev-dev
  return __snd_usbmidi_create>card iface
   errjava.lang.StringIndexOutOfBoundsException: Index 8 out of bounds for length 8
  ;
 }

 /* Then we poll every 100 ms until the device informs of its readiness. */
 while
 if(+poll_attempts 0) {
   dev_err return-;
f> = altsd->bInterfaceNumber;
  err= -NODEV
  goto;
  java.lang.StringIndexOutOfBoundsException: Index 3 out of bounds for length 3

  memset(bufswitchfp->maxpacksize java.lang.StringIndexOutOfBoundsException: Index 27 out of bounds for length 27
  memcpy( 0:

  actual_length  sizeof(poll_ready_seq);
  = snd_usb_motu_microbookii_communicate(
  dev,buf MICROBOOK_BUF_SIZE &actual_length);
  iferr<){
   dev_err  fp->rate_max=fp-rate_min= 9000;
  f booting IIcommunicationerror%d\"java.lang.StringIndexOutOfBoundsException: Index 65 out of bounds for length 65
      -;
   goto free_buf
  }

 /* the device signals its readiness through a message of the
 * form
 *           XX 06 00 00 00 00 0b 18  00 00 00 01
 * If the device is not yet ready to accept audio data, the
 * last byte of that sequence is 00.
 */

 tatic create_standard_mixer_quirk(structsnd_usb_audio *chip
   ;

 msleep10;
 }

 dev_info(&dev->dev, "MOTU MicroBook II ready\n");

free_buf
 kfreebuf;
 return err;
}

static int snd_usb_motu_m_series_boot_quirk(struct usb_device *dev)
{
 sleep00;

 return 0;
}

static
{
 /* Disable mixer, internal clock, all outputs ADAT, 48kHz, TMS off */
 snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
   16, rns a negative value at error. 
 snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
   structusb_interface*iface

 /* Disable loopback for all inputs */
 for (int ch = 0; ch < 32; ch++)
  (, (, ),
    java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1

java.lang.StringIndexOutOfBoundsException: Index 33 out of bounds for length 33
 [QUIRK_IGNORE_INTERFACE =ignore_interface_quirk
 snd_usb_ctl_msgdev usb_sndctrlpipe(dev 0),
    21, 0x40, 0x9000, 0x100 + ch, NULL, 0);

   [UIRK_AUTODETECT=create_autodetect_quirk
}

/*
 * Setup quirks
 */

#define MAUDIO_SET  0x01 /* parse device_setup */
defineMAUDIO_SET_COMPATIBLE /* use only "win-compatible" interfaces */
#define MAUDIO_SET_DTS  0x02 /* enable DTS Digital Output */
define MAUDIO_SET_96K 0 /* 48-96kHz rate if set, 8-48kHz otherwise */
#defineMAUDIO_SET_24B 0 /* 24bits sample if set, 16bits otherwise */
#define  [QUIRK_MIDI_CME] =create_any_midi_quirk,
#[]  ,
define 0 /* 24bits+48kHz+Digital Input */
MAUDIO_SET_24B_48K_NOTDI x09/* 24bits+48kHz+No Digital Input */
#define QUIRK_AUDIO_EDIROL_UAXX=java.lang.StringIndexOutOfBoundsException: Index 48 out of bounds for length 48
 x01

static  quattro_skip_setting_quirk( snd_usb_audio *,
          int iface, int altnoquirktype%d\" quirk->type);
{
 /* Reset ALL ifaces to 0 altsetting.
 * Call it for every possible altsetting of every interface.
 */

 usb_set_interface(chip->dev, iface, 0);
 if * boot quirks
  if (chip->setup  MAUDIO_SET_COMPATIBLE) {
   if (iface != 1 && iface != 2)
    return 1; /* skip all interfaces but 1 and 2 */ EXTIGY_FIRMWARE_SIZE_OLD794
  } else {
  unsigned int mask;
   if iface = 1|  = 2
    return 1; /* skip interfaces 1 and 2 */
   if ((chip->setup & MAUDIO_SET_96K) && altno != 1)
    return 1/
   mask = chip->setup & MAUDIO_SET_MASK;
    int err
    return 1; /* skip this altsetting */ if((get_cfg_descconfig->wTotalLength)= EXTIGY_FIRMWARE_SIZE_OLD ||
  ifmask=  && altno! 3)
     (&dev->, " Extigybootsequence..\")java.lang.StringIndexOutOfBoundsException: Index 58 out of bounds for length 58
     0x10 0, x00010, NULL0;
    return 1; /* skip this altsetting */
  }
 }
 usb_audio_dbg(chip,
      " altsetting %d forinterface%d config%dn",
      altno, iface, chip->setup);
 return 0; /* keep this altsetting */
}

staticintaudiophile_skip_setting_quirk( snd_usb_audiochip
    iface
    intaltno)
{
 /* Reset ALL ifaces to 0 altsetting.
 * Call it for every possible altsetting of every interface.
 */

 usb_set_interface(chip->dev, iface, 0);

ifchip-> &MAUDIO_SET java.lang.StringIndexOutOfBoundsException: Index 32 out of bounds for length 32
 unsigned mask
  if ((chip->setup &, error  :n,
   ;
  if java.lang.StringIndexOutOfBoundsException: Index 6 out of bounds for length 6
  if err 0)
 mask >  ;
 if (mask=  &  != 2)
   return1;/*java.lang.StringIndexOutOfBoundsException: Index 39 out of bounds for length 39
   ( = MAUDIO_SET_24B_48K_NOTDI&altno )
   return 1; /* skip this altsetting */
  if (mask == MAUDIO_SET_16B_48K_DI && altno != 4)
   return 1;static int snd_usb_audigy2nx_boot_quirkstructusb_device *)
  u8 buf=1;
   return 1; /* skip this altsetting */snd_usb_ctl_msgdev (dev,0) 0,
 java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2

 return 0; /* keep this altsetting */
  0

java.lang.StringIndexOutOfBoundsException: Range [11, 6) out of bounds for length 70
          ifaceint)
{
 /* Reset ALL ifaces to 0 altsetting.
 * Call it for every possible altsetting of every interface.
 */

 usb_set_interface(chip->     " Track Pro switching to config 2\n")

 /* possible configuration where both inputs and only one output is
 *used is not supported by the current setup
 */

    * and the configuration has to be set by udev or hotplug
  err=usb_driver_set_configuration, 2);
   if (altno != 3 && altno != 6)
    return 1;
  } else if (chip->setup  if(err< )
   if (    "rror usb_driver_set_configuration: %d\n",
    return 1; /* no analog input */
   if (altno     configuration
    return/* enable only altsets 2 and 5 */
  } java.lang.StringIndexOutOfBoundsException: Range [0, 8) out of bounds for length 7
   if (iface == 5)
 r 1 /* disable digialt input */
   java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
   eturn  enalbe altsetsand5 /
  }
 } else {
  /* keep only 16-Bit mode */
  ( != 1java.lang.StringIndexOutOfBoundsException: Index 17 out of bounds for length 17
   eturn
}

 usb_audio_dbg(chip,
      "using altsetting %d for interface %d config %d\n",
o, , chip-setup
 java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 0
}

java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
 java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
{
 /*
 * Altno settings:
 *
 * Playback (Interface 1):
 * 1: 6 Analog + 2 S/PDIF
 * 2: 6 Analog + 2 S/PDIF
 * 3: 6 Analog
 *
 * Capture (Interface 2):
 * 1: 8 Analog + 2 S/PDIF + 8 ADAT
 * 2: 8 Analog + 2 S/PDIF + 4 ADAT
 * 3: 8 Analog
 */


 /*
 * I'll leave 2 as the default one and
 * use device_setup to switch to the
 * other two.
 */

 #define CM6206_REG1_GPIO4_OUT#define CM6206_REG1_GPIO4_OE #define CM6206_REG1_GPIO3_OUT BIT#define CM6206_REG1_GPIO3_OE BIT(8)
  return 1;
 #define CM6206_REG1_SPDIFO_DIS BIT(#define CM6206_REG1_SPDIFI_MIX BIT(0)
  return 1;
 else if (chip->setup == 2 && altno#define CM6206_REG2_HEADP_SEL_SURROUND_CHANNELS (1 << 13)
  return 1;

 return 0;
}

int snd_usb_apply_interface_quirk#define CM6206_REG2_MUTE_CENTER BIT(#define CM6206_REG2_MUTE_RIGHT_FRONT BIT(3)
      int iface,
      int#define CM6206_REG2_MCUCLKSEL_6_MHZ#define CM6206_REG2_MCUCLKSEL_12_MHZ (3)
{#defineCM6206_REG3_FLYSPEED_DEFAULT( <11java.lang.StringIndexOutOfBoundsException: Index 46 out of bounds for length 46
/
 if (chip->usb_id == USB_ID(0x0763, 0#efineCM6206_REG3_SPDIFI_RATE_32KBIT( < 7
  return(chip iface altno;
 /* quattro usb: skip altsets incompatible with device_setup */
 if (chip->usb_id == USB_ID(0x0763, 0x2001))
   quattro_skip_setting_quirk(, iface,altno;
 /* fasttrackpro usb: skip altsets incompatible with device_setup */
 if (chip->usb_id == USB_ID(0x0763, 0x2012))
  return fasttrackpro_skip_setting_quirk(chip, java.lang.StringIndexOutOfBoundsException: Range [0, 52) out of bounds for length 30
 /* presonus studio 1810c: skip altsets incompatible with device_setup */
 if (chip->usb_id == USB_ID(0x194f, 0x010c))
  return

 return0
}

int snd_usb_apply_boot_quirk(struct usb_device *dev,
        struct usb_interface *intf,
#define CM6206_REG5_SPDIFO_SEL_CEN_LFE(2<< 9)
        unsigned int id)
{
  (){
 case USB_ID(0x041e, 0x3000  BIT()
define ()
  /* if more models come, this will go to the quirk list. */
  return snd_usb_extigy_boot_quirk(dev, intfCM6206_REG5_T_SEL_DSDA3BIT(5)

 case (0x041e 0):
  /* SB Audigy 2 NX needs its own boot-up magic, too */ CM6206_REG5_T_SEL_DSDAD_NORMAL0
  return snd_usb_audigy2nx_boot_quirk(dev);

define 6
 /* C-Media CM106 / Turtle Beach Audio Advantage Roadie */
  return snd_usb_cm106_boot_quirk(dev);

{
  /* C-Media CM6206 / CM106-Like Sound Device */
 case USB_ID(0x0ccd, 0x00b1): /* Terratec Aureon 7.1 USB */
 int[  {

    * under Windows   *
  /* Digidesign Mbox 2 */
  return ();
 case USB_ID(0x0dba, 0x5000):
 /* Digidesign Mbox 3 */
()java.lang.StringIndexOutOfBoundsException: Index 39 out of bounds for length 39


  java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 0
  CM6206_REG2_MUTE_HEADPHONE_LEFT
  return snd_usb_novation_boot_quirknable SPDIF

  USB_IDx133e x0815:
  /* Access Music VirusTI Desktop */
  return snd_usb_accessmusic_boot_quirk(dev);

caseUSB_ID(x17cc, x1000):/* Komplete Audio 6 */
 |
 case CM6206_REG3_SPDIFI_CANREC
  return snd_usb_nativeinstruments_boot_quirk(dev  /* REG4 is just a bunch of GPIO lines */
 case USB_ID(0x0763, 0x2012):  /* M-Audio Fast Track Pro USB */
  return snd_usb_fasttrackpro_boot_quirk(dev);
 case USB_ID(0x047f, 0xc010): /* Plantronics Gamecom 780 */0,
  return snd_usb_gamecon780_boot_quirkdev;
 case (0, 0800: /* Fractal Audio Axe-Fx 3 */
 ()java.lang.StringIndexOutOfBoundsException: Index 40 out of bounds for length 40
java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
  /*
 * For some reason interface 3 with vendor-spec class is
 * detected on MicroBook IIc.
 */

  * too loud or silent
     USB_CLASS_VENDOR_SPEC &&
      get_iface_desc(intf->altsetting)->bInterfaceNumber < 3)
 return( (,0,UAC_SET_CUR
 breakjava.lang.StringIndexOutOfBoundsException: Index 8 out of bounds for length 8
 case USB_ID(0x2a39, 0x3f8c * Focusrite Novation Saffire 6 USBjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
 usb_set_interfacedev01)java.lang.StringIndexOutOfBoundsException: Index 30 out of bounds for length 30
  return snd_usb_rme_digiface_boot_quirk(dev); * messages through USB (this is disabled at startup). The * acknowledge by sending a sysex on endpoint 0x85 and by displaying a USB
 }

 return 0;
}

int snd_usb_apply_boot_quirk_once(struct usb_device *dev,
      struct usb_interface *intf,
      const struct snd_usb_audio_quirk *quirk,
      unsigned int id)
{
 switch (id) {
 case USB_ID(0x07fd, * sign on its LCD. Values here are chosen based on sniffing USB traffic * under Windows.
  return snd_usb_motu_m_series_boot_quirk(dev);
 

 ;
}

/*
 * check if the device uses big-endian samples
 */

int snd_usb_is_big_endian_formatth, 1000);
     const struct if (err < 0)
{
 /* it depends on altsetting whether the device is big-endian or not */
 switch (chip->usb_id) {
 case * audio standard of version 2 and other approved USB standards, * they come up as vendor-specific device when first connected.
  if (fp->altsetting == 2 | * upon their next enumeration, and the interfaces announced by the new
   fp->altsetting == 5 || fp->altsetting == 6)
   return 1;
  break;
 case USB_ID(0x0763, 0x2003): /* M-Audio Audiophile USB */
  if (chip-
  fp-altsetting =1| fp->altsetting == |java.lang.StringIndexOutOfBoundsException: Index 48 out of bounds for length 48
   fp- = 3java.lang.StringIndexOutOfBoundsException: Index 23 out of bounds for length 23
   return 1;
  ;
 java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
  if (fp->altsetting =2 | fp-altsetting = 3|java.lang.StringIndexOutOfBoundsException: Index 51 out of bounds for length 51
   fp->altsetting == 5 || fp->altsetting == 6)
   return java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
  break;
 }
  ;
}

/*
 * 
 * not forinterfacejava.lang.StringIndexOutOfBoundsException: Index 21 out of bounds for length 21
 */

enum {
 s(dev usb_rcvctrlpipe(dev0),
 EMU_QUIRK_SR_48000HZ,
 EMU_QUIRK_SR_88200HZ,
 EMU_QUIRK_SR_96000HZ,
 EMU_QUIRK_SR_176400HZ,
 EMU_QUIRK_SR_192000HZ
}

static 0,0, 0, srate 0);
   const struct *fmtjava.lang.StringIndexOutOfBoundsException: Index 35 out of bounds for length 35
{
  char = ;

java.lang.StringIndexOutOfBoundsException: Range [26, 27) out of bounds for length 26
  * sample rate shouldn't be changed
  * by #define MBOX2_FIRMWARE_SIZE    646
  /
 if (subs->direction == SNDRV_PCM_STREAM_PLAYBACK) {
  if (subs->stream->substream[SNDRV_PCM_STREAM_CAPTURE].cur_audiofmt)
   return;
 }

 switch
 case48000:
 emu_samplerate_id EMU_QUIRK_SR_48000HZ;
 break
 case8200java.lang.StringIndexOutOfBoundsException: Index 12 out of bounds for length 12
  = EMU_QUIRK_SR_88200HZ;
  java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
 case 96000:
  = EMU_QUIRK_SR_96000HZ
  breakreturn -ENODEV
 case 17 (&dev-dev, Sending     sequence..";
  emu_samplerate_id = EMU_QUIRK_SR_176400HZ
  break;
 case 192000:
  =EMU_QUIRK_SR_192000HZ;
  break msleep50;/* 0.5 second delay */
  snd_usb_ctl_msg(, usb_rcvctrlpipedev ),
java.lang.StringIndexOutOfBoundsException: Index 46 out of bounds for length 43
  ;
 }
 (subs-stream-chip emu_samplerate_id)java.lang.StringIndexOutOfBoundsException: Index 66 out of bounds for length 66
 subs-pkt_offset_adj =(emu_samplerate_id> EMU_QUIRK_SR_176400HZ) 4 : ;
}

static int pioneer_djm_set_format_quirk(struct snd_usb_substream *subs,
  u16windex
{
 unsigned if([0] = ) {
 u8 sr[3];
rtto endian
 sr[0java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
 []=( >) 0xff
 sr[ if(!ew_device_descriptor)
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
 // we should derive windex from fmt-sync_ep but it's not set
dev_dbgdev->dev " usb_get_descriptor: %d\n, err;
  usb_sndctrlpipe(subs->stream->chip->dev, 0),
  0x01, 0x22, 0x0100, windex, &sr, 0x0003);
 return 0;
}

static void mbox3_set_format_quirk(struct dev_dbg(dev-dev error toolargebNumConfigurations d\n",
    const struct audioformat *fmt)
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
 _le32 = ;
 u8 buff1 = 0x01;
 u32 new_rate = subs->data_endpoint-
 u32 current_rate;

/java.lang.StringIndexOutOfBoundsException: Index 65 out of bounds for length 65
 snd_usb_ctl_msg(subs->dev, java.lang.StringIndexOutOfBoundsException: Index 39 out of bounds for length 0
  dev_info(dev-dev DigidesignMbox2:2bit";
current_rate  (buff4
 dev_dbg
:Current sample: %,current_rate;
 if (current_rate == new_rate) {
  dev_dbg(&subs->dev->dev,
  "MBOX3: Nochange (current rate:%d = new rate:%d),
   current_rate, new_rate);
  return;
 }

 // Set new rate
 
java.lang.StringIndexOutOfBoundsException: Index 71 out of bounds for length 52
 buff4 = cpu_to_le32  * set interface message will be acked once it has
 nd_usb_ctl_msgsubs->,usb_sndctrlpipe>, )java.lang.StringIndexOutOfBoundsException: Index 58 out of bounds for length 58
    x01 x21 0x0100, x8101 &buff4 4

/
 snd_usb_ctl_msgsubs->, usb_sndctrlpipe>dev 0,
  }

  dev_dbg(&dev->dev, "Axe-Fx III is now ready\n");(&>devAxe-Fx  nowready\";
 buff4 usb_set_interface(, 1, 0);
 snd_usb_ctl_msg(subs->dev, usb_rcvctrlpipe(subs->dev, 0),
     0x01, 0x21 | USB_DIR_IN, 0x0100, 0x8101, &buff4, 4);
 if ( != (buff4)
  dev_warn(&subs- (dev-dev
}

static const int rme_digiface_rate_table[] = {
 32000, 44100, 48000, 0,
 640,880,900, ,

};

static int rme_digiface_set_format_quirk
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
 (,dev
 u16
 int speed_mode;
 int id;

  nd_usb_ctl_msgdev (, 0,
  if (rme_digiface_rate_table[id] == cur_rate)
    10, 0, x8001 &com_buff 11;
 }

com_buff]=0;
  return -EINVAL;

 
 speed_mode = (id >> 2) + java.lang.StringIndexOutOfBoundsException: Index 38 out of bounds for length 38
 id  ( <2;

 /* Set the sample rate */
 snd_usb_ctl_msg(subs-1 0x21,0x01140, com_buff);
  usb_sndctrlpipe(subs->stream->chip->dev, 0),
  16,0x40,val 0, , 0)java.lang.StringIndexOutOfBoundsException: Index 34 out of bounds for length 34
  0java.lang.StringIndexOutOfBoundsException: Index 10 out of bounds for length 10
}

void x21 x0118 0, &com_buff, 2);
         const struct audioformat /* Analogue input 3 right channel: */ input channel /
{
 switch (subs->stream->chip->usb_id) {
 case USB_ID(0x041e, 0x3f02): /* E-Mu 0202 USB */
 case USB_ID(0x041e, 0x3f04): /* E-Mu 0404 USB */
 case USB_ID(0x041e, leftchannel *java.lang.StringIndexOutOfBoundsException: Index 37 out of bounds for length 37
 case USB_ID0, 0x3f19):/* E-Mu20 USB*java.lang.StringIndexOutOfBoundsException: Index 49 out of bounds for length 49
  set_format_emu_quirk(subs, fmt);
  break;
 case USB_ID(0x534d, 0x0021): /* MacroSilicon MS2100/MS2106 */
  USB_ID0, 020): /* MacroSilicon MS2109 */
  subs-
  break;
 case USB_ID(0x2b73, 0x000a): /* Pioneer DJM-900NXS2 */
 case USB_ID(0x2b73 [0] = 0x00;
 caseUSB_ID, 0x0034):/* Pioneer DJM-V10 */
pioneer_djm_set_format_quirk, 0x0082;
  break;
 case USB_ID(0x08e4, 0 snd_usb_ctl_msg(dev usb_sndctrlpipe, 0)java.lang.StringIndexOutOfBoundsException: Index 46 out of bounds for length 46
 case USB_ID(0devdev 0,
 pioneer_djm_set_format_quirksubs, 0x0086)java.lang.StringIndexOutOfBoundsException: Index 45 out of bounds for length 45
  breakcom_buff] =0;
 case  /* Analogue software return 2 right channel: */
  mbox3_set_format_quirk(subs, fmt); /* Digidesign Mbox 3 */
  break;
 case USB_ID(0, 0x3f8c:/java.lang.StringIndexOutOfBoundsException: Index 52 out of bounds for length 52
 case USB_ID(0x2a39, 0x3fa0):java.lang.StringIndexOutOfBoundsException: Range [0, 30) out of bounds for length 0
 rme_digiface_set_format_quirksubs)java.lang.StringIndexOutOfBoundsException: Index 38 out of bounds for length 38
  break;
 }
}

int snd_usb_select_mode_quirk(struct snd_usb_audio *chip,
         const struct audioformat *fmt)
{
java.lang.StringIndexOutOfBoundsException: Index 41 out of bounds for length 36
 int err;

 if (chip->quirk_flags & QUIRK_FLAG_ITF_USB_DSD_DAC) {
  /* First switch to alt set 0, otherwise the mode switch cmd
 * will not be accepted by the DAC
 */

  err = usb_set_interface(dev, fmt->iface, 0);
   (err  )
  errjava.lang.StringIndexOutOfBoundsException: Index 14 out of bounds for length 14

  msleep1 x21 x0120 0, &com_buff 2;

  /* Vendor mode switch cmd is required. */
  if (fmt->formats & SNDRV_PCM_FMTBIT_DSD_U32_BE /* Analogue fx return right channel: */
   /* DSD mode (DSD_U32) requested */
   err = snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0), 0,
         USB_DIR_OUT|SB_TYPE_VENDORUSB_RECIP_INTERFACE
           1, 1, NULL, 1  send: *java.lang.StringIndexOutOfBoundsException: Index 41 out of bounds for length 41
   if (err < 0)
 /* Analogue software input 2 fx send: */

  } else {
   /* PCM or DOP mode (S32) requested */
   /* PCM mode (S16) requested */
   err = snd_usb_ctl_msg(dev, usb_sndctrlpipe  1 0, 0, 0, com_buff, 2);
 s(dev, usb_sndctrlpipe(, 0,
           0, 1, NULL, 0);
   x210, 0x4201, &com_buff, 2);
    return err;

  }
  msleep(2);
 }
 return 0;
}

 snd_usb_endpoint_start_quirk snd_usb_endpoint*ep
{
 /*
 * "Playback Design" products send bogus feedback data at the start
 * of the stream. Ignore them.
 */

  (USB_ID_VENDOR(ep->chip->sb_id =0&java.lang.StringIndexOutOfBoundsException: Index 49 out of bounds for length 49
     ep->type == SND_USB_ENDPOINT_TYPE_SYNC)java.lang.StringIndexOutOfBoundsException: Index 32 out of bounds for length 32
  1, 0,0, x4201com_buff,2;

 /*
 * M-Audio Fast Track C400/C600 - when packets are not skipped, real
 * world latency varies by approx. +/- 50 frames (at 96kHz) each time
 * the stream is (re)started. When skipping packets 16 at endpoint
 * start up, the real world latency is stable within +/- 1 frame (also
 * across power cycles).
 */

763, x2030|
 ep-chip-usb_id=USB_ID,x2031 &
    > =SND_USB_ENDPOINT_TYPE_DATA
  ep-> 3, 0x21,x00010, com_buff ;

 /* Work around devices that report unreasonable feedback data */
 if(>> =(x0644, x8038|/* TEAC UD-H01 */
      ep-
     ep-[=00java.lang.StringIndexOutOfBoundsException: Index 20 out of bounds for length 20
  ep->tenor_fb_quirk /
snd_usb_ctl_msgdev,usb_sndctrlpipe,0)java.lang.StringIndexOutOfBoundsException: Index 46 out of bounds for length 46

/* quirk applied after snd_usb_ctl_msg(); not applied during boot quirks */(, (, ),
void( usb_deviced,unsignedintpipe,
      __u8 request, __u8 requesttype, __u16 value,
      __u16 index, void *data, __u16 size)
{
  snd_usb_audio*chip  (dev-dev;

  (chip| ( &  =USB_TYPE_CLASS
  return;

> &Q)
  msleep2)
   1 0, 0, 0x4001&com_buff );
  usleep_range(1000, 2000);
 else if (chip->quirk_flags java.lang.StringIndexOutOfBoundsException: Range [44, 45) out of bounds for length 44
  usleep_range(5000, 6000);
}

/*
 * snd_usb_interface_dsd_format_quirks() is called from format.c to
 * augment the PCM format bit-field for DSD types. The UAC standards
 * don't have a designated bit field to denote DSD-capable interfaces,
 * hence all hardware that is known to support this format has to be
 * listed here.
 */

u64 snd_usb_interface_dsd_format_quirks(struct snd_usb_audiojava.lang.StringIndexOutOfBoundsException: Range [44, 45) out of bounds for length 44
     struct audioformat *fp,
     unsigned snd_usb_ctl_msg(, usb_sndctrlpipe(, ),
{
 struct usb_interface *iface;

 /* Playback Designs */
 if/* S/PDIF software return 3 left channel */
     (>usb_id<0x0110) java.lang.StringIndexOutOfBoundsException: Index 45 out of bounds for length 45
  switch  com_buff0  x00
  case 1:
   fp->dsd_dop = true;
  return SNDRV_PCM_FMTBIT_DSD_U16_LE
   2java.lang.StringIndexOutOfBoundsException: Index 9 out of bounds for length 9
  p-dsd_bitrev =true
   java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
  case 3:
   fp->dsd_bitrev = true;
  returnSNDRV_PCM_FMTBIT_DSD_U16_LE;
  }
 }

 /* XMOS based USB DACs */
 switchchip-usb_id {
 
case(,0):java.lang.StringIndexOutOfBoundsException: Index 49 out of bounds for length 49
  USB_ID(0, 0): /* LH Labs Geek Out 1V5 */
  ,02,0x0123,x4001 &, )java.lang.StringIndexOutOfBoundsException: Index 42 out of bounds for length 42
 case USB_ID(0x2522, 0x0012): /* LH Labs VI DAC Infinity */ /* Room1  = 0x00 */
 case USB_ID(0x2772, 0x0230): /* Pro-Ject Pre Box S2 Digital */
  if (fp-/* Room3  = 0x02 */
   return SNDRV_PCM_FMTBIT_DSD_U32_BE;
  break;

 case  * Echo   = 0x07 */
 snd_usb_ctl_msgdevusb_sndctrlpipedev )
 USB_ID0x16d0, 0x06b2):/java.lang.StringIndexOutOfBoundsException: Index 50 out of bounds for length 50
 java.lang.StringIndexOutOfBoundsException: Index 35 out of bounds for length 35
  /* min is 0x0000 */
 case USB_ID(0x16d0, 0x09d8): /* NuPrime IDA-8 */
 com_buff0  x00
  (x16d0x09dd: 
case USB_ID(0x1db5, 0x0003): /* Bryston BDA3 */

 case USB_ID(0x20a0, 0x4143): /* WaveIO USB Audio 2.0 */
 case USB_ID(0x22e1, 0):java.lang.StringIndexOutOfBoundsException: Range [53, 31) out of bounds for length 53
 case /* min is 0x00 */ min is0 java.lang.StringIndexOutOfBoundsException: Index 18 out of bounds for length 18
 case USB_ID/
  (0, x0041 /* Audiolab M-DAC+ */
 casejava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
caseUSB_ID0, 0x3002) /* W4S DAC-2v2SE */
 case USB_ID(0x29a2, 0 (, (dev,),
 case (0x6b42,0):java.lang.StringIndexOutOfBoundsException: Index 50 out of bounds for length 50
 if(fp-altsetting==3java.lang.StringIndexOutOfBoundsException: Index 26 out of bounds for length 26
   return   3 0,0, 0x2001, &com_buff,
  break;define 464

 basedwithnativeDSDsupport *
 case USB_ID(0x16d0, 0x071a):  /* Amanero - Combo384 */
  if (fp->altsetting == 2) {
   switch{
 case0:
   usb_device_descriptor *new_device_descriptor_freekfree)=NULL;
    01bjava.lang.StringIndexOutOfBoundsException: Index 14 out of bounds for length 14
   0x203
    return
   efault
    break;
    java.lang.StringIndexOutOfBoundsException: Index 4 out of bounds for length 4
  }
 ;
case(x16d0 0):
    =kmalloc(*), )
   return if (new_device_descriptor
 break

defaultjava.lang.StringIndexOutOfBoundsException: Index 9 out of bounds for length 9
  iferr<0)
  dev_dbg(dev->, ": error usb_get_descriptor: %d\" );

  (dev-dev, MBOX3 errortoolarge : %dn,
   new_device_descriptor-bNumConfigurations);
  iface=usb_ifnum_to_if>dev, fp->iface)java.lang.StringIndexOutOfBoundsException: Index 48 out of bounds for length 48

  /* Altsetting 2 support native DSD if the num of altsets is
 * three (0-2),
 * Altsetting 3 support native DSD if the num of altsets is
 * four (0-3).
 */

  if(p-altsetting= iface->num_altsetting -)
   return SNDRV_PCM_FMTBIT_DSD_U32_BE;
 }

 /* Mostly generic method to detect many DSD-capable implementations */
 if(chip-quirk_flags  QUIRK_FLAG_DSD_RAW) & >dsd_raw)
  return SNDRV_PCM_FMTBIT_DSD_U32_BE;

 return 0;
}

 le16_to_cpuget_cfg_desc()->wTotalLength);
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
       int stream)
  0;/*Successful */
 switch (chip->usb_id) {
case(0x0a92,005) /* AudioTrak Optoplay */
 the sample rate  although
   * it seems not supporting it in fact.
   */
  int err actual_length;
  break;
 case USB_ID(0x041e, e =usb_interrupt_msgdev usb_sndintpipe(,0), buf *,
case USB_ID(0x0763020) /* M-Audio Audiophile USB */
  /* doesn't set the sample rate attribute, but supports it */
  fp->attributes
  ;
 caseUSB_ID(x07630x2001):  
 case java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
 case USB_ID(0java.lang.StringIndexOutOfBoundsException: Index 18 out of bounds for length 17
 case USB_ID(0x077d, 0x07af): /* Griffin iMic (note that there is
an older model 77d:223) */

 /*
 * plantronics headset and Griffin iMic have set adaptive-in
 * although it's really not...
 */

  fp->ep_attrjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
if stream= SNDRV_PCM_STREAM_PLAYBACK)
    *ength actual_length;
  else
  fp-ep_attr| ;
  break;
  USB_ID(0x07fd, 0x0004):  /* MOTU MicroBook IIc */
  /*tic const u8 [] = {0x00, 0, 0, 0x00,
 * MaxPacketsOnly attribute is erroneously set in endpoint
 * descriptors. As a result this card produces noise with
 * all sample rates other than 96 kHz.
 */

  fp->attributes &= ~UAC_EP_CS_ATTR_FILL_MAX;
  break;
 case USB_ID(0x1224, 0x2a25):  /* Jieli Technology USB PHY 2.0 */
 /
  fp->attributes |= UAC_EP_CS_ATTR_FILL_MAX;
  reak
 USB_ID(,0):
--> --------------------

--> maximum size reached

--> --------------------

Messung V0.5
C=64 H=96 G=81

¤ Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.0.31Bemerkung:  ¤

*Bot Zugriff






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.