This page describes how to add recorder function into the USB Audio Speaker Device, so that you can learn how to extend your audio device driver from current Audio Speaker demo.
To add audio record function, new Input Terminal, Output Termnial and Feature Unit is added.
USB Desktop Speaker Hierarchy
New descriptor for the terminals and unit should be added, and according interface, too.
USB Desktop Speaker Descriptors
Offset | Field | Size | Value | Description |
0 | bLength | 1 | 0x0C | Size of this descriptor, in bytes. |
1 | bDescriptorType | 1 | 0x24 | CS_INTERFACE descriptor (AUDGenericDescriptor_INTERFACE). |
2 | bDescriptorSubType | 1 | 0x03 | INPUT_TERMINAL subtype (AUDGenericDescriptor_INPUTTERMINAL). |
3 | bTerminalID | 1 | 0x03 | ID of this Input Terminal (AUDDSpeakerDriverDescriptors_INPUTTERMINAL_REC). |
4 | wTerminalType | 2 | 0x0403 | Terminal is Speaker Phone (AUDInputTerminalDescriptor_SPEAKERPHONE). |
6 | bAssocTerminal | 1 | 0x04 | Associated to Output Terminal (AUDDSpeakerDriverDescriptors_OUTPUTTERMINAL_REC). |
7 | bNrChannels | 1 | 0x02 | Two channel. |
8 | wChannelConfig | 2 | 0x0003 | Left plus right front channel. |
10 | iChannelNames | 1 | 0x00 | Unused. |
11 | iTerminal | 1 | 0x00 | Unused. |
Offset | Field | Size | Value | Description |
0 | bLength | 1 | 0x09 | Size of this descriptor, in bytes. |
1 | bDescriptorType | 1 | 0x24 | CS_INTERFACE descriptor (AUDGenericDescriptor_INTERFACE). |
2 | bDescriptorSubType | 1 | 0x04 | OUTPUT_TERMINAL subtype (AUDGenericDescriptor_OUTPUTTERMINAL). |
3 | bTerminalID | 1 | 0x04 | ID of this Output Terminal (AUDDSpeakerDriverDescriptors_OUTPUTTERMINAL_REC). |
4 | wTerminalType | 2 | 0x0301 | Terminal is USB stream (AUDOutputTerminalDescriptor_USBTREAMING). |
6 | bAssocTerminal | 1 | 0x03 | Associated to Input Terminal (AUDDSpeakerDriverDescriptors_INPUTTERMINAL_REC). |
7 | bSourceID | 1 | 0x05 | From Feature Unit (AUDDSpeakerDriverDescriptors_FEATUREUNIT_REC). |
8 | iTerminal | 1 | 0x00 | Unused. |
Offset | Field | Size | Value | Description |
0 | bLength | 1 | 0x0A | Size of this descriptor, in bytes. |
1 | bDescriptorType | 1 | 0x24 | CS_INTERFACE descriptor (AUDGenericDescriptor_INTERFACE). |
2 | bDescriptorSubType | 1 | 0x02 | FEATURE_UNIT subtype (AUDGenericDescriptor_FEATUREUNIT). |
3 | bUnitID | 1 | 0x05 | ID of this Feature Unit (AUDDSpeakerDriverDescriptors_FEATUREUNIT_REC). |
4 | bSourceID | 1 | 0x03 | From Input Terminal (AUDDSpeakerDriverDescriptors_INPUTTERMINAL_REC). |
5 | bControlSize | 1 | 0x01 | 1 byte per channel for controls |
6 | bmaControls | 3 | 0x000001 | Master channel mute control, no other controls. |
9 | iFeature | 1 | 0x00 | Unused. |
Standard AS Interface Descriptor (USBInterfaceDescriptor)
Offset | Field | Size | Value | Description |
0 | bLength | 1 | 0x09 | Size of this descriptor, in bytes. |
1 | bDescriptorType | 1 | 0x04 | INTERFACE descriptor (USBGenericDescriptor_INTERFACE). |
2 | bInterfaceNumber | 1 | 0x02 | Index of this interface. |
3 | bAlternateSetting | 1 | 0x00 | Index of this setting. |
4 | bNumEndpoints | 1 | 0x00 | 0 endpoint. |
5 | bInterfaceClass | 1 | 0x01 | AUDIO (AUDStreamingInterfaceDescriptor_CLASS). |
6 | bInterfaceSubClass | 1 | 0x02 | AUDIO_STREAMING (AUDStreamingInterfaceDescriptor_SUBCLASS). |
7 | bInterfaceProtocol | 1 | 0x00 | Unused (AUDStreamingInterfaceDescriptor_PROTOCOL). |
8 | iInterface | 1 | 0x00 | Unused. |
Standard AS Interface Descriptor (USBInterfaceDescriptor)
Offset | Field | Size | Value | Description |
0 | bLength | 1 | 0x09 | Size of USBInterfaceDescriptor in bytes. |
1 | bDescriptorType | 1 | 0x04 | INTERFACE descriptor (USBGenericDescriptor_INTERFACE). |
2 | bInterfaceNumber | 1 | 0x02 | Index of this interface. |
3 | bAlternateSetting | 1 | 0x01 | Index of this setting. |
4 | bNumEndpoints | 1 | 0x01 | 1 endpoint. |
5 | bInterfaceClass | 1 | 0x01 | AUDIO (AUDStreamingInterfaceDescriptor_CLASS). |
6 | bInterfaceSubClass | 1 | 0x02 | AUDIO_STREAMING (AUDStreamingInterfaceDescriptor_SUBCLASS). |
7 | bInterfaceProtocol | 1 | 0x00 | Unused (AUDStreamingInterfaceDescriptor_PROTOCOL). |
8 | iInterface | 1 | 0x00 | Unused. |
Class-specific AS General Interface Descriptor (AUDStreamingInterfaceDescriptor)
Offset | Field | Size | Value | Description |
0 | bLength | 1 | 0x06 | Size of AUDStreamingInterfaceDescriptor in bytes. |
1 | bDescriptorType | 1 | 0x24 | CS_INTERFACE descriptor (AUDGenericDescriptor_INTERFACE). |
2 | bDescriptorSubType | 1 | 0x01 | GENERAL subtype (AUDStreamingInterfaceDescriptor_GENERAL). |
3 | bTerminalLink | 1 | 0x02 | Unit ID of the Input Terminal (AUDDSpeakerDriverDescriptors_INPUTTERMINAL). |
4 | bDelay | 1 | 0x00 | No interface delay. |
5 | wFormatTag | 2 | 0x0001 | PCM Format (AUDFormatTypeOneDescriptor_PCM). |
Type I Format Type Descriptor (AUDFormatTypeOneDescriptor1)
Offset | Field | Size | Value | Description |
0 | bLength | 1 | 0x0B | Size of AUDFormatTypeOneDescriptor1 in bytes. |
1 | bDescriptorType | 1 | 0x24 | CS_INTERFACE descriptor (AUDGenericDescriptor_INTERFACE). |
2 | bDescriptorSubType | 1 | 0x02 | FORMAT_TYPE subtype (AUDStreamingInterfaceDescriptor_FORMATTYPE). |
3 | bFormatType | 1 | 0x01 | FORMAT_TYPE_I (AUDFormatTypeOneDescriptor_FORMATTYPEONE). |
4 | bNrChannels | 1 | 0x02 | 2 channels (AUDDSpeakerDriver_NUMCHANNELS). |
5 | bSubFrameSize | 1 | 0x02 | Two bytes per audio subframe (AUDDSpeakerDriver_BYTESPERSAMPLE). |
6 | bBitResolution | 1 | 0x10 | 16 bits per sample (AUDDSpeakerDriver_BYTESPERSAMPLE * 2). |
7 | bSamFreqType | 1 | 0x01 | One frequency supported. |
8 | tSamFreq | 3 | 4800 | 4800Hz (AUDDSpeakerDriver_SAMPLERATE). |
Standard Endpoint Descriptor (AUDEndpointDescriptor)
Offset | Field | Size | Value | Description |
0 | bLength | 1 | 0x09 | Size of AUDFormatTypeOneDescriptor1 in bytes. |
1 | bDescriptorType | 1 | 0x24 | ENDPOINT descriptor (USBGenericDescriptor_ENDPOINT). |
2 | bEndpointAddress | 1 | 0x85 | IN endpoint 5 USBEndpointDescriptor_ADDRESS() AUDDSpeakerDriverDescriptors_DATAIN |
3 | bmAttributes | 1 | 0x01 | Isochronous, not shared (USBEndpointDescriptor_ISOCHRONOUS). |
4 | wMaxPacketSize | 2 | 0x???? | CHIP_USB_ENDPOINTS_MAXPACKETSIZE(5). |
6 | bInterval | 1 | 0x01 | One packet per frame. |
7 | bRefresh | 1 | 0x00 | Unused. |
8 | bSynchAddress | 1 | 0x00 | Unused. |
Class-specific Isochronous Audio Data Endpoint Descriptor (AUDDataEndpointDescriptor)
Offset | Field | Size | Value | Description |
0 | bLength | 1 | 0x07 | Size of AUDDataEndpointDescriptor in bytes. |
1 | bDescriptorType | 1 | 0x25 | CS_ENDPOINT descriptor (AUDGenericDescriptor_ENDPOINT). |
2 | bDescriptorSubType | 1 | 0x01 | GENERAL subtype (AUDDataEndpointDescriptor_SUBTYPE). |
3 | bmAttributes | 1 | 0x00 | No sampling frequency control no pitch control no packet padding |
4 | bLockDelayUnits | 1 | 0x00 | Unused. |
5 | wLockDelay | 2 | 0x0000 | Unused. |
Several methods modified for new recorder function.
Add handler for new Interface, Terminal and Unit IDs. See AUDDSpeakerDriver_RequestHandler().
See AUDDSpeakerDriver_Write().