USBAudio example using a microphone

Dependencies:   USBDevice mbed

Revision:
5:b49b6a8ca111
Parent:
3:e6a29c83ac52
Child:
6:be128039be16
--- a/USBDevice/USBAudio/USBAudio.cpp	Mon Dec 19 16:13:32 2011 +0000
+++ b/USBDevice/USBAudio/USBAudio.cpp	Tue Dec 20 10:44:10 2011 +0000
@@ -36,7 +36,7 @@
     channel_config = (channel_nb == 1) ? CHANNEL_M : CHANNEL_L + CHANNEL_R;
 
     SOF_handler = false;
-    readIN = false;
+    writeIN = false;
     interruptIN = false;
 
     buf_stream = NULL;
@@ -46,25 +46,26 @@
 }
 
 bool USBAudio::write(uint8_t * buf) {
-    readIN = false;
+    writeIN = false;
     SOF_handler = false;
     if (interruptIN) {
-        USBDevice::writeNB(EP3IN, buf, 16, 16);
+        USBDevice::writeNB(EP3IN, buf, PACKET_SIZE_ISO, PACKET_SIZE_ISO);
     } else {
         buf_stream = buf;
     }
     while (!SOF_handler);
     if (interruptIN) {
-        while (!readIN);
+        while (!writeIN);
     }
     buf_stream = NULL;
     return true;
 }
 
+DigitalOut p1(p18);
 // Called in ISR context on each start of frame
 void USBAudio::SOF(int frameNumber) {
     if (buf_stream != NULL) {
-        USBDevice::writeNB(EP3IN, (uint8_t *)buf_stream, 16, 16);
+        USBDevice::writeNB(EP3IN, (uint8_t *)buf_stream, PACKET_SIZE_ISO, PACKET_SIZE_ISO);
     }
     SOF_handler = true;
 }
@@ -72,7 +73,7 @@
 
 bool USBAudio::EP3_IN_callback() {
     interruptIN = true;
-    readIN = true;
+    writeIN = true;
     return true;
 }
 
@@ -98,91 +99,86 @@
     }
     if (interface == 1 && (alternate == 0 || alternate == 1)) {
         return true;
-    } else
-        printf("intf: %d, alt: %d\r\n", interface, alternate);
+    }
     return false;
 }
 
 
 
 #define TOTAL_DESCRIPTOR_LENGTH ((1 * CONFIGURATION_DESCRIPTOR_LENGTH) \
-                               + (5 * INTERFACE_DESCRIPTOR_LENGTH) \
+                               + (3 * INTERFACE_DESCRIPTOR_LENGTH) \
                                + (1 * CONTROL_INTERFACE_DESCRIPTOR_LENGTH) \
-                               + (2 * INPUT_TERMINAL_DESCRIPTOR_LENGTH) \
-                               + (2 * FEATURE_UNIT_DESCRIPTOR_LENGTH) \
-                               + (2 * OUTPUT_TERMINAL_DESCRIPTOR_LENGTH) \
-                               + (0x07) \
-                               + (2 * STREAMING_INTERFACE_DESCRIPTOR_LENGTH) \
-                               + (2 * FORMAT_TYPE_I_DESCRIPTOR_LENGTH) \
-                               + (2 * (ENDPOINT_DESCRIPTOR_LENGTH + 2)) \
-                               + (2 * STREAMING_ENDPOINT_DESCRIPTOR_LENGTH) )
+                               + (1 * INPUT_TERMINAL_DESCRIPTOR_LENGTH) \
+                               + (1 * OUTPUT_TERMINAL_DESCRIPTOR_LENGTH) \
+                               + (1 * STREAMING_INTERFACE_DESCRIPTOR_LENGTH) \
+                               + (1 * FORMAT_TYPE_I_DESCRIPTOR_LENGTH) \
+                               + (1 * (ENDPOINT_DESCRIPTOR_LENGTH + 2)) \
+                               + (1 * STREAMING_ENDPOINT_DESCRIPTOR_LENGTH) )
 
 #define TOTAL_CONTROL_INTF_LENGTH    (CONTROL_INTERFACE_DESCRIPTOR_LENGTH + \
-                                      2 * INPUT_TERMINAL_DESCRIPTOR_LENGTH     + \
-                                      2 * FEATURE_UNIT_DESCRIPTOR_LENGTH    + \
-                                      2 * OUTPUT_TERMINAL_DESCRIPTOR_LENGTH + \
-                                      0x07)
+                                      1 * INPUT_TERMINAL_DESCRIPTOR_LENGTH     + \
+                                      1 * OUTPUT_TERMINAL_DESCRIPTOR_LENGTH)
 
 uint8_t * USBAudio::configurationDesc() {
     static uint8_t configDescriptor[] = {
         // Configuration 1
-        CONFIGURATION_DESCRIPTOR_LENGTH,    // bLength
-        CONFIGURATION_DESCRIPTOR,           // bDescriptorType
-        0x64,   // wTotalLength (LSB)
-        0x00,   // wTotalLength (MSB)
-        0x02,   // bNumInterfaces
-        DEFAULT_CONFIGURATION,  // bConfigurationValue
-        0x00,   // iConfiguration
-        0x80,   // bmAttributes
-        50,     // bMaxPower
+        CONFIGURATION_DESCRIPTOR_LENGTH,        // bLength
+        CONFIGURATION_DESCRIPTOR,               // bDescriptorType
+        LSB(TOTAL_DESCRIPTOR_LENGTH),           // wTotalLength (LSB)
+        MSB(TOTAL_DESCRIPTOR_LENGTH),           // wTotalLength (MSB)
+        0x02,                                   // bNumInterfaces
+        DEFAULT_CONFIGURATION,                  // bConfigurationValue
+        0x00,                                   // iConfiguration
+        0x80,                                   // bmAttributes
+        50,                                     // bMaxPower
 
         // Interface 0, Alternate Setting 0, Audio Control
-        INTERFACE_DESCRIPTOR_LENGTH,    // bLength
-        INTERFACE_DESCRIPTOR,           // bDescriptorType
-        0x00,   // bInterfaceNumber
-        0x00,   // bAlternateSetting
-        0x00,   // bNumEndpoints
-        0x01,   // bInterfaceClass
-        0x01,   // bInterfaceSubClass
-        0x00,   // bInterfaceProtocol
-        0x00,   // iInterface
+        INTERFACE_DESCRIPTOR_LENGTH,            // bLength
+        INTERFACE_DESCRIPTOR,                   // bDescriptorType
+        0x00,                                   // bInterfaceNumber
+        0x00,                                   // bAlternateSetting
+        0x00,                                   // bNumEndpoints
+        AUDIO_CLASS,                            // bInterfaceClass
+        SUBCLASS_AUDIOCONTROL,                  // bInterfaceSubClass
+        0x00,                                   // bInterfaceProtocol
+        0x00,                                   // iInterface
 
 
         // Audio Control Interface
-        0x09,   // bLength
-        0x24,   // bDescriptorType
-        0x01,   // bDescriptorSubtype
-        LSB(0x0100),    // bcdADC (LSB)
-        MSB(0x0100),    // bcdADC (MSB)
-        0x1e,   // wTotalLength
-        0x00,   // wTotalLength
-        0x01,   // bInCollection
-        0x01,   // baInterfaceNr
+        CONTROL_INTERFACE_DESCRIPTOR_LENGTH,    // bLength
+        INTERFACE_DESCRIPTOR_TYPE,              // bDescriptorType
+        CONTROL_HEADER,                         // bDescriptorSubtype
+        LSB(0x0100),                            // bcdADC (LSB)
+        MSB(0x0100),                            // bcdADC (MSB)
+        LSB(TOTAL_CONTROL_INTF_LENGTH),         // wTotalLength
+        MSB(TOTAL_CONTROL_INTF_LENGTH),         // wTotalLength
+        0x01,                                   // bInCollection
+        0x01,                                   // baInterfaceNr
 
-        // Audio Input Terminal (Speaker)
-        0x0c,   // bLength
-        0x24,   // bDescriptorType
-        0x02,   // bDescriptorSubtype
-        0x01,   // bTerminalID
-        0x01,   // wTerminalType
-        0x02,   // wTerminalType
-        0x00,   // bAssocTerminal
-        0x01,   // bNrChannels
-        0x00,   // wChannelConfig
-        0x00,   // wChannelConfig
-        0x00,   // iChannelNames
-        0x00,   // iTerminal
+        // Audio Input Terminal (Microphone)
+        INPUT_TERMINAL_DESCRIPTOR_LENGTH,       // bLength
+        INTERFACE_DESCRIPTOR_TYPE,              // bDescriptorType
+        CONTROL_INPUT_TERMINAL,                 // bDescriptorSubtype
+        0x01,                                   // bTerminalID
+        LSB(TERMINAL_MICROPHONE),               // wTerminalType
+        MSB(TERMINAL_MICROPHONE),               // wTerminalType
+        0x00,                                   // bAssocTerminal
+        channel_nb,                             // bNrChannels
+        LSB(channel_config),                    // wChannelConfig
+        MSB(channel_config),                    // wChannelConfig
+        0x00,                                   // iChannelNames
+        0x00,                                   // iTerminal
 
         // Audio Output Terminal (Speaker)
-        0x09,   // bLength
-        0x24,   // bDescriptorType
-        0x03,   // bDescriptorSubtype
-        0x02,   // bTerminalID
-        0x01,   // wTerminalType
-        0x01,   // wTerminalType
-        0x00,   // bAssocTerminal
-        0x01,   // bSourceID
-        0x00,   // iTerminal
+        OUTPUT_TERMINAL_DESCRIPTOR_LENGTH,      // bLength
+        INTERFACE_DESCRIPTOR_TYPE,              // bDescriptorType
+        CONTROL_OUTPUT_TERMINAL,                // bDescriptorSubtype
+        0x02,                                   // bTerminalID
+        LSB(TERMINAL_USB_STREAMING),            // wTerminalType
+        MSB(TERMINAL_USB_STREAMING),            // wTerminalType
+        0x00,                                   // bAssocTerminal
+        0x01,                                   // bSourceID
+        0x00,                                   // iTerminal
 
 
 
@@ -192,76 +188,73 @@
 
 
         // Interface 1, Alternate Setting 0, Audio Streaming - Zero Bandwith
-        0x09,   // bLength
-        0x04,   // bDescriptorType
-        0x01,   // bInterfaceNumber
-        0x00,   // bAlternateSetting
-        0x00,   // bNumEndpoints
-        0x01,   // bInterfaceClass
-        0x02,   // bInterfaceSubClass
-        0x00,   // bInterfaceProtocol
-        0x00,   // iInterface
+        INTERFACE_DESCRIPTOR_LENGTH,            // bLength
+        INTERFACE_DESCRIPTOR,                   // bDescriptorType
+        0x01,                                   // bInterfaceNumber
+        0x00,                                   // bAlternateSetting
+        0x00,                                   // bNumEndpoints
+        AUDIO_CLASS,                            // bInterfaceClass
+        SUBCLASS_AUDIOSTREAMING,                // bInterfaceSubClass
+        0x00,                                   // bInterfaceProtocol
+        0x00,                                   // iInterface
 
         // Interface 1, Alternate Setting 1, Audio Streaming - Operational
-        0x09,   // bLength
-        0x04,   // bDescriptorType
-        0x01,   // bInterfaceNumber
-        0x01,   // bAlternateSetting
-        0x01,   // bNumEndpoints
-        0x01,   // bInterfaceClass
-        0x02,   // bInterfaceSubClass
-        0x00,   // bInterfaceProtocol
-        0x00,   // iInterface
+        INTERFACE_DESCRIPTOR_LENGTH,            // bLength
+        INTERFACE_DESCRIPTOR,                   // bDescriptorType
+        0x01,                                   // bInterfaceNumber
+        0x01,                                   // bAlternateSetting
+        0x01,                                   // bNumEndpoints
+        AUDIO_CLASS,                            // bInterfaceClass
+        SUBCLASS_AUDIOSTREAMING,                // bInterfaceSubClass
+        0x00,                                   // bInterfaceProtocol
+        0x00,                                   // iInterface
 
         // Audio Streaming Interface
-        0x07,   // bLength
-        0x24,   // bDescriptorType
-        0x01,   // bDescriptorSubtype
-        0x02,   // bTerminalLink
-        0x01,   // bDelay
-        0x01,   // wFormatTag
-        0x00,   // wFormatTag
+        STREAMING_INTERFACE_DESCRIPTOR_LENGTH,  // bLength
+        INTERFACE_DESCRIPTOR_TYPE,              // bDescriptorType
+        SUBCLASS_AUDIOCONTROL,                  // bDescriptorSubtype
+        0x02,                                   // bTerminalLink (output terminal microphone)
+        0x01,                                   // bDelay
+        0x01,                                   // wFormatTag
+        0x00,                                   // wFormatTag
 
         // Audio Type I Format
-        0x0B,   // bLength
-        0x24,   // bDescriptorType
-        0x02,   // bDescriptorSubtype
-        0x01,   // bFormatType
-        0x01,   // bNrChannels
-        0x02,   // bSubFrameSize
-        0x10,   // bBitResolution
-        0x01,   // bSamFreqType
-        0x40,   // tSamFreq
-        0x1F,   // tSamFreq
-        0x00,   // tSamFreq
+        FORMAT_TYPE_I_DESCRIPTOR_LENGTH,        // bLength
+        INTERFACE_DESCRIPTOR_TYPE,              // bDescriptorType
+        SUBCLASS_AUDIOSTREAMING,                // bDescriptorSubtype
+        FORMAT_TYPE_I,                          // bFormatType
+        channel_nb,                             // bNrChannels
+        0x02,                                   // bSubFrameSize
+        0x10,                                   // bBitResolution
+        0x01,                                   // bSamFreqType
+        LSB(FREQ),                              // tSamFreq
+        (FREQ >> 8) & 0xff,                     // tSamFreq
+        (FREQ >> 16) & 0xff,                    // tSamFreq
 
         // Endpoint - Standard Descriptor
-        0x09,   // bLength
-        0x05,   // bDescriptorType
-        PHY_TO_DESC(EPISO_IN),  // bEndpointAddress
-        E_ISOCHRONOUS,          // bmAttributes
-        LSB(PACKET_SIZE_ISO),   // wMaxPacketSize
-        MSB(PACKET_SIZE_ISO),   // wMaxPacketSize
-        0x01,   // bInterval
-        0x00,   // bRefresh
-        0x00,   // bSynchAddress
+        ENDPOINT_DESCRIPTOR_LENGTH + 2,         // bLength
+        ENDPOINT_DESCRIPTOR,                    // bDescriptorType
+        PHY_TO_DESC(EPISO_IN),                  // bEndpointAddress
+        E_ISOCHRONOUS,                          // bmAttributes
+        LSB(PACKET_SIZE_ISO),                   // wMaxPacketSize
+        MSB(PACKET_SIZE_ISO),                   // wMaxPacketSize
+        0x01,                                   // bInterval
+        0x00,                                   // bRefresh
+        0x00,                                   // bSynchAddress
 
         // Endpoint - Audio Streaming
-        0x07,   // bLength
-        0x25,   // bDescriptorType
-        0x01,   // bDescriptor
-        0x00,   // bmAttributes
-        0x00,   // bLockDelayUnits
-        LSB(0x0000),    // wLockDelay
-        MSB(0x0000),    // wLockDelay
-
-
+        STREAMING_ENDPOINT_DESCRIPTOR_LENGTH,   // bLength
+        ENDPOINT_DESCRIPTOR_TYPE,               // bDescriptorType
+        ENDPOINT_GENERAL,                       // bDescriptor
+        0x00,                                   // bmAttributes
+        0x00,                                   // bLockDelayUnits
+        LSB(0x0000),                            // wLockDelay
+        MSB(0x0000),                            // wLockDelay
 
 
         // Terminator
         0
     };
-    //printf("size config: %d\r\n", sizeof(configDescriptor));
     return configDescriptor;
 }