Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/C/Firefox/security/nss/lib/softoken/legacydb/   (Firefox Browser Version 153.0.1©)  Datei vom 27.6.2026 mit Größe 32 kB image not shown  

Quelle  f_uac1.c   Sprache: C

 

// SPDX-License-Identifier: GPL-2.0+
/*
 * f_uac1.c -- USB Audio Class 1.0 Function (using u_audio API)
 *
 * Copyright (C) 2016 Ruslan Bilovol <ruslan.bilovol@gmail.com>
 * Copyright (C) 2021 Julian Scheel <julian@jusst.de>
 *
 * This driver doesn't expect any real Audio codec to be present
 * on the device - the audio streams are simply sinked to and
 * sourced from a virtual ALSA sound card created.
 *
 * This file is based on f_uac1.c which is
 *   Copyright (C) 2008 Bryan Wu <cooloney@kernel.org>
 *   Copyright (C) 2008 Analog Devices, Inc
 */


#include <linux/usb/audio.h>
#include <linux/module.h>

#include "u_audio.h"
#include "u_uac1.h"

/* UAC1 spec: 3.7.2.3 Audio Channel Cluster Format */
#define UAC1_CHANNEL_MASK 0x0FFF

#define USB_OUT_FU_ID (out_feature_unit_desc->bUnitID)
#define USB_IN_FU_ID (in_feature_unit_desc->bUnitID)

#define EPIN_EN(_opts) ((_opts)->p_chmask != 0)
#define EPOUT_EN(_opts) ((_opts)->c_chmask != 0)
#define FUIN_EN(_opts) ((_opts)->p_mute_present \
   || (_opts)->p_volume_present)
#define FUOUT_EN(_opts) ((_opts)->c_mute_present \
   || (_opts)->c_volume_present)

struct f_uac1 {
 struct g_audio g_audio;
 u8 ac_intf, as_in_intf, as_out_intf;
 u8 ac_alt, as_in_alt, as_out_alt; /* needed for get_alt() */

 struct usb_ctrlrequest setup_cr; /* will be used in data stage */

 /* Interrupt IN endpoint of AC interface */
 struct usb_ep *int_ep;
 atomic_t int_count;
 int ctl_id;  /* EP id */
 int c_srate; /* current capture srate */
 int p_srate; /* current playback prate */
};

static inline struct f_uac1 *func_to_uac1(struct usb_function *f)
{
 return container_of(f, struct f_uac1, g_audio.func);
}

static inline struct f_uac1_opts *g_audio_to_uac1_opts(struct g_audio *audio)
{
 return container_of(audio->func.fi, struct f_uac1_opts, func_inst);
}

/*
 * DESCRIPTORS ... most are static, but strings and full
 * configuration descriptors are built on demand.
 */


/*
 * We have three interfaces - one AudioControl and two AudioStreaming
 *
 * The driver implements a simple UAC_1 topology.
 * USB-OUT -> IT_1 -> OT_2 -> ALSA_Capture
 * ALSA_Playback -> IT_3 -> OT_4 -> USB-IN
 */


/* B.3.1  Standard AC Interface Descriptor */
static struct usb_interface_descriptor ac_interface_desc = {
 .bLength =  USB_DT_INTERFACE_SIZE,
 .bDescriptorType = USB_DT_INTERFACE,
 /* .bNumEndpoints = DYNAMIC */
 .bInterfaceClass = USB_CLASS_AUDIO,
 .bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL,
};

/* B.3.2  Class-Specific AC Interface Descriptor */
static struct uac1_ac_header_descriptor *ac_header_desc;

static struct uac_input_terminal_descriptor usb_out_it_desc = {
 .bLength =  UAC_DT_INPUT_TERMINAL_SIZE,
 .bDescriptorType = USB_DT_CS_INTERFACE,
 .bDescriptorSubtype = UAC_INPUT_TERMINAL,
 /* .bTerminalID = DYNAMIC */
 .wTerminalType = cpu_to_le16(UAC_TERMINAL_STREAMING),
 .bAssocTerminal = 0,
 .wChannelConfig = cpu_to_le16(0x3),
};

static struct uac1_output_terminal_descriptor io_out_ot_desc = {
 .bLength  = UAC_DT_OUTPUT_TERMINAL_SIZE,
 .bDescriptorType = USB_DT_CS_INTERFACE,
 .bDescriptorSubtype = UAC_OUTPUT_TERMINAL,
 /* .bTerminalID = DYNAMIC */
 .wTerminalType  = cpu_to_le16(UAC_OUTPUT_TERMINAL_SPEAKER),
 .bAssocTerminal  = 0,
 /* .bSourceID = DYNAMIC */
};

static struct uac_input_terminal_descriptor io_in_it_desc = {
 .bLength  = UAC_DT_INPUT_TERMINAL_SIZE,
 .bDescriptorType = USB_DT_CS_INTERFACE,
 .bDescriptorSubtype = UAC_INPUT_TERMINAL,
 /* .bTerminalID = DYNAMIC */
 .wTerminalType  = cpu_to_le16(UAC_INPUT_TERMINAL_MICROPHONE),
 .bAssocTerminal  = 0,
 .wChannelConfig  = cpu_to_le16(0x3),
};

static struct uac1_output_terminal_descriptor usb_in_ot_desc = {
 .bLength =  UAC_DT_OUTPUT_TERMINAL_SIZE,
 .bDescriptorType = USB_DT_CS_INTERFACE,
 .bDescriptorSubtype = UAC_OUTPUT_TERMINAL,
 /* .bTerminalID = DYNAMIC */
 .wTerminalType = cpu_to_le16(UAC_TERMINAL_STREAMING),
 .bAssocTerminal = 0,
 /* .bSourceID = DYNAMIC */
};

static struct uac_feature_unit_descriptor *in_feature_unit_desc;
static struct uac_feature_unit_descriptor *out_feature_unit_desc;

/* AC IN Interrupt Endpoint */
static struct usb_endpoint_descriptor ac_int_ep_desc = {
 .bLength = USB_DT_ENDPOINT_SIZE,
 .bDescriptorType = USB_DT_ENDPOINT,
 .bEndpointAddress = USB_DIR_IN,
 .bmAttributes = USB_ENDPOINT_XFER_INT,
 .wMaxPacketSize = cpu_to_le16(2),
 .bInterval = 4,
};

/* B.4.1  Standard AS Interface Descriptor */
static struct usb_interface_descriptor as_out_interface_alt_0_desc = {
 .bLength =  USB_DT_INTERFACE_SIZE,
 .bDescriptorType = USB_DT_INTERFACE,
 .bAlternateSetting = 0,
 .bNumEndpoints = 0,
 .bInterfaceClass = USB_CLASS_AUDIO,
 .bInterfaceSubClass = USB_SUBCLASS_AUDIOSTREAMING,
};

static struct usb_interface_descriptor as_out_interface_alt_1_desc = {
 .bLength =  USB_DT_INTERFACE_SIZE,
 .bDescriptorType = USB_DT_INTERFACE,
 .bAlternateSetting = 1,
 .bNumEndpoints = 1,
 .bInterfaceClass = USB_CLASS_AUDIO,
 .bInterfaceSubClass = USB_SUBCLASS_AUDIOSTREAMING,
};

static struct usb_interface_descriptor as_in_interface_alt_0_desc = {
 .bLength =  USB_DT_INTERFACE_SIZE,
 .bDescriptorType = USB_DT_INTERFACE,
 .bAlternateSetting = 0,
 .bNumEndpoints = 0,
 .bInterfaceClass = USB_CLASS_AUDIO,
 .bInterfaceSubClass = USB_SUBCLASS_AUDIOSTREAMING,
};

static struct usb_interface_descriptor as_in_interface_alt_1_desc = {
 .bLength =  USB_DT_INTERFACE_SIZE,
 .bDescriptorType = USB_DT_INTERFACE,
 .bAlternateSetting = 1,
 .bNumEndpoints = 1,
 .bInterfaceClass = USB_CLASS_AUDIO,
 .bInterfaceSubClass = USB_SUBCLASS_AUDIOSTREAMING,
};

/* B.4.2  Class-Specific AS Interface Descriptor */
static struct uac1_as_header_descriptor as_out_header_desc = {
 .bLength =  UAC_DT_AS_HEADER_SIZE,
 .bDescriptorType = USB_DT_CS_INTERFACE,
 .bDescriptorSubtype = UAC_AS_GENERAL,
 /* .bTerminalLink = DYNAMIC */
 .bDelay =  1,
 .wFormatTag =  cpu_to_le16(UAC_FORMAT_TYPE_I_PCM),
};

static struct uac1_as_header_descriptor as_in_header_desc = {
 .bLength =  UAC_DT_AS_HEADER_SIZE,
 .bDescriptorType = USB_DT_CS_INTERFACE,
 .bDescriptorSubtype = UAC_AS_GENERAL,
 /* .bTerminalLink = DYNAMIC */
 .bDelay =  1,
 .wFormatTag =  cpu_to_le16(UAC_FORMAT_TYPE_I_PCM),
};

DECLARE_UAC_FORMAT_TYPE_I_DISCRETE_DESC(UAC_MAX_RATES);
#define uac_format_type_i_discrete_descriptor   \
 uac_format_type_i_discrete_descriptor_##UAC_MAX_RATES

static struct uac_format_type_i_discrete_descriptor as_out_type_i_desc = {
 .bLength =  0, /* filled on rate setup */
 .bDescriptorType = USB_DT_CS_INTERFACE,
 .bDescriptorSubtype = UAC_FORMAT_TYPE,
 .bFormatType =  UAC_FORMAT_TYPE_I,
 .bSubframeSize = 2,
 .bBitResolution = 16,
 .bSamFreqType =  0, /* filled on rate setup */
};

/* Standard ISO OUT Endpoint Descriptor */
static struct usb_endpoint_descriptor as_out_ep_desc  = {
 .bLength =  USB_DT_ENDPOINT_AUDIO_SIZE,
 .bDescriptorType = USB_DT_ENDPOINT,
 .bEndpointAddress = USB_DIR_OUT,
 .bmAttributes =  USB_ENDPOINT_SYNC_ADAPTIVE
    | USB_ENDPOINT_XFER_ISOC,
 .wMaxPacketSize = cpu_to_le16(UAC1_OUT_EP_MAX_PACKET_SIZE),
 .bInterval =  4,
};

/* Class-specific AS ISO OUT Endpoint Descriptor */
static struct uac_iso_endpoint_descriptor as_iso_out_desc = {
 .bLength =  UAC_ISO_ENDPOINT_DESC_SIZE,
 .bDescriptorType = USB_DT_CS_ENDPOINT,
 .bDescriptorSubtype = UAC_EP_GENERAL,
 .bmAttributes =  1,
 .bLockDelayUnits = 1,
 .wLockDelay =  cpu_to_le16(1),
};

static struct uac_format_type_i_discrete_descriptor as_in_type_i_desc = {
 .bLength =  0, /* filled on rate setup */
 .bDescriptorType = USB_DT_CS_INTERFACE,
 .bDescriptorSubtype = UAC_FORMAT_TYPE,
 .bFormatType =  UAC_FORMAT_TYPE_I,
 .bSubframeSize = 2,
 .bBitResolution = 16,
 .bSamFreqType =  0, /* filled on rate setup */
};

/* Standard ISO OUT Endpoint Descriptor */
static struct usb_endpoint_descriptor as_in_ep_desc  = {
 .bLength =  USB_DT_ENDPOINT_AUDIO_SIZE,
 .bDescriptorType = USB_DT_ENDPOINT,
 .bEndpointAddress = USB_DIR_IN,
 .bmAttributes =  USB_ENDPOINT_SYNC_ASYNC
    | USB_ENDPOINT_XFER_ISOC,
 .wMaxPacketSize = cpu_to_le16(UAC1_OUT_EP_MAX_PACKET_SIZE),
 .bInterval =  4,
};

/* Class-specific AS ISO OUT Endpoint Descriptor */
static struct uac_iso_endpoint_descriptor as_iso_in_desc = {
 .bLength =  UAC_ISO_ENDPOINT_DESC_SIZE,
 .bDescriptorType = USB_DT_CS_ENDPOINT,
 .bDescriptorSubtype = UAC_EP_GENERAL,
 .bmAttributes =  1,
 .bLockDelayUnits = 0,
 .wLockDelay =  0,
};

static struct usb_descriptor_header *f_audio_desc[] = {
 (struct usb_descriptor_header *)&ac_interface_desc,
 (struct usb_descriptor_header *)&ac_header_desc,

 (struct usb_descriptor_header *)&usb_out_it_desc,
 (struct usb_descriptor_header *)&io_out_ot_desc,
 (struct usb_descriptor_header *)&out_feature_unit_desc,

 (struct usb_descriptor_header *)&io_in_it_desc,
 (struct usb_descriptor_header *)&usb_in_ot_desc,
 (struct usb_descriptor_header *)&in_feature_unit_desc,

 (struct usb_descriptor_header *)&ac_int_ep_desc,

 (struct usb_descriptor_header *)&as_out_interface_alt_0_desc,
 (struct usb_descriptor_header *)&as_out_interface_alt_1_desc,
 (struct usb_descriptor_header *)&as_out_header_desc,

 (struct usb_descriptor_header *)&as_out_type_i_desc,

 (struct usb_descriptor_header *)&as_out_ep_desc,
 (struct usb_descriptor_header *)&as_iso_out_desc,

 (struct usb_descriptor_header *)&as_in_interface_alt_0_desc,
 (struct usb_descriptor_header *)&as_in_interface_alt_1_desc,
 (struct usb_descriptor_header *)&as_in_header_desc,

 (struct usb_descriptor_header *)&as_in_type_i_desc,

 (struct usb_descriptor_header *)&as_in_ep_desc,
 (struct usb_descriptor_header *)&as_iso_in_desc,
 NULL,
};

/* Standard ISO OUT Endpoint Descriptor */
static struct usb_endpoint_descriptor ss_as_out_ep_desc  = {
 .bLength =  USB_DT_ENDPOINT_AUDIO_SIZE,
 .bDescriptorType = USB_DT_ENDPOINT,
 .bEndpointAddress = USB_DIR_OUT,
 .bmAttributes =  USB_ENDPOINT_SYNC_ADAPTIVE
    | USB_ENDPOINT_XFER_ISOC,
 .wMaxPacketSize = cpu_to_le16(UAC1_OUT_EP_MAX_PACKET_SIZE),
 .bInterval =  4,
};

static struct usb_ss_ep_comp_descriptor ss_as_out_ep_desc_comp = {
 .bLength  = sizeof(ss_as_out_ep_desc_comp),
 .bDescriptorType = USB_DT_SS_ENDPOINT_COMP,
 .bMaxBurst  = 0,
 .bmAttributes  = 0,
 /* wBytesPerInterval = DYNAMIC */
};

/* Standard ISO OUT Endpoint Descriptor */
static struct usb_endpoint_descriptor ss_as_in_ep_desc  = {
 .bLength =  USB_DT_ENDPOINT_AUDIO_SIZE,
 .bDescriptorType = USB_DT_ENDPOINT,
 .bEndpointAddress = USB_DIR_IN,
 .bmAttributes =  USB_ENDPOINT_SYNC_ASYNC
    | USB_ENDPOINT_XFER_ISOC,
 .wMaxPacketSize = cpu_to_le16(UAC1_OUT_EP_MAX_PACKET_SIZE),
 .bInterval =  4,
};

static struct usb_ss_ep_comp_descriptor ss_as_in_ep_desc_comp = {
 .bLength  = sizeof(ss_as_in_ep_desc_comp),
 .bDescriptorType = USB_DT_SS_ENDPOINT_COMP,
 .bMaxBurst  = 0,
 .bmAttributes  = 0,
 /* wBytesPerInterval = DYNAMIC */
};

static struct usb_descriptor_header *f_audio_ss_desc[] = {
 (struct usb_descriptor_header *)&ac_interface_desc,
 (struct usb_descriptor_header *)&ac_header_desc,

 (struct usb_descriptor_header *)&usb_out_it_desc,
 (struct usb_descriptor_header *)&io_out_ot_desc,
 (struct usb_descriptor_header *)&io_in_it_desc,
 (struct usb_descriptor_header *)&usb_in_ot_desc,

 (struct usb_descriptor_header *)&as_out_interface_alt_0_desc,
 (struct usb_descriptor_header *)&as_out_interface_alt_1_desc,
 (struct usb_descriptor_header *)&as_out_header_desc,

 (struct usb_descriptor_header *)&as_out_type_i_desc,

 //(struct usb_descriptor_header *)&as_out_ep_desc,
 (struct usb_descriptor_header *)&ss_as_out_ep_desc,
 (struct usb_descriptor_header *)&ss_as_out_ep_desc_comp,
 (struct usb_descriptor_header *)&as_iso_out_desc,

 (struct usb_descriptor_header *)&as_in_interface_alt_0_desc,
 (struct usb_descriptor_header *)&as_in_interface_alt_1_desc,
 (struct java.lang.StringIndexOutOfBoundsException: Index 20 out of bounds for length 2

 (struct usb_descriptor_header *)&as_in_type_i_desc,

 //(struct usb_descriptor_header *)&as_in_ep_desc,
 (struct usb_descriptor_header *)&ss_as_in_ep_desc,
 (structusb_descriptor_header *)&ss_as_in_ep_desc_comp,
 (struct usb_descriptor_header *)&as_iso_in_desc,
 NULL,
};

enum {
 STR_AC_IF,
 STR_USB_OUT_IT,
 STR_USB_OUT_IT_CH_NAMES,
 STR_IO_OUT_OT,
 STR_IO_IN_IT,
 STR_IO_IN_IT_CH_NAMES,
 STR_USB_IN_OT,
 STR_FU_IN,
 STR_FU_OUT,
 STR_AS_OUT_IF_ALT0
 STR_AS_OUT_IF_ALT1,
 STR_AS_IN_IF_ALT0,
 STR_AS_IN_IF_ALT1,
 NUM_STR_DESCRIPTORS,
};

static struct usb_string  * onthedevice - the audio streams are simply sinked to and

static struct   sourced avirtualALSAsoundcardcreated.
 .language = 0x0409, /* en-us */
 .strings = strings_uac1,
};

static struct usb_gadget_strings *uac1_strings[] = {
 &str_uac1,
 NULL,
};

/*
 * This function is an ALSA sound card following USB Audio Class Spec 1.0.
 */


static void uac_cs_attr_sample_rate*/
{
  *fn -driver_data;
 struct usb_composite_dev *cdev = fn->config->cdev;
 java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
fn)java.lang.StringIndexOutOfBoundsException: Index 40 out of bounds for length 40
 u8 *uf  u8req->uf;
 u32 val = 0;

 (->actual ! 3){
  WARN(cdev, "Invalid datajava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
  return;
 }

 valFUIN_EN(_opts (opts)>p_mute_present\
 if (uac1->ctl_id  |(opts-
  >java.lang.StringIndexOutOfBoundsException: Range [16, 15) out of bounds for length 22
java.lang.StringIndexOutOfBoundsException: Range [35, 28) out of bounds for length 51
 } else
  uac1- java.lang.StringIndexOutOfBoundsException: Range [8, 7) out of bounds for length 23
  int c_srate; /* current capture srate */
 }
}

static structf_uac1 *unc_to_uac1usb_function *f)
{
 struct  (,struct , .func;
 structf_uac1 = func_to_uac1&audiof)

 atomic_dec(&uac1->int_count
 kfreereq>java.lang.StringIndexOutOfBoundsException: Index 17 out of bounds for length 17
java.lang.StringIndexOutOfBoundsException: Range [22, 20) out of bounds for length 31
}

static int audio_notify(struct g_audio *audio, int unit_id, int cs)
{
 struct f_uac1 java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
 struct usb_request *req;
 struct uac1_status_word *msg;
 int ret;

 if (!uac1->int_ep->enabled)
  return 0;

 if (atomic_inc_return(&uac1->int_count) > UAC1_DEF_INT_REQ_NUM) {
  atomic_dec *
  return 0;
 }

req=usb_ep_alloc_request(uac1->int_ep, GFP_ATOMIC);
 if (req == NULL) {
   =-ENOMEM
  goto err_dec_int_count;
 }

 msg =  * ALSA_Playback  - OT_4- USBIN
 if (msg == NULL) {
  ret = -ENOMEM;
  goto java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
 }

IRQ_PENDING
    UAC1_STATUS_TYPE_ORIG_AUDIO_CONTROL_IFjava.lang.StringIndexOutOfBoundsException: Index 45 out of bounds for length 45
 msg;

 req->static struct*;
 req->buf = msg;
 ->ontext  ;
 req-complete ;

 ret = usb_ep_queue(. =UAC_INPUT_TERMINAL,

 .TerminalType=cpu_to_le16UAC_TERMINAL_STREAMINGjava.lang.StringIndexOutOfBoundsException: Index 54 out of bounds for length 54
   err_free_msg

  0;

err_free_msg bLength=UAC_DT_OUTPUT_TERMINAL_SIZE
 kfree();
java.lang.StringIndexOutOfBoundsException: Range [17, 16) out of bounds for length 17
 usb_ep_free_request(uac1->int_ep, req);
:
 atomic_dec(&uac1->int_count /* .bSourceID = DYNAMIC */

 return bLength =UAC_DT_INPUT_TERMINAL_SIZE
}

static 
wTerminalType cpu_to_le16UAC_INPUT_TERMINAL_MICROPHONEjava.lang.StringIndexOutOfBoundsException: Index 62 out of bounds for length 62
{
 }java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
 struct g_audio *audio = func_to_g_audio(fn);
 struct f_uac1_opts * =g_audio_to_uac1_optsaudio)
 u16 w_length =le16_to_cpucr-wLength;
 u16 w_index = le16_to_cpu(cr->.bDescriptorSubtype = UAC_OUTPUT_TERMI
   = (AC_TERMINAL_STREAMING
 = (w_index > 8  x;
 u8 control_selector =w_value > ;
 int value = -EOPNOTSUPP;

 staticstruct *in_feature_unit_desc
UT_ENopts &(ntity_id= USB_OUT_FU_ID) 
  unsigned

(opts &(=)
  java.lang.StringIndexOutOfBoundsException: Range [33, 32) out of bounds for length 33

  if  =()java.lang.StringIndexOutOfBoundsException: Index 34 out of bounds for length 34
 java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0

   u_audio_get_mutenterface_descriptor as_out_interface_alt_0_desc = {

   *(u8 *)req bLength =java.lang.StringIndexOutOfBoundsException: Range [35, 34) out of bounds for length 35
 structjava.lang.StringIndexOutOfBoundsException: Range [39, 38) out of bounds for length 70
 } if( =UAC_FU_VOLUME
   __le16 c bAlternateSetting 1
  s16volume

   u_audio_get_volume(audio, is_playback, }

  c = cpu_to_le16volumejava.lang.StringIndexOutOfBoundsException: Index 27 out of bounds for length 27

   value = bAlternateSetting ,
   memcpy(req->buf, &c, valuebNumEndpoints=0
  }   ,
   dev_errstaticstruct  as_in_interface_alt_1_desc={
    "%s bLength  
  _,_LINE__ control_selector;
  }
 } elsebNumEndpoints ,
 ->->dev
dcontrol_selector% TODO!n,
 java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
 }

 return value;
}

static int
n_rq_minstruct  *fn, constusb_ctrlrequestcr
{
 structusb_request* =fn>config->dev->req
struct g_audio* =func_to_g_audio();
 struct f_uac1_opts;
 u16java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
 u16 w_index java.lang.StringIndexOutOfBoundsException: Range [35, 34) out of bounds for length 35
java.lang.StringIndexOutOfBoundsException: Range [10, 8) out of bounds for length 14
 u8 entity_id = (w_index >> 8).  ,/* filled on rate setup */
 u8  java.lang.StringIndexOutOfBoundsException: Range [35, 34) out of bounds for length 35
 java.lang.StringIndexOutOfBoundsException: Range [15, 14) out of bounds for length 47

 ifjava.lang.StringIndexOutOfBoundsException: Range [14, 13) out of bounds for length 57
(UOUT_EN)& = ) java.lang.StringIndexOutOfBoundsException: Index 54 out of bounds for length 54
  unsigned.  ,

  if (FUIN_EN(opts) && (entity_id == USB_IN_FU_ID))
      java.lang.StringIndexOutOfBoundsException: Range [31, 30) out of bounds for length 60

  if   java.lang.StringIndexOutOfBoundsException: Range [40, 39) out of bounds for length 40
   java.lang.StringIndexOutOfBoundsException: Range [15, 14) out of bounds for length 20
   min_db;

   uac_format_type_i_discrete_descriptor as_in_type_i_desc ={
   bLength   0 
   else. =,
    min_db =opts->c_volume_min;

   r = cpu_to_le16(min_db);

   value = min_tstatic java.lang.StringIndexOutOfBoundsException: Range [38, 37) out of bounds for length 56
   memcpy(req->buf, &r, value);
  }  .bLength ,
   dev_err(&audio->gadget->dev,
   "s:%d control_selector=d TODO!\n",
    __struct usb_descriptor_header *)&ac_interface_desc,
  }
 } else {
  dev_err(&audio-> (struct usb_descriptor_ *&ut_feature_unit_desc
   "% (stru usb_descriptor_header*&in_feature_unit_desc,
  _func__, _LINE__,entity_id,control_selector)
 java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2

 ;
}

static int
(structusb_descriptor_header *as_in_interface_alt_1_desc
{
 struct  *req =fn->onfig->cdev-req;
 struct
 struct java.lang.StringIndexOutOfBoundsException: Range [14, 13) out of bounds for length 60
 java.lang.StringIndexOutOfBoundsException: Range [20, 17) out of bounds for length 36
 u16 w_index  le16_to_cpu(cr-wIndex);
 java.lang.StringIndexOutOfBoundsException: Range [25, 24) out of bounds for length 25
 u8 STR_AS_IN_IF_ALT1,
 ;
 int value = -EOPNOTSUPP;

 if ((FUIN_EN(optsjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
 java.lang.StringIndexOutOfBoundsException: Range [34, 32) out of bounds for length 52
  unsigned int is_playback = 0;

  (UIN_ENopts) & entity_id =USB_IN_FU_ID))
   is_playback = 1;

  if (struct f_uac1=java.lang.StringIndexOutOfBoundsException: Range [36, 35) out of bounds for length 40
  _e16 r;
    val =buf[0] |(buf[]< )|(uf]< 16;

   if (  uac1- =val;
    max_db static  audio_notify_complete( *,struct usb_request *req)
 else
  max_db = opts->_olume_max;

   r = cpu_to_le16(max_db);

   value = min_t(unsigned int, w_length, java.lang.StringIndexOutOfBoundsException: Index 46 out of bounds for length 30
 (-buf,r ;
  } else java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
   dev_err(&audio-> goto err_dec_int_count;
  "s% control_selector=d !\n",
    _ goto ;
java.lang.StringIndexOutOfBoundsException: Index 3 out of bounds for length 3
  (msg;
 dev_err(a-gadget->ev,
 "s% =% control_selector% TODO!\n"java.lang.StringIndexOutOfBoundsException: Index 52 out of bounds for length 52
  err_dec_int_countjava.lang.StringIndexOutOfBoundsException: Index 18 out of bounds for length 18
 }ret;

 in_rq_cur( usb_function fn const struct usb_ctrlrequest *r)
}

static 
( usb_function*n,  usb_ctrlrequest*r)
{
   -c-req
 struct g_audio *audio  &  ) java.lang.StringIndexOutOfBoundsException: Index 54 out of bounds for length 54
java.lang.StringIndexOutOfBoundsException: Range [20, 19) out of bounds for length 56
 u16 w_length =  int mute;
  (udio,is_playback m);
 u16  *(u8 *)req>buf = mute;
 u8 entity_id = (w_index >> 8)  } else if control_selector = UAC_FU_VOLUME) {
 u8 dev_err(&audio->gadget->dev,
 -java.lang.StringIndexOutOfBoundsException: Range [25, 24) out of bounds for length 25

(() & ( = USB_IN_FU_ID) |
  int


  structusb_request *  >config-->req;
  = 1

  (ontrol_selector =UAC_FU_VOLUME){
  rjava.lang.StringIndexOutOfBoundsException: Index 12 out of bounds for length 12
   s16 res_db;

   if (is_playback)
    =EOPNOTSUPP;
   else
    res_db = opts- (opts)& entity_id ==USB_OUT_FU_ID)) java.lang.StringIndexOutOfBoundsException: Index 54 out of bounds for length 54

   r = min_db  -java.lang.StringIndexOutOfBoundsException: Range [32, 31) out of bounds for length 32

   (nsigned int, w_length, sizeof(r));
    dev_err&audio->->,
    {
 } else java.lang.StringIndexOutOfBoundsException: Index 9 out of bounds for length 9
    "%s:% __func_,_, entity_id,control_selector;
  _ _,control_selector)java.lang.StringIndexOutOfBoundsException: Index 42 out of bounds for length 42
  }
 }else {
  dev_err(&audio->gadget->dev,
  "s%entity_id=%d djava.lang.StringIndexOutOfBoundsException: Range [48, 47) out of bounds for length 52
 __unc__ _LINE__,entity_id,control_selector);
 }

 return value;
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1

static if FUIN_EN(pts) & entity_id = ))
(struct  *p, struct usb_request *eq)
{
 struct  r  java.lang.StringIndexOutOfBoundsException: Range [25, 18) out of bounds for length 27
->func.config>dev;
  *  audio);
 struct f_uac1 * }
 *r=&ac1>setup_cr;
 u16 w_index = le16_to_cpu(cr- _func__,__INE__ entity_id, control_selector)java.lang.StringIndexOutOfBoundsException: Index 52 out of bounds for length 52
 u16 w_value= le16_to_cpu(cr->wValue);
 u8 entity_id = (w_index >> 8) & 0xff;
 u16 (-w)

 ->status ! 0){
  dev_dbg(&cdev-> u8 control_selector = w_value >> 8;
  return;
 }

 if ((FUIN_EN(opts) && (entity_id == USB_IN_FU_ID)) ||
   (FUOUT_EN(opts) && (entity_id == USB_OUT_FU_ID))) {
  unsigned int is_playback = 0;

  if (FUIN_EN(opts) && (entity_id == USB_IN_FU_ID))
   is_playback = 1;

  if (control_selector == UAC_FU_MUTE) {
   u8 mute = *(u8 *)req->buf;

   u_audio_set_mute(audio, is_playback,

   return;
 java.lang.StringIndexOutOfBoundsException: Range [12, 11) out of bounds for length 49
 _ *=-b;
   s16   =opts>java.lang.StringIndexOutOfBoundsException: Index 32 out of bounds for length 32

   volume = le16_to_cpu memcpy(eq->,&r,value);
   _f, _LINE__,)java.lang.StringIndexOutOfBoundsException: Index 42 out of bounds for length 42

   return;
  } else {
   dev_err(&audio->java.lang.StringIndexOutOfBoundsException: Index 23 out of bounds for length 0
    "%s:%d control_selector=%d TODOjava.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
     *ac1  (&-func);
   usb_ep_set_halt(ep);
 }
 } u8 contr=w_value >8java.lang.StringIndexOutOfBoundsException: Index 36 out of bounds for length 36
 &udio->gadget-d,
   "%s:%d entity_id=%d control_selector=%d TODO!\n",
   __ unsignedint is_playback  ;
  usb_ep_set_halt;

 }
}

static 
java.lang.StringIndexOutOfBoundsException: Range [11, 10) out of bounds for length 69
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
 struct usb_request *req = fn->config->cdev  __le16 * = req->buf;;
 struct g_audio *audio = func_to_g_audio  "%:dcontrol_selector=%d TODO!\n",
   "s:d =% %!\"java.lang.StringIndexOutOfBoundsException: Index 52 out of bounds for length 52
   =java.lang.StringIndexOutOfBoundsException: Range [36, 35) out of bounds for length 50
=c-w;
 u16 w_index = le16_to_cpu(cr->wIndex);
 u16 w_value =  u16 w_length = le16_to_cpu-);
  =(>> 8)&0;
 u8 control_selector =java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0

if(opts) &( = ))|
   (FUOUT_EN( return w_length;
 (uac1->etup_cr, cr,sizeof(*))
  req->context = audio;
  req->complete int ( usb_function *,

  return w_length;
} java.lang.StringIndexOutOfBoundsException: Index 9 out of bounds for length 9
  dev_err(&audio->gadget-java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
   "%s:%d entity_id=%d control_selector=%d TODO!\  ctrl>,,len )java.lang.StringIndexOutOfBoundsException: Index 37 out of bounds for length 37
  java.lang.StringIndexOutOfBoundsException: Range [6, 5) out of bounds for length 19
 }
 return -java.lang.StringIndexOutOfBoundsException: Index 10 out of bounds for length 2
}

static int ( usb_function *,
)
{
struct * =f-config-;
int  = -EOPNOTSUPP;
 u8 ep = ((le16_to_cpu(ctrl->wIndex) >> 8) & 0xFF);
 u16 len = le16_to_cpu(  ->Request,w_value,len,ep)
u16  =le16_to_cpu(-)java.lang.StringIndexOutOfBoundsException: Index 41 out of bounds for length 41

 DBG(  UAC_SET_MIN:
->Request,w_value,len,ep);

 switch (ctrl->bRequest) {
case UAC_GET_CUR:
  return in_rq_cur(f, ctrl  break;
 case java.lang.StringIndexOutOfBoundsException: Index 13 out of bounds for length 9
  return in_rq_min(f, ctrl);
 case  const usb_ctrlrequest ctrl)
  return usb_composite_dev *cdev=>-java.lang.StringIndexOutOfBoundsException: Index 50 out of bounds for length 50
   w)java.lang.StringIndexOutOfBoundsException: Index 38 out of bounds for length 38
  in_rq_res(f,ctrl)java.lang.StringIndexOutOfBoundsException: Index 28 out of bounds for length 28
 case UAC_GET_MEM:
  break;
 case UAC_GET_STATcase : {
  value = len;USB_DIR_IN |2)
  break;
    buf[2  val >16  0xff;
  break;
 }

 return value;
}

 ;
 _ctrlrequest *ctrl)
{
 struct usb_composite_dev *cdev = f->config->cdev;
 struct  ;
 struct f_uac1  *uac1 = java.lang.StringIndexOutOfBoundsException: Index 27 out of bounds for length 9
 java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 0
 (ctrl->wIndex);
 u16   len = le16_to_cpu(ctrl->wLength);
 u16   w_value = le16_to_cpu(ctrl->wValue int  value =-;
 u8   cs = w_value >> 8;u8

 DBG(cdev, "bRequest 0x%x, w_value 0  break;
    ctrljava.lang.StringIndexOutOfBoundsException: Index 8 out of bounds for length 8

 switch (ctrl->bRequest) {
 case :{
  USB_DIR_IN|USB_TYPE_CLASS  USB_RECIP_INTERFACE:
   cdev->gadget->java.lang.StringIndexOutOfBoundsException: Range [17, 20) out of bounds for length 9
-ctl_id =;
   req- java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
  }
  value = len;
  break;
 }

 case  > = alue;
  break;

 case UAC_SET_MAX:
  break;

 
  break;

 case UAC_SET_MEM:
  static int (struct usb_function ,unsigned ,  alt)

 default:
  break;
 }

return value;
}

static int audio_get_endpoint_req(struct usb_function *f,
  const struct usb_ctrlrequest *ctrl)
{
 struct usb_composite_dev *cdev = java.lang.StringIndexOutOfBoundsException: Range [0, 35) out of bounds for length 3
   config_ep_by_speed(,&-func,uac1-;
 struct f_uac1 *uac1 = func_to_uac1(f);
  buf  u8 *)eq-buf;
 int value = -EOPNOTSUPP;
 u8 ep = le16_to_cpu(ctrl-  else
u16   -wLength;
 u16 w_value = le16_to_cpu(ctrl->wValue);  uac1->as_in_alt = alt;
   ;
 u32 val java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2

 DBG(cdev, "bRequest 0x%x, 
 ctrl-bRequest,w_value,len,ep)java.lang.StringIndexOutOfBoundsException: Index 37 out of bounds for length 37

  (ctrl->bRequest) {
 case UAC_GET_CUR: {
  if (s==UAC_EP_CS_ATTR_SAMPLE_RATE java.lang.StringIndexOutOfBoundsException: Index 41 out of bounds for length 41
   if (ep == (USB_DIR_IN else
    valjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
   else if (ep == (java.lang.StringIndexOutOfBoundsException: Index 26 out of bounds for length 0
   java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
   buf[java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
   bufjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
   buf[0] = val & 0xff;
  }
  value = len;
  break;
 }
 java.lang.StringIndexOutOfBoundsException: Index 18 out of bounds for length 18
 case UAC_GET_MAX:
 case  fu_desc->bLengthjava.lang.StringIndexOutOfBoundsException: Range [33, 32) out of bounds for length 33
 fu_desc>java.lang.StringIndexOutOfBoundsException: Range [29, 28) out of bounds for length 48
  break;
 case UAC_GET_MEM:
  break;
 default:
 ;
}

 java.lang.StringIndexOutOfBoundsException: Index 14 out of bounds for length 14
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1

static int
f_audio_setup(struct usb_function *f, java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
{
 struct usb_composite_dev *cdev = f->config->cdev;
 struct usb_request *req = cdev->req;
 int   value = -EOPNOTSUPPac_desc->DescriptorSubtype  UAC_HEADER;
 u16   w_index = le16_to_cpu
 u16  java.lang.StringIndexOutOfBoundsException: Index 50 out of bounds for length 50
 u16   ( *pts)

 /* composite driver infrastructure handles everything; interface
  * activationescbTerminalID=i++
 */

 switch (ctrl->bRequestType) {
 case  io_out_ot_desc  +;
  value  EPIN_ENopts
  break;

 case USB_DIR_IN | USB_TYPE_CLASS |if ()
  value= (f ctrl;
  break;
  if ((pts){
  if (ctrl->bRequest usb_in_ot_descbSourceID =in_feature_unit_desc;
 value=out_rq_curf,ctrl)java.lang.StringIndexOutOfBoundsException: Index 31 out of bounds for length 31
  break;
if)
  value= ac_rq_in(, ctrl;
  break;
 default:
 ERROR," %02x%2x v%04 i04 %\,
   ctrl->bRequestType, ctrl->bRequest,
   java.lang.StringIndexOutOfBoundsException: Index 5 out of bounds for length 0
 }

 /* respond with data transfer or status phase? */
 ifif(PIN_ENopts) {
  cdev audio req02.xv%04x %04 ld\",
   ctrl->bRequestType, ctrl->bRequest,
   w_value len+=sizeofusb_in_ot_desc)java.lang.StringIndexOutOfBoundsException: Index 32 out of bounds for length 32
  req-   (FUIN_EN())
  req-->ength =value;
  value = usb_ep_queue(cdev->gadget->ep0, req, GFP_ATOMIC);
  if(value < 0)
   ERROR(cdev, "audio response  }
}

 /* device either stalls (value < 0) or reports success */
 return  value;
}

static int f_audio_set_alt(struct usb_function *f, unsigned intf, unsigned alt)
{
 struct usb_composite_dev *cdev = f->config->  ac_header_desc->wTotalLength = cpu_to_le16(len);
 struct usb_gadget *gadget = cdev
 struct device *dev = &gadget [+]=USBDHDR(ac_interface_desc;
 *=java.lang.StringIndexOutOfBoundsException: Range [41, 40) out of bounds for length 44
 structf_audio_desci+=&usb_out_it_desc
 int ret = 0;

 /* No i/f has more than 2 alt settings */f_audio_desci+ = java.lang.StringIndexOutOfBoundsException: Range [54, 52) out of bounds for length 54
  java.lang.StringIndexOutOfBoundsException: Range [9, 8) out of bounds for length 15
    f_audio_desci+ = USBDHDR(in_feature_unit_desc;
  return -EINVAL;
 }

 java.lang.StringIndexOutOfBoundsException: Index 29 out of bounds for length 29
  /* Control I/f has only 1 AltSetting - 0 */i+ =USBDHDR(as_out_interface_alt_0_desc);
  if (alt) {
    f_audio_desc[++]= USBDHDR(&as_out_interface_alt_1_desc);
   return -EINVAL;
  }

  /* restart interrupt endpoint */
  if (uac1 f_audio_desci+]= (&as_iso_out_desc;
   usb_ep_disableif (() 
  config_ep_by_speed(gadget, &audio->func, uac1->int_ep);
   usb_ep_enable(uac1->int_ep);
java.lang.StringIndexOutOfBoundsException: Index 20 out of bounds for length 3

  return 0;
 }

 if (intf == uac1->as_out_intf) {
 uac1-as_out_alt  alt;

  if (alt)
  ret == u_audio_start_capture(&uac1->g_audio);
  else
p_capture(&uac1->g_audio);
 } else if (intf == uac1- f_audio_desc[iNULL;
  uac1->as_in_alt = alt;

  if (alt)
   ret = u_audio_start_playback(&uac1->g_audio);
  else
   u_audio_stop_playback(&uac1java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
 } else {
  dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
  return -EINVAL;
 }

 return ret;
}

static int f_audio_get_alt(struct usb_function *f, unsigned intf)
{
 struct usb_composite_dev *cdev = f->config->cdev;
 struct usb_gadget *gadget = cdev->gadget;
 struct device *dev = &gadget->dev;
 struct f_uac1 *uac1 = func_to_uac1(f);

 if (intf == uac1->ac_intf)
  return uac1->ac_alt;
 else if (intf == uac1->as_out_intf)
  return uac1->as_out_alt;
 else if (intf == uac1->as_in_intf)
  return uac1->as_in_alt;
 else
  dev_err(dev, "%s:%d Invalid Interface %d!\n",
   __func__, __LINE__, intf);

 return -EINVAL;
}


static void f_audio_disable(struct usb_function *f)
{
 struct f_uac1 *uac1 = func_to_uac1(f);

 uac1->as_out_alt = 0;
 uac1->as_in_alt = 0;

 u_audio_stop_playback(&uac1->g_audio);
 u_audio_stop_capture(&uac1->g_audio);
 if (uac1->int_ep)
  usb_ep_disable(uac1->int_ep);
}

static void
f_audio_suspend(struct usb_function *f)
{
 struct f_uac1 *uac1 = func_to_uac1(f);

 u_audio_suspend(&uac1->g_audio);
}

/*-------------------------------------------------------------------------*/
static struct uac_feature_unit_descriptor *build_fu_desc(int chmask)
{
 struct uac_feature_unit_descriptor *fu_desc;
 int channels = num_channels(chmask);
 int fu_desc_size = UAC_DT_FEATURE_UNIT_SIZE(channels);

 fu_desc = kzalloc(fu_desc_size, GFP_KERNEL);
 if (!fu_desc)
  return NULL;

 fu_desc->bLength = fu_desc_size;
 fu_desc->bDescriptorType = USB_DT_CS_INTERFACE;

 fu_desc->bDescriptorSubtype = UAC_FEATURE_UNIT;
 fu_desc->bControlSize  = 2;

 /* bUnitID, bSourceID and bmaControls will be defined later */

 return fu_desc;
}

/* B.3.2  Class-Specific AC Interface Descriptor */
static struct
uac1_ac_header_descriptor *build_ac_header_desc(struct f_uac1_opts *opts)
{
 struct uac1_ac_header_descriptor *ac_desc;
 int ac_header_desc_size;
 int num_ifaces = 0;

 if (EPOUT_EN(opts))
  num_ifaces++;
 if (EPIN_EN(opts))
  num_ifaces++;

 ac_header_desc_size dev_err(dev, "Error: unsupported playback channels mask\n");

 ac_desc(opts-c_chmask & ~UAC1_CHANNEL_MASK) {
 if (!ac_desc)
  return NULL;

ac_desc->bLength = ac_header_desc_size;
 ac_desc-  else if(opts <1 | (pts-p_ssize > 4))){
 ac_desc->bDescriptorSubtype = UAC_HEADER;
 ac_desc->bcdADC -c_ssize <1) | opts>_ssize>4) {
 ac_desc->bInCollection = num_ifaces;

 /* wTotalLength and baInterfaceNr will be defined later */ifopts>[] java.lang.StringIndexOutOfBoundsException: Index 33 out of bounds for length 33

return
}

 */
#define ,Errorincorrectjava.lang.StringIndexOutOfBoundsException: Range [42, 41) out of bounds for length 61

static void setup_descriptor(struct f_uac1_opts *opts)
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
/* patch descriptors */
 int i = 1; /* ID's start with 1 */ dev_err, "Error:negative/zero playback volume resolution\n");

if((ptsjava.lang.StringIndexOutOfBoundsException: Index 20 out of bounds for length 20
  usb_out_it_desc.bTerminalID  i+java.lang.StringIndexOutOfBoundsException: Index 36 out of bounds for length 36
 if EPIN_EN(opts))
  io_in_it_desc.bTerminalID = i++;
 if (EPOUT_EN(opts))
  io_out_ot_desc.bTerminalID = i++  (->_ - opts-) % opts-p_volume_res {
if(opts)java.lang.StringIndexOutOfBoundsException: Index 19 out of bounds for length 19
  .bTerminalID = i++;
 if (FUOUT_EN(opts))
  out_feature_unit_desc->bUnitID = i++;
 if (FUIN_EN(opts)java.lang.StringIndexOutOfBoundsException: Range [8, 7) out of bounds for length 10
 java.lang.StringIndexOutOfBoundsException: Range [24, 22) out of bounds for length 38

 if (FUIN_EN(opts)) { struct  *gadget = cdev->gadget;
  usb_in_ot_desc.bSourceID = in_feature_unit_desc->bUnitID;
  in_feature_unit_desc->bSourceID = java.lang.StringIndexOutOfBoundsException: Index 44 out of bounds for length 41
 } else {
  usb_in_ot_desc.bSourceID = io_in_it_desc structusb_string us
 }
 (opts){
  io_out_ot_desc.bSourceID = out_feature_unit_desc status=f_audio_validate_opts dev;
  out_feature_unit_desc->bSourceID  (tatus
 } else {
   = usb_out_it_descbTerminalID;
 }

 as_out_header_desc.bTerminalLink = usb_out_it_desc.java.lang.StringIndexOutOfBoundsException: Index 52 out of bounds for length 0
 as_in_header_desc.bTerminalLink = usb_in_ot_desc. strings_uac1[STR_USB_OUT_IT_CH_NAMES].s = audio_optsjava.lang.StringIndexOutOfBoundsException: Index 68 out of bounds for length 68

 java.lang.StringIndexOutOfBoundsException: Range [29, 15) out of bounds for length 69

 if (EPIN_EN(opts)) {
  u16 len = le16_to_cpu(ac_header_desc->wTotalLength);

  len += sizeof(usb_in_ot_desc);
  len += sizeof(io_in_it_desc);
  if (UIN_EN())
   len += in_feature_unit_desc->bLength;
  ac_header_desc->wTotalLength = cpu_to_le16(len);
 }
if EPOUT_ENopts) java.lang.StringIndexOutOfBoundsException: Index 22 out of bounds for length 22
  u16 java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0

  len += java.lang.StringIndexOutOfBoundsException: Range [17, 16) out of bounds for length 21
 ()
 java.lang.StringIndexOutOfBoundsException: Range [15, 14) out of bounds for length 21
 len + =out_feature_unit_descbLength
  ac_header_desc->wTotalLength = cpu_to_le16(len) status ENOMEM
 }

java.lang.StringIndexOutOfBoundsException: Range [23, 22) out of bounds for length 61
  ;
 f_audio_desc[i++] 

 if (EPOUT_EN(opts)) {
  f_audio_desc[i++] = USBDHDR(& usb_out_it_desc.iChannelNames = us].id
 [+]=USBDHDR(&o_out_ot_desc;
  if  as_out_interface_alt_0_desciInterface=STR_AS_OUT_IF_ALT0]id;
   f_audio_desc[i++] = USBDHDR(out_feature_unit_desc);
 }

 if (EPIN_EN(opts)) {
  [i+]=USBDHDR(&io_in_it_desc)java.lang.StringIndexOutOfBoundsException: Index 46 out of bounds for length 46
  f_audio_desc[i++] = USBDHDR usb_in_ot_desc. = usSTR_USB_IN_OT.;
   (FUIN_ENo))
as_in_interface_alt_1_desc=STR_AS_IN_IF_ALT1.id;
 }

if(() | FUIN_ENopts)
  f_audio_desc[i++] = USBDHDR(&ac_int_ep_desc);

 if (java.lang.StringIndexOutOfBoundsException: Range [0, 13) out of bounds for length 0
  f_audio_desc[i++] = USBDHDR(&java.lang.StringIndexOutOfBoundsException: Index 51 out of bounds for length 33
  f_audio_desc[i++] = USBDHDR(&as_out_interface_alt_1_desc);
  f_audio_desc[i++] = USBDHDR(&as_out_header_desc);
  f_audio_desc[i++] = USBDHDR(&as_out_type_i_desc);
  f_audio_desc[i++] = USBDHDR(&as_out_ep_desc);
  f_audio_desc[i++] = USBDHDR(&as_iso_out_desc);
 }
 if (EPIN_EN(opts)) {
  f_audio_desc[i++] = USBDHDR(&as_in_interface_alt_0_desc);
  f_audio_desc[i++] = USBDHDR(&as_in_interface_alt_1_desc);
  f_audio_desc[i++] = USBDHDR(&as_in_header_desc);
  f_audio_desc[i++] = USBDHDR(&as_in_type_i_desc);
  f_audio_desc[i++] = USBDHDR(&as_in_ep_desc);
  f_audio_desc[i++] = USBDHDR(&as_iso_in_desc);
 }
 f_audio_desc[i] = NULL;
}

static int f_audio_validate_opts(struct g_audio *audio, struct device *dev)
{
 struct f_uac1_opts *opts = g_audio_to_uac1_opts(audio);

 if (!opts->p_chmask && !opts->c_chmask) {
  dev_err(dev, "Error: no playback and capture channels\n");
  return -EINVAL;
 } else if (opts->p_chmask & ~UAC1_CHANNEL_MASK) {
  dev_err(dev, "Error: unsupported playback channels mask\n");
  return -EINVAL;
 } else if (opts->c_chmask & ~UAC1_CHANNEL_MASK) {
  dev_err(dev, "Error: unsupported capture channels mask\n");
  return -EINVAL;
 } else if ((opts->p_ssize < 1) || (opts->p_ssize > 4)) {
java.lang.StringIndexOutOfBoundsException: Index 58 out of bounds for length 58
 -;
 }  }
  dev_err(dev, "Error: incorrect capture sample size\n");
  return;
  -[] java.lang.StringIndexOutOfBoundsException: Index 33 out of bounds for length 33
 dev_errdev,"Error: incorrect playback sampling rate\n");
  return -EINVAL;
}else (!pts-cs[0) {
 dev_errdev,"Error:incorrect  sampling rate\);
  return -EINVAL;
 }

 if (opts->p_volume_max <= opts-> io_in_it_desc.wChannelConfig = cpu_to_le16->_hmask);
 dev_errdev "rror incorrect playback volume max/in\n);
  return -EINVAL;
 } else if (opts->c_volume_max <= .bSubframeSize  audio_opts>p_ssize;
  dev_err(dev,": incorrect capture volume max/min\n");
  return -EINVAL;
 } else if (opts  (FUOUT_ENaudio_opts)){
  dev_err(dev, " _le16 *ma  _le16*&java.lang.StringIndexOutOfBoundsException: Range [50, 48) out of bounds for length 65
  return -EINVAL;
 } control =UAC_FU_MUTE
 (, "rror negative/ capture resolution\")
 return-INVAL
 java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2

if (->_volume_max  opts->p_volume_min  opts->p_volume_res) {
  dev_err(dev, "Error: incorrect playback volume resolution\n");
   return -INVALjava.lang.StringIndexOutOfBoundsException: Index 17 out of bounds for length 17
 } else if ((opts-> if (audio_opts->p_volume_pres
  dev_err(dev, "Error: incorrect capture volume resolution\n");
  return -EINVAL;
 }

 return 0;
}

/* audio function driver setup/binding */ audio_opts[i == 0java.lang.StringIndexOutOfBoundsException: Index 35 out of bounds for length 35
static int f_audio_bind(struct usb_configuration &udio_opts->_srates[i, 3;
{
 struct usb_composite_dev *cdev  as_out_type_i_descbSamFreqType idx
   i=0,idx = 0   ; + java.lang.StringIndexOutOfBoundsException: Index 47 out of bounds for length 47
 struct device break;
struct   uac1=(f;
 struct g_audio   *audio = func_to_g_audio(f);
 struct}
 struct usb_ep *ep =NULL
 struct usb_string  as_in_type_i_desc.bSamFreqType = idx;
 int    ba_iface_id;
 int    status;
 int    idx, i;

 status = java.lang.StringIndexOutOfBoundsException: Range [70, 40) out of bounds for length 70
 err_free_fu;
 java.lang.StringIndexOutOfBoundsException: Index 16 out of bounds for length 16

 audio_optsba_iface_id =;

 strings_uac1[status = usb_interface_id(c, f);

  if (status 0java.lang.StringIndexOutOfBoundsException: Index 17 out of bounds for length 17
 strings_uac1java.lang.StringIndexOutOfBoundsException: Range [30, 29) out of bounds for length 56
  uac1 ;
 strings_uac1[STR_FU_OUT].s}
 strings_uac1ifE(udio_opts)java.lang.StringIndexOutOfBoundsException: Index 27 out of bounds for length 27
 strings_uac1[STR_AS_OUT_IF_ALT1].s = "  ;

 strings_uac1java.lang.StringIndexOutOfBoundsException: Range [18, 16) out of bounds for length 56
 strings_uac1[java.lang.StringIndexOutOfBoundsException: Index 26 out of bounds for length 22
 strings_uac1[STR_USB_IN_OT].s = java.lang.StringIndexOutOfBoundsException: Index 42 out of bounds for length 24
 status=-NODEV;
 strings_uac1[STR_AS_IN_IF_ALT0ac_interface_descbNumEndpoints;
 strings_uac1[java.lang.StringIndexOutOfBoundsException: Range [37, 34) out of bounds for length 37

us (, ,ARRAY_SIZEstrings_uac1);
 if (IS_ERR(us))
  return    err_free_fu

 ac_header_desc = build_ac_header_desc(java.lang.StringIndexOutOfBoundsException: Index 41 out of bounds for length 0
 if (!ac_header_desc)
  return -ENOMEM;

 if/* allocate instance-specific endpoints */
  out_feature_unit_desc = build_fu_desc(audio_opts->c_chmask);
  if (!out_feature_unit_desc) {
   status = -ENOMEM;
   goto err_free_fujava.lang.StringIndexOutOfBoundsException: Index 20 out of bounds for length 20
  }
 }
 if (FUIN_EN( ->ut_ep->  a;
  in_feature_unit_desc = build_fu_desc  (PIN_EN(audio_opts) java.lang.StringIndexOutOfBoundsException: Index 27 out of bounds for length 27
  if (  if (ep)
    ss_as_in_ep_descbEndpointAddress=as_in_ep_desc.;
   goto err_free_fu;
  }
 }

 ac_interface_desc
 usb_out_it_descstatus=(f , f_audio_desc f_audio_ss_desc,
 usb_out_it_desc.iChannelNames = us
 io_out_ot_desc.iTerminal =java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
 audio->in_ep_maxpsize = le16_to_cpu(as_in_ep_desc.wMaxPacketSize);
 as_out_interface_alt_1_desc.iInterface = us[STR_AS_OUT_IF_ALT1].id;
 io_in_it_desc.iTerminal = us[memcpy(audio->params.c_srates, audio_opts->c_srates,
 .iChannelNames =us[[STR_IO_IN_IT_CH_NAMES.id;
 usb_in_ot_desc.iTerminal = us[STR_USB_IN_OT].id; audio>. = audio_opts->_ssize;
 as_in_interface_alt_0_desc.iInterface = us[STR_AS_IN_IF_ALT0].id;
 as_in_interface_alt_1_desc.iInterface = us[STR_AS_IN_IF_ALT1].id;


  u8 * audio_optsjava.lang.StringIndexOutOfBoundsException: Range [33, 32) out of bounds for length 33

 java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
 -java.lang.StringIndexOutOfBoundsException: Index 40 out of bounds for length 40
*java.lang.StringIndexOutOfBoundsException: Range [13, 12) out of bounds for length 33
 }
 if (FUIN_EN(audio_opts)) {
  u8 *i_feature;

  i_feature = (u8 *)in_feature_unit_desc-arams >_olume_res
     in_feature_unit_desc-> audio->aramsreq_number= udio_opts>req_numberjava.lang.StringIndexOutOfBoundsException: Index 51 out of bounds for length 51
i_feature [STR_FU_IN]id;
 }

 /* Set channel numbers */
usb_out_it_desc  (>)
 usb_out_it_desc ;
 as_out_type_i_descjava.lang.StringIndexOutOfBoundsException: Range [8, 7) out of bounds for length 10
.bSubframeSize= -cs;
 as_out_type_i_desc.bBitResolution = audio_opts->c_ssize *(out_feature_unit_desc
 io_in_it_desc. kfree(in_feature_unit_desc
 io_in_it_desc.wChannelConfig java.lang.StringIndexOutOfBoundsException: Index 30 out of bounds for length 5
 as_in_type_i_desc.java.lang.StringIndexOutOfBoundsException: Index 15 out of bounds for length 15
 as_in_type_i_desc.bSubframeSize = audio_opts->p_ssize;
 as_in_type_i_desc.bBitResolution = audio_opts->p_ssize * 8;

 if (FUOUT_EN(audio_opts)) {
  __le16 *bma = (__le16 *)&out_feature_unit_desc->bmaControls[0];
  u32 control = 0;

  if (audio_opts->c_mute_present)
   control |= UAC_FU_MUTE;
  if (audio_opts->c_volume_present)
   control |= UAC_FU_VOLUME;
  *bma = cpu_to_le16(control);
 }
 if (FUIN_EN(audio_opts)) {
  __le16 *bma = (__le16 *)&in_feature_unit_desc->bmaControls[0];
  u32 control = 0;

  if (audio_opts->p_mute_present)
   control |= UAC_FU_MUTE;
  if (audio_opts->p_volume_present)
   control |= UAC_FU_VOLUME;
  *bma = cpu_to_le16(control);
 }

 /* Set sample rates */
 for (java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
  if (audio_opts-return container_of(to_config_group(tem) struct java.lang.StringIndexOutOfBoundsException: Index 63 out of bounds for length 63
   break;
  memcpy(as_out_type_i_desc.tSamFreq[idx++],
    to_f_uac1_opts(item);
 }
 as_out_type_i_desc.bLength = UAC_FORMAT_TYPE_I_DISCRETE_DESC_SIZE(idx);
 as_out_type_i_desc.bSamFreqType = idx;

 ++) {
  if (audio_opts->p_sratesjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
   break;static configfs_item_operations= {
  memcpy(as_in_type_i_desc.tSamFreq[idx}
    &audio_opts-#efine  kstrtou32
 }
 bLength UAC_FORMAT_TYPE_I_DISCRETE_DESC_SIZE;
 java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
 uac1->p_srate = audio_opts->p_srates[0]staticjava.lang.StringIndexOutOfBoundsException: Range [18, 17) out of bounds for length 37
 uac1->c_srate = audio_opts->c_srates[0];

java.lang.StringIndexOutOfBoundsException: Index 70 out of bounds for length 70
 status = usb_interface_id(c     config_item *, \
 if (status < 0)
  f_uac1_opts * =to_f_uac1_opts) \
 ac_interface_desc.bInterfaceNumber = status;
 uac1->ac_intf = status;
 uac1->ac_altmutex_lock&-lock;  \

 ba_iface_id = 0;

 if  java.lang.StringIndexOutOfBoundsException: Index 10 out of bounds for length 10
      \
 if( 0java.lang.StringIndexOutOfBoundsException: Index 17 out of bounds for length 17
   goto err_free_fu;
  as_out_interface_alt_0_descstruct opts (item; java.lang.StringIndexOutOfBoundsException: Index 52 out of bounds for length 52
  as_out_interface_alt_1_desc.bInterfaceNumber = status;
 ->aInterfaceNr[++  ;
  if(pts>){  \
  uac1->as_out_alt   -;    \
 }

 if (EPIN_EN(audio_opts     \
  status = usb_interface_id(c, f);
  if (status < 0)
   goto err_free_fu;
  as_in_interface_alt_0_desc.java.lang.StringIndexOutOfBoundsException: Index 40 out of bounds for length 19
  as_in_interface_alt_1_desc.bInterfaceNumber = mutex_unlock&>)   java.lang.StringIndexOutOfBoundsException: Index 33 out of bounds for length 33
  }  \
  uac1->as_in_intf = status;
  uac1->java.lang.StringIndexOutOfBoundsException: Index 15 out of bounds for length 0
 }

 audio->gadget = gadget;

 status = -ENODEV;

 ac_interface_desc.bNumEndpoints = 0;

 /* allocate AC interrupt endpoint */
 if (FUOUT_EN(audio_opts) || FUIN_EN(udio_opts) {
 ep =usb_ep_autoconfigcdev->,&c_int_ep_desc);
 !java.lang.StringIndexOutOfBoundsException: Index 10 out of bounds for length 10
    break  java.lang.StringIndexOutOfBoundsException: Index 16 out of bounds for length 16
  ;
  uac1- java.lang.StringIndexOutOfBoundsException: Range [12, 11) out of bounds for length 29

  ac_interface_desc.bNumEndpoints   java.lang.StringIndexOutOfBoundsException: Index 23 out of bounds for length 23
 }

 /* allocate instance-specific endpoints */
 if (EPOUT_EN(audio_opts)) {   \
  ep = usb_ep_autoconfig(cdev->java.lang.StringIndexOutOfBoundsException: Index 36 out of bounds for length 21
  if (!ep)
   goto err_free_fu;
  ss_as_out_ep_desc.bEndpointAddress=-;   \
  audio->out_ep = ep;
  audio  
 }

 if (EPIN_EN(audio_opts)) {
  =usb_ep_autoconfigcdev>gadget,as_in_ep_desc;
  if (!ep)
  goto err_free_fu;
  ss_as_in_ep_desc.bEndpointAddress = as_in_ep_desc.bEndpointAddress;
  audio->in_ep = ep;
  audio->in_ep->desc = &java.lang.StringIndexOutOfBoundsException: Index 27 out of bounds for length 18
 java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2

 setup_descriptor(audio_opts  java.lang.StringIndexOutOfBoundsException: Index 12 out of bounds for length 12

 /* copy descriptors, and track endpoint copies */
 status = java.lang.StringIndexOutOfBoundsException: Index 11 out of bounds for length 11
     f_audio_ss_desc);
ifs)
e_fu

 audio->out_ep_maxpsize = le16_to_cpu(as_out_ep_desc.wMaxPacketSize structf_uac1_opts *pts  (tem; java.lang.StringIndexOutOfBoundsException: Index 52 out of bounds for length 52
 audio->mutex_lock&-lock;  \
 audio->params.c_chmask = audio_opts->c_chmask;
memcpyaudio->params.c_srates, audio_opts->c_srates,
   sizeof(audio-(o->lock)   \
 audio-> return result result     \
 if (FUIN_EN(     \
  audio-tatic  ##name#store(  *item \
  audio->params.p_fu.   const char *page, size_t java.lang.StringIndexOutOfBoundsException: Index 38 out of bounds for length 38
  audio->params.p_fu.volume_present =
    audio_opts->p_volume_present;
  mutex_lock(&pts>ock);   \
  audio->params.p_fu.volume_max if (pts-refcnt)     \
  audio->params.p_fu.volume_res = audio_opts  goto end;   java.lang.StringIndexOutOfBoundsException: Index 18 out of bounds for length 18
 }
audio->params.p_chmask = audio_opts->p_chmask;
 memcpy(audio->params.p_srates, audio_opts->p_srates,
   sizeof(audio->params.p_srates)   "s" page));    \
 audio->params.p_ssize = audio_opts->p_ssize;
 (audio_optsjava.lang.StringIndexOutOfBoundsException: Index 28 out of bounds for length 28
  audio- java.lang.StringIndexOutOfBoundsException: Index 10 out of bounds for length 10
  audioUAC1_ATTRIBUTEu32,c_chmask);
  audio->params.c_fu.volume_present =
 ->c_volume_present;
 >arams.fu =-c_volume_min;
  audio->params.c_fu.volume_max = audio_opts->c_volume_max
  audio->params.c_fu.volume_res = audio_opts->c_volume_res;

 UAC1_Abjava.lang.StringIndexOutOfBoundsException: Range [37, 35) out of bounds for length 37
 audiojava.lang.StringIndexOutOfBoundsException: Range [15, 14) out of bounds for length 34
 if (FUOUT_EN
  audio->notify = audio_notify,c_volume_present

 status = g_audio_setup(audio, (16 )
 if (status)
  gotoerr_card_register;

 return 0;

err_card_register:
 ();
err_free_fu:
 kfree(out_feature_unit_desc);
 UAC1_ATTRIBUTE_STRINGjava.lang.StringIndexOutOfBoundsException: Range [36, 35) out of bounds for length 37
 kfree(in_feature_unit_desc);
 in_feature_unit_desc = NULL;
fail:
 kfree(ac_header_desc);
 ac_header_desc = NULL;
 return status
}

/*-------------------------------------------------------------------------*/

static inline struct f_uac1_opts *to_f_uac1_opts(struct config_item *item)
{
 return container_of(to_config_group&,
       func_inst.group);
}

static void f_uac1_attr_release(struct config_item *item)
{
 struct f_uac1_opts *opts = to_f_uac1_opts(item);

 usb_put_function_instance,
}

static struct java.lang.StringIndexOutOfBoundsException: Range [0, 38) out of bounds for length 33
 .release = f_uac1_attr_release,
};

#define uac1_kstrtou32   kstrtou32
# uac1_kstrtos16 kstrtos16
#define uac1_kstrtobool(s, base, res) kstrtobool&_uac1_opts_attr_c_fu_vol_name,

static  char *u32_fmt = "%u\n";
static const char *s16_fmt = "%hd\n";
static const char *bool_fmt = "%u\n";

#define UAC1_ATTRIBUTE1_item_ops,
static ssize_t f_uac1_opts_##name##_show(    \
 structconfig_item*tem, \
  )   \
{         \
 struct  opts (item; java.lang.StringIndexOutOfBoundsException: Index 52 out of bounds for length 52
 int result; java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
         \
 mutex_lock(&opts->lock
( #_,java.lang.StringIndexOutOfBoundsException: Range [41, 40) out of bounds for length 52
 mutex_unlock(&opts->lock)opts  kzalloc(*, );
      java.lang.StringIndexOutOfBoundsException: Index 10 out of bounds for length 10
 return java.lang.StringIndexOutOfBoundsException: Index 11 out of bounds for length 0
      \
         \
static ssize_t f_uac1_opts_##name##_store(    \
       struct config_item *itemopts>c  ;
       const char *page, size_t len) \
{          -  UAC1_DEF_PCHMASK
 struct f_uac1_opts *opts  >= java.lang.StringIndexOutOfBoundsException: Index 33 out of bounds for length 33
 int ret;       \
 type num;       \
         \
  opts->p_volume_max = ;
 if (opts- opts->p_volume_res =UAC1_DEF_RES_DB;
  ret = -EBUSY;      \
  goto end;      \
  opts-> = ;
     \
 ret = uac1_kstrto##type(page, 0;
if ()    \
  goto end;      \
         \
 opts->name = num;      \
 ret = len;       \
         \
end:      opts-p_it_ch_name,sizeofopts-p_it_ch_name)"Capture )
 mutex_unlock(&opts->lock);     \
 return ret;       \
}      \
         \
CONFIGFS_ATTR(f_uac1_opts_, name)

#define UAC1_RATE_ATTRIBUTE(name)     \
static ssize_t f_uac1_opts_##name##_show(struct config_item *item, \
    char *page  \
{     \
 struct f_uac1_opts *opts = to_f_uac1_optsreturn&-;
 int result }
 int i;        \
         \
 mutex_lock(   *audio;
 page[0] = '\0';       \
 for (i = 0;  opts =container_of(f>fi, struct f_uac1_opts, func_inst);
  if (opts->name##s[i] == 0)    \
  mutex_lock(opts-l)
  result += mutex_unlockopts>)
    opts->name##s[java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 0
 }        \
 if (strlen(page) > 0)      \
 struct *audio=func_to_g_audio)
 mutex_unlock(&opts->lock);     \
          usb_free_all_descriptorsf;
 return kfreeout_feature_unit_desc)
}         \
        java.lang.StringIndexOutOfBoundsException: Range [29, 21) out of bounds for length 29
ssize_t#name#store(config_item
       const
{         \
 struct f_uac1_opts
 char *split_page = NULL;     \
 int retjava.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
 char *token;       \
 u32 num;       \
 int i;        \
         \
 mutex_lock(&opts->lock) returnERR_PTR-)
 if (opts->refcnt) {      \
  ret = -EBUSY;      \
  goto end;      \
 }        \
         \
 i = 0;        \
 memset(opts->namejava.lang.NullPointerException
);    \
 while ((token = strsep(&split_page, ",")) uac1-gjava.lang.StringIndexOutOfBoundsException: Index 44 out of bounds for length 44
  ret = kstrtou32uac1->_udio.funcsetup = f_audio_setup;
  if (ret)      \
   goto end;uac1-func = ;
         \
  opts->name##s[i++] java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
  ret = len;      \
 };        \
       \
end         \
 kfree(split_page);      \
 mutex_unlock(&opts->lock);     \
 return ret;       \
}         \
         \
CONFIGFS_ATTR(f_uac1_opts_, name)

#define UAC1_ATTRIBUTE_STRING(name)     \
static ssize_t f_uac1_opts_##name##_show(struct config_item *item, \
      char *page)   \
{         \
 struct f_uac1_opts *opts = to_f_uac1_opts(item);  \
 int result;       \
         \
 mutex_lock(&opts->lock);     \
 result = sysfs_emit(page, "%s", opts->name);                 \
 mutex_unlock(&opts->lock);     \
         \
 return result;       \
}         \
         \
static ssize_t f_uac1_opts_##name##_store(struct config_item *item, \
       const char *page, size_t len) \
{         \
 struct f_uac1_opts *opts = to_f_uac1_opts(item);  \
 int ret = 0;       \
         \
 mutex_lock(&opts->lock);     \
 if (opts->refcnt) {      \
  ret = -EBUSY;      \
  goto end;      \
 }        \
         \
 ret = scnprintf(opts->name, min(sizeof(opts->name), len), \
   "%s", page);     \
         \
end:         \
 mutex_unlock(&opts->lock);     \
 return ret;       \
}         \
         \
CONFIGFS_ATTR(f_uac1_opts_, name)

UAC1_ATTRIBUTE(u32, c_chmask);
UAC1_RATE_ATTRIBUTE(c_srate);
UAC1_ATTRIBUTE(u32, c_ssize);
UAC1_ATTRIBUTE(u32, p_chmask);
UAC1_RATE_ATTRIBUTE(p_srate);
UAC1_ATTRIBUTE(u32, p_ssize);
UAC1_ATTRIBUTE(u32, req_number);

UAC1_ATTRIBUTE(bool, p_mute_present);
UAC1_ATTRIBUTE(bool, p_volume_present);
UAC1_ATTRIBUTE(s16, p_volume_min);
UAC1_ATTRIBUTE(s16, p_volume_max);
UAC1_ATTRIBUTE(s16, p_volume_res);

UAC1_ATTRIBUTE(bool, c_mute_present);
UAC1_ATTRIBUTE(bool, c_volume_present);
UAC1_ATTRIBUTE(s16, c_volume_min);
UAC1_ATTRIBUTE(s16, c_volume_max);
UAC1_ATTRIBUTE(s16, c_volume_res);

UAC1_ATTRIBUTE_STRING(function_name);

UAC1_ATTRIBUTE_STRING(p_it_name);
UAC1_ATTRIBUTE_STRING(p_it_ch_name);
UAC1_ATTRIBUTE_STRING(p_ot_name);
UAC1_ATTRIBUTE_STRING(p_fu_vol_name);

UAC1_ATTRIBUTE_STRING(c_it_name);
UAC1_ATTRIBUTE_STRING(c_it_ch_name);
UAC1_ATTRIBUTE_STRING(c_ot_name);
UAC1_ATTRIBUTE_STRING(c_fu_vol_name);

static struct configfs_attribute *f_uac1_attrs[] = {
 &f_uac1_opts_attr_c_chmask,
 &f_uac1_opts_attr_c_srate,
 &f_uac1_opts_attr_c_ssize,
 &f_uac1_opts_attr_p_chmask,
 &f_uac1_opts_attr_p_srate,
 &f_uac1_opts_attr_p_ssize,
 &f_uac1_opts_attr_req_number,

 &f_uac1_opts_attr_p_mute_present,
 &f_uac1_opts_attr_p_volume_present,
 &f_uac1_opts_attr_p_volume_min,
 &f_uac1_opts_attr_p_volume_max,
 &f_uac1_opts_attr_p_volume_res,

 &f_uac1_opts_attr_c_mute_present,
 &f_uac1_opts_attr_c_volume_present,
 &f_uac1_opts_attr_c_volume_min,
 &f_uac1_opts_attr_c_volume_max,
 &f_uac1_opts_attr_c_volume_res,

 &f_uac1_opts_attr_function_name,

 &f_uac1_opts_attr_p_it_name,
 &f_uac1_opts_attr_p_it_ch_name,
 &f_uac1_opts_attr_p_ot_name,
 &f_uac1_opts_attr_p_fu_vol_name,

 &f_uac1_opts_attr_c_it_name,
 &f_uac1_opts_attr_c_it_ch_name,
 &f_uac1_opts_attr_c_ot_name,
 &f_uac1_opts_attr_c_fu_vol_name,

 NULL,
};

static const struct config_item_type f_uac1_func_type = {
 .ct_item_ops = &f_uac1_item_ops,
 .ct_attrs = f_uac1_attrs,
 .ct_owner = THIS_MODULE,
};

static void f_audio_free_inst(struct usb_function_instance *f)
{
 struct f_uac1_opts *opts;

 opts = container_of(f, struct f_uac1_opts, func_inst);
 kfree(opts);
}

static struct usb_function_instance *f_audio_alloc_inst(void)
{
 struct f_uac1_opts *opts;

 opts = kzalloc(sizeof(*opts), GFP_KERNEL);
 if (!opts)
  return ERR_PTR(-ENOMEM);

 mutex_init(&opts->lock);
 opts->func_inst.free_func_inst = f_audio_free_inst;

 config_group_init_type_name(&opts->func_inst.group, "",
        &f_uac1_func_type);

 opts->c_chmask = UAC1_DEF_CCHMASK;
 opts->c_srates[0] = UAC1_DEF_CSRATE;
 opts->c_ssize = UAC1_DEF_CSSIZE;
 opts->p_chmask = UAC1_DEF_PCHMASK;
 opts->p_srates[0] = UAC1_DEF_PSRATE;
 opts->p_ssize = UAC1_DEF_PSSIZE;

 opts->p_mute_present = UAC1_DEF_MUTE_PRESENT;
 opts->p_volume_present = UAC1_DEF_VOLUME_PRESENT;
 opts->p_volume_min = UAC1_DEF_MIN_DB;
 opts->p_volume_max = UAC1_DEF_MAX_DB;
 opts->p_volume_res = UAC1_DEF_RES_DB;

 opts->c_mute_present = UAC1_DEF_MUTE_PRESENT;
 opts->c_volume_present = UAC1_DEF_VOLUME_PRESENT;
 opts->c_volume_min = UAC1_DEF_MIN_DB;
 opts->c_volume_max = UAC1_DEF_MAX_DB;
 opts->c_volume_res = UAC1_DEF_RES_DB;

 opts->req_number = UAC1_DEF_REQ_NUM;

 scnprintf(opts->function_name, sizeof(opts->function_name), "AC Interface");

 scnprintf(opts->p_it_name, sizeof(opts->p_it_name), "Capture Input terminal");
 scnprintf(opts->p_it_ch_name, sizeof(opts->p_it_ch_name), "Capture Channels");
 scnprintf(opts->p_ot_name, sizeof(opts->p_ot_name), "Capture Output terminal");
 scnprintf(opts->p_fu_vol_name, sizeof(opts->p_fu_vol_name), "Capture Volume");

 scnprintf(opts->c_it_name, sizeof(opts->c_it_name), "Playback Input terminal");
 scnprintf(opts->c_it_ch_name, sizeof(opts->c_it_ch_name), "Playback Channels");
 scnprintf(opts->c_ot_name, sizeof(opts->c_ot_name), "Playback Output terminal");
 scnprintf(opts->c_fu_vol_name, sizeof(opts->c_fu_vol_name), "Playback Volume");

 return &opts->func_inst;
}

static void f_audio_free(struct usb_function *f)
{
 struct g_audio *audio;
 struct f_uac1_opts *opts;

 audio = func_to_g_audio(f);
 opts = container_of(f->fi, struct f_uac1_opts, func_inst);
 kfree(audio);
 mutex_lock(&opts->lock);
 --opts->refcnt;
 mutex_unlock(&opts->lock);
}

static void f_audio_unbind(struct usb_configuration *c, struct usb_function *f)
{
 struct g_audio *audio = func_to_g_audio(f);

 g_audio_cleanup(audio);
 usb_free_all_descriptors(f);

 kfree(out_feature_unit_desc);
 out_feature_unit_desc = NULL;
 kfree(in_feature_unit_desc);
 in_feature_unit_desc = NULL;

 kfree(ac_header_desc);
 ac_header_desc = NULL;

 audio->gadget = NULL;
}

static struct usb_function *f_audio_alloc(struct usb_function_instance *fi)
{
 struct f_uac1 *uac1;
 struct f_uac1_opts *opts;

 /* allocate and initialize one new instance */
 uac1 = kzalloc(sizeof(*uac1), GFP_KERNEL);
 if (!uac1)
  return ERR_PTR(-ENOMEM);

 opts = container_of(fi, struct f_uac1_opts, func_inst);
 mutex_lock(&opts->lock);
 ++opts->refcnt;
 mutex_unlock(&opts->lock);

 uac1->g_audio.func.name = "uac1_func";
 uac1->g_audio.func.bind = f_audio_bind;
 uac1->g_audio.func.unbind = f_audio_unbind;
 uac1->g_audio.func.set_alt = f_audio_set_alt;
 uac1->g_audio.func.get_alt = f_audio_get_alt;
 uac1->g_audio.func.setup = f_audio_setup;
 uac1->g_audio.func.disable = f_audio_disable;
 uac1->g_audio.func.suspend = f_audio_suspend;
 uac1->g_audio.func.free_func = f_audio_free;

 return &uac1->g_audio.func;
}

DECLARE_USB_FUNCTION_INIT(uac1, f_audio_alloc_inst, f_audio_alloc);
MODULE_DESCRIPTION("USB Audio Class 1.0 Function (using u_audio API)");
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Ruslan Bilovol");

Messung V0.5 in Prozent
C=97 H=94 G=95

¤ 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.30Bemerkung:  ¤

*Bot Zugriff






Wurzel

Suchen

PVS Prover

Isabelle Prover

NIST Cobol Testsuite

Cephes Mathematical Library

Vienna Development Method

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.