AnsweredAssumed Answered

USB Audio In & Out

Question asked by petrinec.marek.002 on Jun 8, 2018
Latest reply on Jun 12, 2018 by waclawek.jan

Hello guys,

 

i know that here are plenty of similar posts but i did not found any solution.

 

I need to make simultaneous Audio input and Audiou output thru USB audio class 1. Could anyone please help me with it? I need to know how to extend structure of USBD_HandleTypeDef to use two devices. Iam new in USB and now i have working usb input and output but not in same time.If i understood it correctly routines (like init, deinit volumes etc..) are called in interrupt routine HAL_PCD_IRQHandler from the structure USBD_AUDIO_ItfTypeDef. But what if i have two devices? do i need to enhance this routines (init, deinit...) or extend structure?

 

Many thanks!

 

my config descriptor is:

 

    // Configuration Descriptor 1
    0x09,                             // bLength: Size of Descriptor in Bytes
    USB_DESC_TYPE_CONFIGURATION,     // bDescriptorType: Configuration Descriptor
    USB_CONFIG_DESC_SIZ & 0xFF,        // wTotalLength: length of the total configuration block,
    USB_CONFIG_DESC_SIZ >> 8,       //               including this descriptor
    0x02,//USB_DESC_INTERFACE_CNT,         // bNumInterfaces:     Audio out( Mic ) needs 2,
                                    //                    Audio In ( Speaker ) needs 2
    0x01,                             // bConfigurationValue : we only have one configuration
    0x00,                             // iConfiguration (unused)
    0xC0,                             // bmAttributes: bus powered device
    0x32,                             // 250mA maximum power consumption
    // 09 byte

 

    // Interface Descriptor: USB Speaker Standard interface descriptor
    AUDIO_INTERFACE_DESC_SIZE,        // bLength
    USB_DESC_TYPE_INTERFACE,        // bDescriptorType
    0x00,                            //bInterfaceNumber
    0x00,                            // bAlternateSetting
    0x00,                            // bNumEndpoints
    USB_DEVICE_CLASS_AUDIO,            // bInterfaceClass
    AUDIO_SUBCLASS_AUDIOCONTROL,    // bInterfaceSubClass
    AUDIO_PROTOCOL_UNDEFINED,        // bInterfaceProtocol
    0x00,                            // iInterface
    // 09 byte

 

    // Class Specific Descriptor: USB Speaker Class-specific AC Interface Descriptor
    AUDIO_INTERFACE_DESC_SIZE,        // bLength
    AUDIO_INTERFACE_DESCRIPTOR_TYPE,// bDescriptorType
    AUDIO_CONTROL_HEADER,            // bDescriptorSubtype
    0x00,                            // bcdADC
    0x01,
    0x27,                            // wTotalLength = 39
    0x00,
    0x01,                            // bInCollection
    0x01,                            // baInterfaceNr
    // 09 byte

 

    // Class Specific Descriptor (ID4): USB Speaker Input Terminal Descriptor
    AUDIO_INPUT_TERMINAL_DESC_SIZE,    // bLength
    AUDIO_INTERFACE_DESCRIPTOR_TYPE,// bDescriptorType
    AUDIO_CONTROL_INPUT_TERMINAL,    // bDescriptorSubtype
    0x01,                            // bTerminalID
    0x01,                            // wTerminalType AUDIO_TERMINAL_USB_STREAMING   0x0101
    0x01,
    0x00,                            // bAssocTerminal
    0x01,                            // bNrChannels
    0x00,                            // wChannelConfig 0x0000  Mono
    0x00,
    0x00,                            // iChannelNames
    0x00,                            // iTerminal
    // 12 byte

 

    // (ID5) USB Speaker Audio Feature Unit Descriptor
    0x09,                            // bLength
    AUDIO_INTERFACE_DESCRIPTOR_TYPE,// bDescriptorType
    AUDIO_CONTROL_FEATURE_UNIT,        // bDescriptorSubtype
    AUDIO_OUT_STREAMING_CTRL,        // bUnitID
    0x01,                            // bSourceID
    0x01,                            // bControlSize
    AUDIO_CONTROL_MUTE,                // bmaControls(0)
    0,                                // bmaControls(1)
    0x00,                            // iTerminal
    // 09 byte

 

    //USB Speaker Output Terminal Descriptor
    0x09,                            // bLength
    AUDIO_INTERFACE_DESCRIPTOR_TYPE,// bDescriptorType
    AUDIO_CONTROL_OUTPUT_TERMINAL,    // bDescriptorSubtype
    0x03,                            // bTerminalID
    0x01,                            // wTerminalType  0x0301
    0x03,
    0x00,                            // bAssocTerminal
    0x02,                            // bSourceID
    0x00,                            // iTerminal
    // 09 byte

 

    // USB Speaker Standard AS Interface Descriptor - Audio Streaming Zero Bandwith
    // Interface 1, Alternate Setting 0
    AUDIO_INTERFACE_DESC_SIZE,        // bLength
    USB_DESC_TYPE_INTERFACE,        // bDescriptorType
    0x01,                            // bInterfaceNumber
    0x00,                            // bAlternateSetting
    0x00,                            // bNumEndpoints
    USB_DEVICE_CLASS_AUDIO,            // bInterfaceClass
    AUDIO_SUBCLASS_AUDIOSTREAMING,    // bInterfaceSubClass
    AUDIO_PROTOCOL_UNDEFINED,        // bInterfaceProtocol
    0x00,                            // iInterface
    // 09 byte

 

    // USB Speaker Standard AS Interface Descriptor - Audio Streaming Operational
    // Interface 1, Alternate Setting 1
    AUDIO_INTERFACE_DESC_SIZE,        // bLength
    USB_DESC_TYPE_INTERFACE,        // bDescriptorType
    0x01,                            // bInterfaceNumber
    0x01,                            // bAlternateSetting
    0x01,                            // bNumEndpoints
    USB_DEVICE_CLASS_AUDIO,            // bInterfaceClass
    AUDIO_SUBCLASS_AUDIOSTREAMING,    // bInterfaceSubClass
    AUDIO_PROTOCOL_UNDEFINED,        // bInterfaceProtocol
    0x00,                            // iInterface
    // 09 byte

 

    // USB Speaker Audio Streaming Interface Descriptor
    AUDIO_STREAMING_INTERFACE_DESC_SIZE,// bLength
    AUDIO_INTERFACE_DESCRIPTOR_TYPE,    // bDescriptorType
    AUDIO_STREAMING_GENERAL,            // bDescriptorSubtype
    0x01,                                // bTerminalLink
    0x01,                                // bDelay
    0x01,                                // wFormatTag AUDIO_FORMAT_PCM  0x0001
    0x00,
    // 07 byte

 

    // USB Speaker Audio Type III Format Interface Descriptor
    0x0B,                                    // bLength
    AUDIO_INTERFACE_DESCRIPTOR_TYPE,        // bDescriptorType
    AUDIO_STREAMING_FORMAT_TYPE,            // bDescriptorSubtype
    AUDIO_FORMAT_TYPE_III,                    // bFormatType
    0x02,                                    // bNrChannels
    0x02,                                    // bSubFrameSize :  2 Bytes per frame (16bits)
    16,                                        // bBitResolution (16-bits per sample)
    0x01,                                    // bSamFreqType only one frequency supported
    AUDIO_SAMPLE_FREQ(USBD_AUDIO_OUT_FREQ),    // Audio sampling frequency coded on 3 bytes
    // 11 byte

 

    // Endpoint 1 - Standard Descriptor
    AUDIO_STANDARD_ENDPOINT_DESC_SIZE,        // bLength
    USB_DESC_TYPE_ENDPOINT,                    // bDescriptorType
    AUDIO_OUT_EP,                            // bEndpointAddress 1 out endpoint
    USBD_EP_TYPE_ISOC,                        // bmAttributes
    AUDIO_PACKET_SZE(USBD_AUDIO_OUT_FREQ),    // wMaxPacketSize in Bytes (Freq(Samples)*2(Stereo)*2(HalfWord))
    0x01,                                    // bInterval
    0x00,                                    // bRefresh
    0x00,                                    // bSynchAddress
    // 09 byte

 

    // Endpoint - Audio Streaming Descriptor
    AUDIO_STREAMING_ENDPOINT_DESC_SIZE,        // bLength
    AUDIO_ENDPOINT_DESCRIPTOR_TYPE,            // bDescriptorType
    AUDIO_ENDPOINT_GENERAL,                    // bDescriptor
    0x00,                                    // bmAttributes
    0x00,                                    // bLockDelayUnits
    0x00,                                    // wLockDelay
    0x00,
    // 07 byte

 

 

 

    // AC (AudioControl) interface descriptor

 

    // Microphone Standard AC interface descriptor
    0x09,                             // bLength: Size of Descriptor in Bytes
    USB_DESC_TYPE_INTERFACE,         // bDescriptorType: Interface Descriptor
    0x00,                             // bInterfaceNumber: interface 0 (index of this interface)
    0x00,                             // bAlternateSetting: index of this alternate setting
    0x00,                             // bNumEndpoints: 0 endpoints
    USB_DEVICE_CLASS_AUDIO,         // bInterfaceClass: AUDIO
    AUDIO_SUBCLASS_AUDIOCONTROL,     // bInterfaceSubclass: AUDIO_CONTROL
    0x0B,                             // bInterfaceProtocol: Mono Microphone
    0x00,                             // iInterface: unused
    // 09 byte

 

    // Microphone Class-specific AC interface descriptor
    0x09,                             // bLength
    AUDIO_INTERFACE_DESCRIPTOR_TYPE,// bDescriptorType: class-specific interface
    AUDIO_CONTROL_HEADER,             // bDescriptorSubtype: HEADER subtype
    0x00,                             // bcdADC: revision of class specification 1.00 (0x0100)
    0x01,
    0x27,                             // wTotalLength: total size of class specific descriptors (0x0027)
    0x00,
    0x01,                             // bInCollection: 1 streaming interface
    0x01,                             // baInterfaceNr(1): AudioStreaming interface 1 belongs to this AC interface
    // 09 byte

 

    // Microphone input terminal ID4 descriptor
    0x0C,                             // bLength
    AUDIO_INTERFACE_DESCRIPTOR_TYPE,// bDescriptorType: class-specific interface
    USB_AUDIO_INPUT_TERMINAL,         // bDescriptorSubtype: INPUT_TERMINAL subtype
    0x04,                             // bTerminalID: ID of this terminal TID
    USB_TERMINAL_TYPE_MIC & 0xFF,     // wTerminalType: microphone (0x0201) TT
    USB_TERMINAL_TYPE_MIC >> 8,
    0x00,                             // bAssocTerminal: no association
    0x01,                             // bNrChannels: single channel
    0x04,//TODO Was 0x00             // wChannelConfig: mono (0x0000)
    0x00,
    0x00,                             // iChannelNames: unused
    0x00,                             // iTerminal: unused
    // 12 byte

 

    // Microphone Feature Unit ID5 Descriptor
    0x0B,                            //bLength
    AUDIO_INTERFACE_DESCRIPTOR_TYPE,//bDescriptorType
    0x06,                            //bDescriptorSubtype
    0x05,                            //bUnitID UID
    0x04,                            //bSourceID SID
    0x02,                            //bControlSize
    0x01,                            //bmaControls(0)
    0x00,
    0x02,                            //bmaControls(1)
    0x00,
    0x00,                            //iFeature
    // 11 byte

 

    // Microphone Output Terminal ID6 Descriptor
    0x09,                             // bLength
    AUDIO_INTERFACE_DESCRIPTOR_TYPE,// bDescriptorType: class-specific interface
    USB_AUDIO_OUTPUT_TERMINAL,         // bDescriptorSubtype: OUTPUT_TERMINAL subtype
    0x06,//TODO 0x02                 // bTerminalID: ID of this terminal
    0x01,                             // wTerminalType: USB streaming (0x0101)
    0x01,
    0x00,                             // bAssocTerminal: unused
    0x05,                             // bSourceID: from input terminal
    0x00,                             // iTerminal: unused
    // 09 byte

 

    // AS (AudioStreaming) interface descriptor

 

    // Microphone standard AS interface descriptor (Alt. Set. 0)
    0x09,                             // bLength
    USB_DESC_TYPE_INTERFACE,         // bDescriptorType: interface
    0x01,//0x02,                             // bInterfaceNumber: interface 1 (index of this interface)
    0x00,                             // bAlternateSetting: index of this alternate setting
    0x00,                             // bNumEndpoints: 0 endpoints
    USB_IF_CLASS_AUDIO,             // bInterfaceClass: AUDIO
    USB_IF_SUBCLASS_AUDIO_STREAMING,// bInterfaceSubclass: AUDIO_STREAMING
    0x00,                             // bInterfaceProtocol: unused
    0x00,                             // iInterface: unused
    // 09 byte

 

    // Mono Microphone standard AS interface descriptor (Alt. Set. 1)
    0x09,                             // bLength
    USB_DESC_TYPE_INTERFACE,         // bDescriptorType: interface
    0x01,//0x02,                             // bInterfaceNumber: index of this interface
    0x01,                             // bAlternateSetting: index of this alternate setting
    0x01,                             // bNumEndpoints: 1 endpoint
    USB_IF_CLASS_AUDIO,             // bInterfaceClass: AUDIO
    USB_IF_SUBCLASS_AUDIO_STREAMING,// bInterfaceSubclass: AUDIO_STREAMING
    0x00,                             // bInterfaceProtocol: unused
    0x00,                             // iInterface: unused
    // 09 byte

 

    // Mono Microphone class-specific AS general interface descriptor (Alt. Set. 1)
    0x07,                             // bLength
    AUDIO_INTERFACE_DESCRIPTOR_TYPE,// bDescriptorType: class-specific interface
    0x01,                             // bDescriptorSubtype: GENERAL subtype
    0x06,//TODO 0x02,                 // bTerminalLink: uint ID of the output terminal
    0x00,//TODO 0x01,                 // bDelay: interface delay
    USB_PCM_FORMAT & 0xFF,             // wFormatTag: PCM format (0x0001)
    USB_PCM_FORMAT >> 8,
    // 07 byte

 

    // Mono Microphone Type-I format type descriptor (Alt. Set. 1)
    0x0B,//TODO 0x11,                // bLength
    AUDIO_INTERFACE_DESCRIPTOR_TYPE,// bDescriptorType: class-specific interface
    0x02,                             // bDescriptorSubtype: FORMAT_TYPE subtype
    0x01,                             // bFormatType: FORMAT_TYPE_I
    0x01,                             // bNrChannels: single channel
    0x02,                             // bSubFrameSize: two bytes per audio subframe
    0x10,                             // bBitResolution: 16 bit per sample
    0x01,                             // bSamFreqType: two frequencies supported
    USB_MIC_FS_2 & 0xFF,             // Sampling Frequency 2
    (USB_MIC_FS_2 & 0xFF00) >> 8,
    (USB_MIC_FS_2 & 0xFF0000) >> 16,
    // 11 byte

 

    // Mono Microphone standard AS Audio Data endpoint descriptor
    0x09,                             // bLength
    USB_DESC_TYPE_ENDPOINT,         // bDescriptorType: endpoint
    AUDIO_IN_EP,                     // bEndpointAddress: IN endpoint 1
    USBD_EP_TYPE_ISOC,                 // bmAttributes: isochronous, not shared
    AUDIO_PACKET_SZE(USBD_AUDIO_OUT_FREQ),//TODO 0x10,     // wMaxPacketSize: 16 bytes per packet (0x0010)
    0x01,                             // bInterval: one packet per frame
    0x00,                             // bRefresh: unused
    0x00,                             // bSynchAddress: unused
    // 09 byte

 

    // Endpoint Descriptor: Microphone class-specific isochronous audio data endpoint descriptor
    0x07,                             // bLength
    AUDIO_ENDPOINT_DESCRIPTOR_TYPE,    // bDescriptorType: class-specific endpoint
    AUDIO_ENDPOINT_GENERAL,         // bDescriptorSubtype: GENERAL subtype
    0x00,                             // bmAttributes: sampling control, no pitch control, no packet padding
    0x00,                             // bLockDelayUnits: unused
    0x00,                             // wLockDelay: unused (0x0000)
    0x00
    // 07 byte

Outcomes