USB Composite support

Dependents:   mbed_cdc_hid_composite

Fork of USBDevice by mbed official

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers USBAudio.cpp Source File

USBAudio.cpp

00001 /* Copyright (c) 2010-2011 mbed.org, MIT License
00002 *
00003 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
00004 * and associated documentation files (the "Software"), to deal in the Software without
00005 * restriction, including without limitation the rights to use, copy, modify, merge, publish,
00006 * distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
00007 * Software is furnished to do so, subject to the following conditions:
00008 *
00009 * The above copyright notice and this permission notice shall be included in all copies or
00010 * substantial portions of the Software.
00011 *
00012 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
00013 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
00014 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
00015 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
00016 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
00017 */
00018 
00019 #include "stdint.h"
00020 #include "USBAudio.h"
00021 #include "USBAudio_Types.h"
00022 
00023 
00024 
00025 USBAudio::USBAudio(uint32_t frequency_in, uint8_t channel_nb_in, uint32_t frequency_out, uint8_t channel_nb_out, uint16_t vendor_id, uint16_t product_id, uint16_t product_release): USBDevice(vendor_id, product_id, product_release) {
00026     mute = 0;
00027     volCur = 0x0080;
00028     volMin = 0x0000;
00029     volMax = 0x0100;
00030     volRes = 0x0004;
00031     available = false;
00032 
00033     FREQ_IN = frequency_in;
00034     FREQ_OUT = frequency_out;
00035 
00036     this->channel_nb_in = channel_nb_in;
00037     this->channel_nb_out = channel_nb_out;
00038 
00039     // stereo -> *2, mono -> *1
00040     PACKET_SIZE_ISO_IN = (FREQ_IN / 500) * channel_nb_in;
00041     PACKET_SIZE_ISO_OUT = (FREQ_OUT / 500) * channel_nb_out;
00042 
00043     // STEREO -> left and right
00044     channel_config_in = (channel_nb_in == 1) ? CHANNEL_M : CHANNEL_L + CHANNEL_R;
00045     channel_config_out = (channel_nb_out == 1) ? CHANNEL_M : CHANNEL_L + CHANNEL_R;
00046 
00047     SOF_handler = false;
00048 
00049     buf_stream_out = NULL;
00050     buf_stream_in = NULL;
00051 
00052     interruptOUT = false;
00053     writeIN = false;
00054     interruptIN = false;
00055     available = false;
00056 
00057     volume = 0;
00058 
00059     // connect the device
00060     USBDevice::connect();
00061 }
00062 
00063 bool USBAudio::read(uint8_t * buf) {
00064     buf_stream_in = buf;
00065     SOF_handler = false;
00066     while (!available || !SOF_handler);
00067     available = false;
00068     return true;
00069 }
00070 
00071 bool USBAudio::readNB(uint8_t * buf) {
00072     buf_stream_in = buf;
00073     SOF_handler = false;
00074     while (!SOF_handler);
00075     if (available) {
00076         available = false;
00077         buf_stream_in = NULL;
00078         return true;
00079     }
00080     return false;
00081 }
00082 
00083 bool USBAudio::readWrite(uint8_t * buf_read, uint8_t * buf_write) {
00084     buf_stream_in = buf_read;
00085     SOF_handler = false;
00086     writeIN = false;
00087     if (interruptIN) {
00088         USBDevice::writeNB(EP3IN, buf_write, PACKET_SIZE_ISO_OUT, PACKET_SIZE_ISO_OUT);
00089     } else {
00090         buf_stream_out = buf_write;
00091     }
00092     while (!available);
00093     if (interruptIN) {
00094         while (!writeIN);
00095     }
00096     while (!SOF_handler);
00097     return true;
00098 }
00099 
00100 
00101 bool USBAudio::write(uint8_t * buf) {
00102     writeIN = false;
00103     SOF_handler = false;
00104     if (interruptIN) {
00105         USBDevice::writeNB(EP3IN, buf, PACKET_SIZE_ISO_OUT, PACKET_SIZE_ISO_OUT);
00106     } else {
00107         buf_stream_out = buf;
00108     }
00109     while (!SOF_handler);
00110     if (interruptIN) {
00111         while (!writeIN);
00112     }
00113     return true;
00114 }
00115 
00116 
00117 float USBAudio::getVolume() {
00118     return (mute) ? 0.0 : volume;
00119 }
00120 
00121 
00122 bool USBAudio::EPISO_OUT_callback() {
00123     uint32_t size = 0;
00124     interruptOUT = true;
00125     if (buf_stream_in != NULL) {
00126         readEP(EP3OUT, (uint8_t *)buf_stream_in, &size, PACKET_SIZE_ISO_IN);
00127         available = true;
00128         buf_stream_in = NULL;
00129     }
00130     readStart(EP3OUT, PACKET_SIZE_ISO_IN);
00131     return false;
00132 }
00133 
00134 
00135 bool USBAudio::EPISO_IN_callback() {
00136     interruptIN = true;
00137     writeIN = true;
00138     return true;
00139 }
00140 
00141 
00142 
00143 // Called in ISR context on each start of frame
00144 void USBAudio::SOF(int frameNumber) {
00145     uint32_t size = 0;
00146 
00147     if (!interruptOUT) {
00148         // read the isochronous endpoint
00149         if (buf_stream_in != NULL) {
00150             if (USBDevice::readEP_NB(EP3OUT, (uint8_t *)buf_stream_in, &size, PACKET_SIZE_ISO_IN)) {
00151                 if (size) {
00152                     available = true;
00153                     readStart(EP3OUT, PACKET_SIZE_ISO_IN);
00154                     buf_stream_in = NULL;
00155                 }
00156             }
00157         }
00158     }
00159 
00160     if (!interruptIN) {
00161         // write if needed
00162         if (buf_stream_out != NULL) {
00163             USBDevice::writeNB(EP3IN, (uint8_t *)buf_stream_out, PACKET_SIZE_ISO_OUT, PACKET_SIZE_ISO_OUT);
00164             buf_stream_out = NULL;
00165         }
00166     }
00167 
00168     SOF_handler = true;
00169 }
00170 
00171 
00172 // Called in ISR context
00173 // Set configuration. Return false if the configuration is not supported.
00174 bool USBAudio::USBCallback_setConfiguration(uint8_t configuration) {
00175     if (configuration != DEFAULT_CONFIGURATION) {
00176         return false;
00177     }
00178 
00179     // Configure isochronous endpoint
00180     realiseEndpoint(EP3OUT, PACKET_SIZE_ISO_IN, ISOCHRONOUS);
00181     realiseEndpoint(EP3IN, PACKET_SIZE_ISO_OUT, ISOCHRONOUS);
00182 
00183     // activate readings on this endpoint
00184     readStart(EP3OUT, PACKET_SIZE_ISO_IN);
00185     return true;
00186 }
00187 
00188 
00189 // Called in ISR context
00190 // Set alternate setting. Return false if the alternate setting is not supported
00191 bool USBAudio::USBCallback_setInterface(uint16_t interface, uint8_t alternate) {
00192     if (interface == 0 && alternate == 0) {
00193         return true;
00194     }
00195     if (interface == 1 && (alternate == 0 || alternate == 1)) {
00196         return true;
00197     }
00198     if (interface == 2 && (alternate == 0 || alternate == 1)) {
00199         return true;
00200     }
00201     return false;
00202 }
00203 
00204 
00205 
00206 // Called in ISR context
00207 // Called by USBDevice on Endpoint0 request
00208 // This is used to handle extensions to standard requests and class specific requests.
00209 // Return true if class handles this request
00210 bool USBAudio::USBCallback_request() {
00211     bool success = false;
00212     CONTROL_TRANSFER * transfer = getTransferPtr();
00213 
00214     // Process class-specific requests
00215     if (transfer->setup.bmRequestType.Type == CLASS_TYPE) {
00216 
00217         // Feature Unit: Interface = 0, ID = 2
00218         if (transfer->setup.wIndex == 0x0200) {
00219 
00220             // Master Channel
00221             if ((transfer->setup.wValue & 0xff) == 0) {
00222 
00223                 switch (transfer->setup.wValue >> 8) {
00224                     case MUTE_CONTROL:
00225                         switch (transfer->setup.bRequest) {
00226                             case REQUEST_GET_CUR:
00227                                 transfer->remaining = 1;
00228                                 transfer->ptr = &mute;
00229                                 transfer->direction = DEVICE_TO_HOST;
00230                                 success = true;
00231                                 break;
00232 
00233                             case REQUEST_SET_CUR:
00234                                 transfer->remaining = 1;
00235                                 transfer->notify = true;
00236                                 transfer->direction = HOST_TO_DEVICE;
00237                                 success = true;
00238                                 break;
00239                             default:
00240                                 break;
00241                         }
00242                         break;
00243                     case VOLUME_CONTROL:
00244                         switch (transfer->setup.bRequest) {
00245                             case REQUEST_GET_CUR:
00246                                 transfer->remaining = 2;
00247                                 transfer->ptr = (uint8_t *)&volCur;
00248                                 transfer->direction = DEVICE_TO_HOST;
00249                                 success = true;
00250                                 break;
00251                             case REQUEST_GET_MIN:
00252                                 transfer->remaining = 2;
00253                                 transfer->ptr = (uint8_t *)&volMin;
00254                                 transfer->direction = DEVICE_TO_HOST;
00255                                 success = true;
00256                                 break;
00257                             case REQUEST_GET_MAX:
00258                                 transfer->remaining = 2;
00259                                 transfer->ptr = (uint8_t *)&volMax;
00260                                 transfer->direction = DEVICE_TO_HOST;
00261                                 success = true;
00262                                 break;
00263                             case REQUEST_GET_RES:
00264                                 transfer->remaining = 2;
00265                                 transfer->ptr = (uint8_t *)&volRes;
00266                                 transfer->direction = DEVICE_TO_HOST;
00267                                 success = true;
00268                                 break;
00269 
00270                             case REQUEST_SET_CUR:
00271                                 transfer->remaining = 2;
00272                                 transfer->notify = true;
00273                                 transfer->direction = HOST_TO_DEVICE;
00274                                 success = true;
00275                                 break;
00276                             case REQUEST_SET_MIN:
00277                                 transfer->remaining = 2;
00278                                 transfer->notify = true;
00279                                 transfer->direction = HOST_TO_DEVICE;
00280                                 success = true;
00281                                 break;
00282                             case REQUEST_SET_MAX:
00283                                 transfer->remaining = 2;
00284                                 transfer->notify = true;
00285                                 transfer->direction = HOST_TO_DEVICE;
00286                                 success = true;
00287                                 break;
00288                             case REQUEST_SET_RES:
00289                                 transfer->remaining = 2;
00290                                 transfer->notify = true;
00291                                 transfer->direction = HOST_TO_DEVICE;
00292                                 success = true;
00293                                 break;
00294                         }
00295                         break;
00296                     default:
00297                         break;
00298                 }
00299             }
00300         }
00301     }
00302     return success;
00303 }
00304 
00305 
00306 // Called in ISR context when a data OUT stage has been performed
00307 void USBAudio::USBCallback_requestCompleted(uint8_t * buf, uint32_t length) {
00308     if ((length == 1) || (length == 2)) {
00309         uint16_t data = (length == 1) ? *buf : *((uint16_t *)buf);
00310         CONTROL_TRANSFER * transfer = getTransferPtr();
00311         switch (transfer->setup.wValue >> 8) {
00312             case MUTE_CONTROL:
00313                 switch (transfer->setup.bRequest) {
00314                     case REQUEST_SET_CUR:
00315                         mute = data & 0xff;
00316                         updateVol.call();
00317                         break;
00318                     default:
00319                         break;
00320                 }
00321                 break;
00322             case VOLUME_CONTROL:
00323                 switch (transfer->setup.bRequest) {
00324                     case REQUEST_SET_CUR:
00325                         volCur = data;
00326                         volume = (float)volCur/(float)volMax;
00327                         updateVol.call();
00328                         break;
00329                     default:
00330                         break;
00331                 }
00332                 break;
00333             default:
00334                 break;
00335         }
00336     }
00337 }
00338 
00339 
00340 
00341 #define TOTAL_DESCRIPTOR_LENGTH ((1 * CONFIGURATION_DESCRIPTOR_LENGTH) \
00342                                + (5 * INTERFACE_DESCRIPTOR_LENGTH) \
00343                                + (1 * CONTROL_INTERFACE_DESCRIPTOR_LENGTH + 1) \
00344                                + (2 * INPUT_TERMINAL_DESCRIPTOR_LENGTH) \
00345                                + (1 * FEATURE_UNIT_DESCRIPTOR_LENGTH) \
00346                                + (2 * OUTPUT_TERMINAL_DESCRIPTOR_LENGTH) \
00347                                + (2 * STREAMING_INTERFACE_DESCRIPTOR_LENGTH) \
00348                                + (2 * FORMAT_TYPE_I_DESCRIPTOR_LENGTH) \
00349                                + (2 * (ENDPOINT_DESCRIPTOR_LENGTH + 2)) \
00350                                + (2 * STREAMING_ENDPOINT_DESCRIPTOR_LENGTH) )
00351 
00352 #define TOTAL_CONTROL_INTF_LENGTH    (CONTROL_INTERFACE_DESCRIPTOR_LENGTH + 1 + \
00353                                       2*INPUT_TERMINAL_DESCRIPTOR_LENGTH     + \
00354                                       FEATURE_UNIT_DESCRIPTOR_LENGTH    + \
00355                                       2*OUTPUT_TERMINAL_DESCRIPTOR_LENGTH)
00356 
00357 uint8_t * USBAudio::configurationDesc() {
00358     static uint8_t configDescriptor[] = {
00359         // Configuration 1
00360         CONFIGURATION_DESCRIPTOR_LENGTH,        // bLength
00361         CONFIGURATION_DESCRIPTOR,               // bDescriptorType
00362         LSB(TOTAL_DESCRIPTOR_LENGTH),           // wTotalLength (LSB)
00363         MSB(TOTAL_DESCRIPTOR_LENGTH),           // wTotalLength (MSB)
00364         0x03,                                   // bNumInterfaces
00365         DEFAULT_CONFIGURATION,                  // bConfigurationValue
00366         0x00,                                   // iConfiguration
00367         0x80,                                   // bmAttributes
00368         50,                                     // bMaxPower
00369 
00370         // Interface 0, Alternate Setting 0, Audio Control
00371         INTERFACE_DESCRIPTOR_LENGTH,            // bLength
00372         INTERFACE_DESCRIPTOR,                   // bDescriptorType
00373         0x00,                                   // bInterfaceNumber
00374         0x00,                                   // bAlternateSetting
00375         0x00,                                   // bNumEndpoints
00376         AUDIO_CLASS,                            // bInterfaceClass
00377         SUBCLASS_AUDIOCONTROL,                  // bInterfaceSubClass
00378         0x00,                                   // bInterfaceProtocol
00379         0x00,                                   // iInterface
00380 
00381 
00382         // Audio Control Interface
00383         CONTROL_INTERFACE_DESCRIPTOR_LENGTH + 1,// bLength
00384         INTERFACE_DESCRIPTOR_TYPE,              // bDescriptorType
00385         CONTROL_HEADER,                         // bDescriptorSubtype
00386         LSB(0x0100),                            // bcdADC (LSB)
00387         MSB(0x0100),                            // bcdADC (MSB)
00388         LSB(TOTAL_CONTROL_INTF_LENGTH),         // wTotalLength
00389         MSB(TOTAL_CONTROL_INTF_LENGTH),         // wTotalLength
00390         0x02,                                   // bInCollection
00391         0x01,                                   // baInterfaceNr
00392         0x02,                                   // baInterfaceNr
00393 
00394         // Audio Input Terminal (Speaker)
00395         INPUT_TERMINAL_DESCRIPTOR_LENGTH,       // bLength
00396         INTERFACE_DESCRIPTOR_TYPE,              // bDescriptorType
00397         CONTROL_INPUT_TERMINAL,                 // bDescriptorSubtype
00398         0x01,                                   // bTerminalID
00399         LSB(TERMINAL_USB_STREAMING),            // wTerminalType
00400         MSB(TERMINAL_USB_STREAMING),            // wTerminalType
00401         0x00,                                   // bAssocTerminal
00402         channel_nb_in,                          // bNrChannels
00403         (uint8_t)(LSB(channel_config_in)),                 // wChannelConfig
00404         (uint8_t)(MSB(channel_config_in)),                 // wChannelConfig
00405         0x00,                                   // iChannelNames
00406         0x00,                                   // iTerminal
00407 
00408         // Audio Feature Unit (Speaker)
00409         FEATURE_UNIT_DESCRIPTOR_LENGTH,         // bLength
00410         INTERFACE_DESCRIPTOR_TYPE,              // bDescriptorType
00411         CONTROL_FEATURE_UNIT,                   // bDescriptorSubtype
00412         0x02,                                   // bUnitID
00413         0x01,                                   // bSourceID
00414         0x01,                                   // bControlSize
00415         CONTROL_MUTE |
00416         CONTROL_VOLUME,                         // bmaControls(0)
00417         0x00,                                   // bmaControls(1)
00418         0x00,                                   // iTerminal
00419 
00420         // Audio Output Terminal (Speaker)
00421         OUTPUT_TERMINAL_DESCRIPTOR_LENGTH,      // bLength
00422         INTERFACE_DESCRIPTOR_TYPE,              // bDescriptorType
00423         CONTROL_OUTPUT_TERMINAL,                // bDescriptorSubtype
00424         0x03,                                   // bTerminalID
00425         LSB(TERMINAL_SPEAKER),                  // wTerminalType
00426         MSB(TERMINAL_SPEAKER),                  // wTerminalType
00427         0x00,                                   // bAssocTerminal
00428         0x02,                                   // bSourceID
00429         0x00,                                   // iTerminal
00430 
00431 
00432         // Audio Input Terminal (Microphone)
00433         INPUT_TERMINAL_DESCRIPTOR_LENGTH,       // bLength
00434         INTERFACE_DESCRIPTOR_TYPE,              // bDescriptorType
00435         CONTROL_INPUT_TERMINAL,                 // bDescriptorSubtype
00436         0x04,                                   // bTerminalID
00437         LSB(TERMINAL_MICROPHONE),               // wTerminalType
00438         MSB(TERMINAL_MICROPHONE),               // wTerminalType
00439         0x00,                                   // bAssocTerminal
00440         channel_nb_out,                         // bNrChannels
00441         (uint8_t)(LSB(channel_config_out)),                // wChannelConfig
00442         (uint8_t)(MSB(channel_config_out)),                // wChannelConfig
00443         0x00,                                   // iChannelNames
00444         0x00,                                   // iTerminal
00445 
00446         // Audio Output Terminal (Microphone)
00447         OUTPUT_TERMINAL_DESCRIPTOR_LENGTH,      // bLength
00448         INTERFACE_DESCRIPTOR_TYPE,              // bDescriptorType
00449         CONTROL_OUTPUT_TERMINAL,                // bDescriptorSubtype
00450         0x05,                                   // bTerminalID
00451         LSB(TERMINAL_USB_STREAMING),            // wTerminalType
00452         MSB(TERMINAL_USB_STREAMING),            // wTerminalType
00453         0x00,                                   // bAssocTerminal
00454         0x04,                                   // bSourceID
00455         0x00,                                   // iTerminal
00456 
00457 
00458 
00459 
00460 
00461 
00462         // Interface 1, Alternate Setting 0, Audio Streaming - Zero Bandwith
00463         INTERFACE_DESCRIPTOR_LENGTH,            // bLength
00464         INTERFACE_DESCRIPTOR,                   // bDescriptorType
00465         0x01,                                   // bInterfaceNumber
00466         0x00,                                   // bAlternateSetting
00467         0x00,                                   // bNumEndpoints
00468         AUDIO_CLASS,                            // bInterfaceClass
00469         SUBCLASS_AUDIOSTREAMING,                // bInterfaceSubClass
00470         0x00,                                   // bInterfaceProtocol
00471         0x00,                                   // iInterface
00472 
00473         // Interface 1, Alternate Setting 1, Audio Streaming - Operational
00474         INTERFACE_DESCRIPTOR_LENGTH,            // bLength
00475         INTERFACE_DESCRIPTOR,                   // bDescriptorType
00476         0x01,                                   // bInterfaceNumber
00477         0x01,                                   // bAlternateSetting
00478         0x01,                                   // bNumEndpoints
00479         AUDIO_CLASS,                            // bInterfaceClass
00480         SUBCLASS_AUDIOSTREAMING,                // bInterfaceSubClass
00481         0x00,                                   // bInterfaceProtocol
00482         0x00,                                   // iInterface
00483 
00484         // Audio Streaming Interface
00485         STREAMING_INTERFACE_DESCRIPTOR_LENGTH,  // bLength
00486         INTERFACE_DESCRIPTOR_TYPE,              // bDescriptorType
00487         STREAMING_GENERAL,                      // bDescriptorSubtype
00488         0x01,                                   // bTerminalLink
00489         0x00,                                   // bDelay
00490         LSB(FORMAT_PCM),                        // wFormatTag
00491         MSB(FORMAT_PCM),                        // wFormatTag
00492 
00493         // Audio Type I Format
00494         FORMAT_TYPE_I_DESCRIPTOR_LENGTH,        // bLength
00495         INTERFACE_DESCRIPTOR_TYPE,              // bDescriptorType
00496         STREAMING_FORMAT_TYPE,                  // bDescriptorSubtype
00497         FORMAT_TYPE_I,                          // bFormatType
00498         channel_nb_in,                          // bNrChannels
00499         0x02,                                   // bSubFrameSize
00500         16,                                     // bBitResolution
00501         0x01,                                   // bSamFreqType
00502         (uint8_t)(LSB(FREQ_IN)),                           // tSamFreq
00503         (uint8_t)((FREQ_IN >> 8) & 0xff),                  // tSamFreq
00504         (uint8_t)((FREQ_IN >> 16) & 0xff),                 // tSamFreq
00505 
00506         // Endpoint - Standard Descriptor
00507         ENDPOINT_DESCRIPTOR_LENGTH + 2,         // bLength
00508         ENDPOINT_DESCRIPTOR,                    // bDescriptorType
00509         PHY_TO_DESC(EPISO_OUT),                 // bEndpointAddress
00510         E_ISOCHRONOUS,                          // bmAttributes
00511         (uint8_t)(LSB(PACKET_SIZE_ISO_IN)),                   // wMaxPacketSize
00512         (uint8_t)(MSB(PACKET_SIZE_ISO_IN)),                   // wMaxPacketSize
00513         0x01,                                   // bInterval
00514         0x00,                                   // bRefresh
00515         0x00,                                   // bSynchAddress
00516 
00517         // Endpoint - Audio Streaming
00518         STREAMING_ENDPOINT_DESCRIPTOR_LENGTH,   // bLength
00519         ENDPOINT_DESCRIPTOR_TYPE,               // bDescriptorType
00520         ENDPOINT_GENERAL,                       // bDescriptor
00521         0x00,                                   // bmAttributes
00522         0x00,                                   // bLockDelayUnits
00523         LSB(0x0000),                            // wLockDelay
00524         MSB(0x0000),                            // wLockDelay
00525 
00526 
00527 
00528 
00529 
00530 
00531 
00532         // Interface 1, Alternate Setting 0, Audio Streaming - Zero Bandwith
00533         INTERFACE_DESCRIPTOR_LENGTH,            // bLength
00534         INTERFACE_DESCRIPTOR,                   // bDescriptorType
00535         0x02,                                   // bInterfaceNumber
00536         0x00,                                   // bAlternateSetting
00537         0x00,                                   // bNumEndpoints
00538         AUDIO_CLASS,                            // bInterfaceClass
00539         SUBCLASS_AUDIOSTREAMING,                // bInterfaceSubClass
00540         0x00,                                   // bInterfaceProtocol
00541         0x00,                                   // iInterface
00542 
00543         // Interface 1, Alternate Setting 1, Audio Streaming - Operational
00544         INTERFACE_DESCRIPTOR_LENGTH,            // bLength
00545         INTERFACE_DESCRIPTOR,                   // bDescriptorType
00546         0x02,                                   // bInterfaceNumber
00547         0x01,                                   // bAlternateSetting
00548         0x01,                                   // bNumEndpoints
00549         AUDIO_CLASS,                            // bInterfaceClass
00550         SUBCLASS_AUDIOSTREAMING,                // bInterfaceSubClass
00551         0x00,                                   // bInterfaceProtocol
00552         0x00,                                   // iInterface
00553 
00554         // Audio Streaming Interface
00555         STREAMING_INTERFACE_DESCRIPTOR_LENGTH,  // bLength
00556         INTERFACE_DESCRIPTOR_TYPE,              // bDescriptorType
00557         SUBCLASS_AUDIOCONTROL,                  // bDescriptorSubtype
00558         0x05,                                   // bTerminalLink (output terminal microphone)
00559         0x01,                                   // bDelay
00560         0x01,                                   // wFormatTag
00561         0x00,                                   // wFormatTag
00562 
00563         // Audio Type I Format
00564         FORMAT_TYPE_I_DESCRIPTOR_LENGTH,        // bLength
00565         INTERFACE_DESCRIPTOR_TYPE,              // bDescriptorType
00566         SUBCLASS_AUDIOSTREAMING,                // bDescriptorSubtype
00567         FORMAT_TYPE_I,                          // bFormatType
00568         channel_nb_out,                         // bNrChannels
00569         0x02,                                   // bSubFrameSize
00570         0x10,                                   // bBitResolution
00571         0x01,                                   // bSamFreqType
00572         (uint8_t)(LSB(FREQ_OUT)),                          // tSamFreq
00573         (uint8_t)((FREQ_OUT >> 8) & 0xff),                 // tSamFreq
00574         (uint8_t)((FREQ_OUT >> 16) & 0xff),                // tSamFreq
00575 
00576         // Endpoint - Standard Descriptor
00577         ENDPOINT_DESCRIPTOR_LENGTH + 2,         // bLength
00578         ENDPOINT_DESCRIPTOR,                    // bDescriptorType
00579         PHY_TO_DESC(EPISO_IN),                  // bEndpointAddress
00580         E_ISOCHRONOUS,                          // bmAttributes
00581         (uint8_t)(LSB(PACKET_SIZE_ISO_OUT)),                   // wMaxPacketSize
00582         (uint8_t)(MSB(PACKET_SIZE_ISO_OUT)),                   // wMaxPacketSize
00583         0x01,                                   // bInterval
00584         0x00,                                   // bRefresh
00585         0x00,                                   // bSynchAddress
00586 
00587         // Endpoint - Audio Streaming
00588         STREAMING_ENDPOINT_DESCRIPTOR_LENGTH,   // bLength
00589         ENDPOINT_DESCRIPTOR_TYPE,               // bDescriptorType
00590         ENDPOINT_GENERAL,                       // bDescriptor
00591         0x00,                                   // bmAttributes
00592         0x00,                                   // bLockDelayUnits
00593         LSB(0x0000),                            // wLockDelay
00594         MSB(0x0000),                            // wLockDelay
00595 
00596         // Terminator
00597         0                                       // bLength
00598     };
00599     return configDescriptor;
00600 }
00601 
00602 uint8_t * USBAudio::stringIinterfaceDesc() {
00603     static uint8_t stringIinterfaceDescriptor[] = {
00604         0x0c,                           //bLength
00605         STRING_DESCRIPTOR,              //bDescriptorType 0x03
00606         'A',0,'u',0,'d',0,'i',0,'o',0   //bString iInterface - Audio
00607     };
00608     return stringIinterfaceDescriptor;
00609 }
00610 
00611 uint8_t * USBAudio::stringIproductDesc() {
00612     static uint8_t stringIproductDescriptor[] = {
00613         0x16,                                                       //bLength
00614         STRING_DESCRIPTOR,                                          //bDescriptorType 0x03
00615         'M',0,'b',0,'e',0,'d',0,' ',0,'A',0,'u',0,'d',0,'i',0,'o',0 //bString iProduct - Mbed Audio
00616     };
00617     return stringIproductDescriptor;
00618 }