1// Copyright 2016 The Fuchsia Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#pragma once
6
7// clang-format off
8
9#include <zircon/compiler.h>
10#include <zircon/types.h>
11
12__BEGIN_CDECLS;
13
14////////////////////////////////////////////////////
15//
16// General Audio interface constants
17//
18////////////////////////////////////////////////////
19
20// audio interface subclasses
21#define USB_SUBCLASS_AUDIO_CONTROL              0x01
22#define USB_SUBCLASS_AUDIO_STREAMING            0x02
23#define USB_SUBCLASS_MIDI_STREAMING             0x03
24
25// audio class specific descriptor types
26#define USB_AUDIO_CS_DEVICE                     0x21
27#define USB_AUDIO_CS_CONFIGURATION              0x22
28#define USB_AUDIO_CS_STRING                     0x23
29#define USB_AUDIO_CS_INTERFACE                  0x24
30#define USB_AUDIO_CS_ENDPOINT                   0x25
31
32////////////////////////////////////////////////////
33//
34// Audio Control interface constants
35//
36////////////////////////////////////////////////////
37
38// audio class specific AC interface descriptor subtypes
39#define USB_AUDIO_AC_HEADER                     0x01
40#define USB_AUDIO_AC_INPUT_TERMINAL             0x02
41#define USB_AUDIO_AC_OUTPUT_TERMINAL            0x03
42#define USB_AUDIO_AC_MIXER_UNIT                 0x04
43#define USB_AUDIO_AC_SELECTOR_UNIT              0x05
44#define USB_AUDIO_AC_FEATURE_UNIT               0x06
45#define USB_AUDIO_AC_PROCESSING_UNIT            0x07
46#define USB_AUDIO_AC_EXTENSION_UNIT             0x08
47
48// processing unit process types
49#define USB_AUDIO_UP_DOWN_MIX_PROCESS           0x01
50#define USB_AUDIO_DOLBY_PROLOGIC_PROCESS        0x02
51#define USB_AUDIO_3D_STEREO_EXTENDER_PROCESS    0x03
52#define USB_AUDIO_REVERBERATION_PROCESS         0x04
53#define USB_AUDIO_CHORUS_PROCESS                0x05
54#define USB_AUDIO_DYN_RANGE_COMP_PROCESS        0x06
55
56// audio class specific endpoint descriptor subtypes
57#define USB_AUDIO_EP_GENERAL                    0x01
58
59// audio class specific request codes
60#define USB_AUDIO_SET_CUR                       0x01
61#define USB_AUDIO_GET_CUR                       0x81
62#define USB_AUDIO_SET_MIN                       0x02
63#define USB_AUDIO_GET_MIN                       0x82
64#define USB_AUDIO_SET_MAX                       0x03
65#define USB_AUDIO_GET_MAX                       0x83
66#define USB_AUDIO_SET_RES                       0x04
67#define USB_AUDIO_GET_RES                       0x84
68#define USB_AUDIO_SET_MEM                       0x05
69#define USB_AUDIO_GET_MEM                       0x85
70#define USB_AUDIO_GET_STAT                      0xFF
71
72// terminal control selectors
73#define USB_AUDIO_COPY_PROTECT_CONTROL          0x01
74
75// feature unit control selectors
76#define USB_AUDIO_MUTE_CONTROL                  0x01
77#define USB_AUDIO_VOLUME_CONTROL                0x02
78#define USB_AUDIO_BASS_CONTROL                  0x03
79#define USB_AUDIO_MID_CONTROL                   0x04
80#define USB_AUDIO_TREBLE_CONTROL                0x05
81#define USB_AUDIO_GRAPHIC_EQUALIZER_CONTROL     0x06
82#define USB_AUDIO_AUTOMATIC_GAIN_CONTROL        0x07
83#define USB_AUDIO_DELAY_CONTROL                 0x08
84#define USB_AUDIO_BASS_BOOST_CONTROL            0x09
85#define USB_AUDIO_LOUDNESS_CONTROL              0x0A
86
87// feature unit control support bitmasks
88#define USB_AUDIO_FU_BMA_MUTE                   (1u << 0u)
89#define USB_AUDIO_FU_BMA_VOLUME                 (1u << 1u)
90#define USB_AUDIO_FU_BMA_BASS                   (1u << 2u)
91#define USB_AUDIO_FU_BMA_MID                    (1u << 3u)
92#define USB_AUDIO_FU_BMA_TREBLE                 (1u << 4u)
93#define USB_AUDIO_FU_BMA_GRAPHIC_EQUALIZER      (1u << 5u)
94#define USB_AUDIO_FU_BMA_AUTOMATIC_GAIN         (1u << 6u)
95#define USB_AUDIO_FU_BMA_DELAY                  (1u << 7u)
96#define USB_AUDIO_FU_BMA_BASS_BOOST             (1u << 8u)
97#define USB_AUDIO_FU_BMA_LOUDNESS               (1u << 9u)
98
99// up/down mix processing unit control selectors
100#define USB_AUDIO_UD_ENABLE_CONTROL             0x01
101#define USB_AUDIO_UD_MODE_SELECT_CONTROL        0x02
102#define USB_AUDIO_UD_MODE_SELECT_CONTROL        0x02
103
104// Dolby Prologic processing unit control selectors
105#define USB_AUDIO_DP_ENABLE_CONTROL             0x01
106#define USB_AUDIO_DP_MODE_SELECT_CONTROL        0x02
107
108// 3D stereo extender processing unit control selectors
109#define USB_AUDIO_3D_ENABLE_CONTROL             0x01
110#define USB_AUDIO_SPACIOUSNESS_CONTROL          0x03
111
112// reverberation processing unit control selectors
113#define USB_AUDIO_RV_ENABLE_CONTROL             0x01
114#define USB_AUDIO_REVERB_LEVEL_CONTROL          0x02
115#define USB_AUDIO_REVERB_TIME_CONTROL           0x03
116#define USB_AUDIO_REVERB_FEEDBACK_CONTROL       0x04
117
118// chorus processing unit control selectors
119#define USB_AUDIO_CH_ENABLE_CONTROL             0x01
120#define USB_AUDIO_CHORUS_LEVEL_CONTROL          0x02
121#define USB_AUDIO_CHORUS_RATE_CONTROL           0x03
122#define USB_AUDIO_CHORUS_DEPTH_CONTROL          0x04
123
124// dynamic range compressor processing unit control selectors
125#define USB_AUDIO_DR_ENABLE_CONTROL             0x01
126#define USB_AUDIO_COMPRESSION_RATE_CONTROL      0x02
127#define USB_AUDIO_MAXAMPL_CONTROL               0x03
128#define USB_AUDIO_THRESHOLD_CONTROL             0x04
129#define USB_AUDIO_ATTACK_TIME                   0x05
130#define USB_AUDIO_RELEASE_TIME                  0x06
131
132// extension unit control selectors
133#define USB_AUDIO_XU_ENABLE_CONTROL             0x01
134
135// endpoint control selectors
136#define USB_AUDIO_SAMPLING_FREQ_CONTROL         0x01
137#define USB_AUDIO_PITCH_CONTROL                 0x02
138
139// USB audio terminal types
140#define USB_AUDIO_TERMINAL_USB_UNDEFINED                0x0100
141#define USB_AUDIO_TERMINAL_USB_STREAMING                0x0101
142#define USB_AUDIO_TERMINAL_USB_VENDOR                   0x01FF
143#define USB_AUDIO_TERMINAL_INPUT_UNDEFINED              0x0200
144#define USB_AUDIO_TERMINAL_MICROPHONE                   0x0201
145#define USB_AUDIO_TERMINAL_DESKTOP_MICROPHONE           0x0202
146#define USB_AUDIO_TERMINAL_PERSONAL_MICROPHONE          0x0203
147#define USB_AUDIO_TERMINAL_OMNI_DIRECTIONAL_MICROPHONE  0x0204
148#define USB_AUDIO_TERMINAL_MICROPHONE_ARRAY             0x0205
149#define USB_AUDIO_TERMINAL_PROCESSING_MICROPHONE_ARRAY  0x0206
150#define USB_AUDIO_TERMINAL_OUTPUT_UNDEFINED             0x0300
151#define USB_AUDIO_TERMINAL_SPEAKER                      0x0301
152#define USB_AUDIO_TERMINAL_HEADPHONES                   0x0302
153#define USB_AUDIO_TERMINAL_HEAD_MOUNTED_DISPLAY_AUDIO   0x0303
154#define USB_AUDIO_TERMINAL_DESKTOP_SPEAKER              0x0304
155#define USB_AUDIO_TERMINAL_ROOM_SPEAKER                 0x0305
156#define USB_AUDIO_TERMINAL_COMMUNICATION_SPEAKER        0x0306
157#define USB_AUDIO_TERMINAL_LOW_FREQ_EFFECTS_SPEAKER     0x0307
158#define USB_AUDIO_TERMINAL_BIDIRECTIONAL_UNDEFINED      0x0400
159#define USB_AUDIO_TERMINAL_HANDSET                      0x0401
160#define USB_AUDIO_TERMINAL_HEADSET                      0x0402
161#define USB_AUDIO_TERMINAL_SPEAKERPHONE                 0x0403
162#define USB_AUDIO_TERMINAL_ECHO_SUPPRESSING_SPEAKERPHONE 0x0404
163#define USB_AUDIO_TERMINAL_ECHO_CANCELING_SPEAKERPHONE  0x0405
164#define USB_AUDIO_TERMINAL_TELEPHONY_UNDEFINED          0x0500
165#define USB_AUDIO_TERMINAL_PHONE_LINE                   0x0501
166#define USB_AUDIO_TERMINAL_TELEPHONE                    0x0502
167#define USB_AUDIO_TERMINAL_DOWN_LINE_PHONE              0x0503
168#define USB_AUDIO_TERMINAL_EXTERNAL_UNDEFINED           0x0600
169#define USB_AUDIO_TERMINAL_ANALOG_CONNECTOR             0x0601
170#define USB_AUDIO_TERMINAL_DIGITAL_AUDIO_INTERFACE      0x0602
171#define USB_AUDIO_TERMINAL_LINE_CONNECTOR               0x0603
172#define USB_AUDIO_TERMINAL_LEGACY_AUDIO_CONNECTOR       0x0604
173#define USB_AUDIO_TERMINAL_SPDIF_INTERFACE              0x0605
174#define USB_AUDIO_TERMINAL_1394_DA_STREAM               0x0606
175#define USB_AUDIO_TERMINAL_1394_DV_STREAM_SOUNDTRACK    0x0607
176#define USB_AUDIO_TERMINAL_EMBEDDED_UNDEFINED           0x0700
177#define USB_AUDIO_TERMINAL_LEVEL_CALIBRATION_NOISE_SOURCE 0x0701
178#define USB_AUDIO_TERMINAL_EQUALIZATION_NOISE           0x0702
179#define USB_AUDIO_TERMINAL_CD_PLAYER                    0x0703
180#define USB_AUDIO_TERMINAL_DAT                          0x0704
181#define USB_AUDIO_TERMINAL_DCC                          0x0705
182#define USB_AUDIO_TERMINAL_MINI_DISK                    0x0706
183#define USB_AUDIO_TERMINAL_ANALOG_TAPE                  0x0707
184#define USB_AUDIO_TERMINAL_PHONOGRAPH                   0x0708
185#define USB_AUDIO_TERMINAL_VCR_AUDIO                    0x0709
186#define USB_AUDIO_TERMINAL_VIDEO_DISK_AUDIO             0x070A
187#define USB_AUDIO_TERMINAL_DVD_AUDIO                    0x070B
188#define USB_AUDIO_TERMINAL_TV_TUNER_AUDIO               0x070C
189#define USB_AUDIO_TERMINAL_SATELLITE_RECEIVER_AUDIO     0x070D
190#define USB_AUDIO_TERMINAL_CABLE_TUNER_AUDIO            0x070E
191#define USB_AUDIO_TERMINAL_DSS_AUDIO                    0x070F
192#define USB_AUDIO_TERMINAL_RADIO_RECEIVER               0x0710
193#define USB_AUDIO_TERMINAL_RADIO_TRANSMITTER            0x0711
194#define USB_AUDIO_TERMINAL_MULTI_TRACK_RECORDER         0x0712
195#define USB_AUDIO_TERMINAL_SYNTHESIZER                  0x0713
196
197////////////////////////////////////////////////////
198//
199// Audio streaming interface constants
200//
201////////////////////////////////////////////////////
202
203// Audio stream class-specific AS interface descriptor subtypes
204#define USB_AUDIO_AS_GENERAL                    0x01
205#define USB_AUDIO_AS_FORMAT_TYPE                0x02
206#define USB_AUDIO_AS_FORMAT_SPECIFIC            0x03
207
208// wFormatTag values present in the class specific AS header
209// Defined in Section A.1 of USB Device Class Definition for Audio Data Formats
210#define USB_AUDIO_AS_FT_TYPE_I_UNDEFINED        0x0000
211#define USB_AUDIO_AS_FT_PCM                     0x0001
212#define USB_AUDIO_AS_FT_PCM8                    0x0002
213#define USB_AUDIO_AS_FT_IEEE_FLOAT              0x0003
214#define USB_AUDIO_AS_FT_ALAW                    0x0004
215#define USB_AUDIO_AS_FT_MULAW                   0x0005
216#define USB_AUDIO_AS_FT_TYPE_II_UNDEFINED       0x1000
217#define USB_AUDIO_AS_FT_MPEG                    0x1001
218#define USB_AUDIO_AS_FT_AC3                     0x1002
219#define USB_AUDIO_AS_FT_TYPE_III_UNDEFINED      0x2000
220#define USB_AUDIO_AS_FT_IEC1937_AC3             0x2001
221#define USB_AUDIO_AS_FT_IEC1937_MPEG1_L1        0x2002
222#define USB_AUDIO_AS_FT_IEC1937_MPEG1_L23       0x2003
223#define USB_AUDIO_AS_FT_IEC1937_MPEG2_EXT       0x2004
224#define USB_AUDIO_AS_FT_IEC1937_MPEG2_L1_LS     0x2005
225#define USB_AUDIO_AS_FT_IEC1937_MPEG2_L23_LS    0x2006
226
227// Audio stream class-specific format-specific types
228#define USB_AUDIO_FORMAT_TYPE_UNDEFINED         0x00
229#define USB_AUDIO_FORMAT_TYPE_I                 0x01
230#define USB_AUDIO_FORMAT_TYPE_II                0x02
231#define USB_AUDIO_FORMAT_TYPE_III               0x03
232
233////////////////////////////////////////////////////
234//
235// MIDI streaming interface constants
236//
237////////////////////////////////////////////////////
238
239// MIDI class specific MS interface descriptor subtypes
240#define USB_MIDI_MS_HEADER                      0x01
241#define USB_MIDI_IN_JACK                        0x02
242#define USB_MIDI_OUT_JACK                       0x03
243#define USB_MIDI_ELEMENT                        0x04
244
245// MIDI class specific MS endpoint descriptor subtypes
246#define USB_MIDI_MS_GENERAL                     0x01
247
248// MIDI IN and OUT jack types
249#define USB_MIDI_JACK_EMBEDDED                  0x01
250#define USB_MIDI_JACK_INTERNAL                  0x02
251
252// MIDI endpoint control selectors
253#define USB_MIDI_ASSOCIATION_CONTROL            0x01
254
255
256// Top level header structure shared by all USB audio descriptors.
257//
258typedef struct {
259    uint8_t bLength;
260    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
261    uint8_t bDescriptorSubtype;
262} __PACKED usb_audio_desc_header;
263
264// Audio Control Interface descriptor definitions
265//
266typedef struct {
267    uint8_t bLength;
268    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
269    uint8_t bDescriptorSubtype;     // USB_AUDIO_AC_HEADER
270    uint16_t bcdADC;
271    uint16_t wTotalLength;
272    uint8_t bInCollection;
273    uint8_t baInterfaceNr[];
274} __PACKED usb_audio_ac_header_desc;
275
276// Common header structure shared by all unit and terminal descriptors found in
277// an Audio Control interface descriptor.
278typedef struct {
279    uint8_t bLength;
280    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
281    uint8_t bDescriptorSubtype;     // USB_AUDIO_AC_.*_(TERMINAL|UNIT)
282    uint8_t bID;
283} __PACKED usb_audio_ac_ut_desc;
284
285// Common header structure shared by all terminal descriptors found in an Audio
286// Control interface descriptor.
287typedef struct {
288    uint8_t bLength;
289    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
290    uint8_t bDescriptorSubtype;     // USB_AUDIO_AC_(INPUT|OUTPUT)_TERMINAL
291    uint8_t bTerminalID;
292    uint16_t wTerminalType;
293    uint8_t bAssocTerminal;
294} __PACKED usb_audio_ac_terminal_desc;
295
296typedef struct {
297    uint8_t bLength;
298    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
299    uint8_t bDescriptorSubtype;     // USB_AUDIO_AC_INPUT_TERMINAL
300    uint8_t bTerminalID;
301    uint16_t wTerminalType;
302    uint8_t bAssocTerminal;
303    uint8_t bNrChannels;
304    uint16_t wChannelConfig;
305    uint8_t iChannelNames;
306    uint8_t iTerminal;
307} __PACKED usb_audio_ac_input_terminal_desc;
308
309typedef struct {
310    uint8_t bLength;
311    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
312    uint8_t bDescriptorSubtype;     // USB_AUDIO_AC_OUTPUT_TERMINAL
313    uint8_t bTerminalID;
314    uint16_t wTerminalType;
315    uint8_t bAssocTerminal;
316    uint8_t bSourceID;
317    uint8_t iTerminal;
318} __PACKED usb_audio_ac_output_terminal_desc;
319
320// Note: Mixer unit descriptors contain two inlined variable length arrays, each
321// with descriptor data following them.  They are therefor described using 3
322// structure definitions which are logically concatenated, but separated by the
323// inline arrays.
324typedef struct {
325    uint8_t bLength;
326    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
327    uint8_t bDescriptorSubtype;     // USB_AUDIO_AC_MIXER_UNIT
328    uint8_t bUnitID;
329    uint8_t bNrInPins;
330    uint8_t baSourceID[];
331} __PACKED usb_audio_ac_mixer_unit_desc_0;
332
333typedef struct {
334    uint8_t bNrChannels;
335    uint16_t wChannelConfig;
336    uint8_t iChannelNames;
337    uint8_t bmControls[];
338} __PACKED usb_audio_ac_mixer_unit_desc_1;
339
340typedef struct {
341    uint8_t iMixer;
342} __PACKED usb_audio_ac_mixer_unit_desc_2;
343
344// Note: Selector unit descriptors contain an inlined variable length array with
345// descriptor data following it.  They are therefor described using 2 structure
346// definitions which are logically concatenated, but separated by the inline
347// array.
348typedef struct {
349    uint8_t bLength;
350    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
351    uint8_t bDescriptorSubtype;     // USB_AUDIO_AC_SELECTOR_UNIT
352    uint8_t bUnitID;
353    uint8_t bNrInPins;
354    uint8_t baSourceID[];
355} __PACKED usb_audio_ac_selector_unit_desc_0;
356
357typedef struct {
358    uint8_t iSelector;
359} __PACKED usb_audio_ac_selector_unit_desc_1;
360
361// Note: Feature unit descriptors contain an inlined variable length array with
362// descriptor data following it.  They are therefor described using 2 structure
363// definitions which are logically concatenated, but separated by the inline
364// array.
365typedef struct {
366    uint8_t bLength;
367    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
368    uint8_t bDescriptorSubtype;     // USB_AUDIO_AC_FEATURE_UNIT
369    uint8_t bUnitID;
370    uint8_t bSourceID;
371    uint8_t bControlSize;
372    uint8_t bmaControls[];
373} __PACKED usb_audio_ac_feature_unit_desc_0;
374
375typedef struct {
376    uint8_t iFeature;
377} __PACKED usb_audio_ac_feature_unit_desc_1;
378
379// Note: Processing unit descriptors contain two inlined variable length arrays,
380// each with descriptor data following them.  They are therefor described using
381// 3 structure definitions which are logically concatinated, but separated by
382// the inline arrays.
383typedef struct {
384    uint8_t bLength;
385    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
386    uint8_t bDescriptorSubtype;     // USB_AUDIO_AC_PROCESSING_UNIT
387    uint8_t bUnitID;
388    uint16_t wProcessType;
389    uint8_t bNrInPins;
390    uint8_t baSourceID[];
391} __PACKED usb_audio_ac_processing_unit_desc_0;
392
393typedef struct {
394    uint8_t bNrChannels;
395    uint16_t wChannelConfig;
396    uint8_t iChannelNames;
397    uint8_t bControlSize;
398    uint8_t bmControls[];
399} __PACKED usb_audio_ac_processing_unit_desc_1;
400
401typedef struct {
402    uint8_t iProcessing;
403    // Note: The Process-specific control structure follows this with the
404    // structure type determined by wProcessType
405    // TODO(johngro) : Define the process specific control structures.  As of
406    // the 1.0 revision of the USB audio spec, the types to be defined are...
407    //
408    // ** Up/Down-mix
409    // ** Dolby Prologic
410    // ** 3D-Stereo Extender
411    // ** Reverberation
412    // ** Chorus
413    // ** Dynamic Range Compressor
414} __PACKED usb_audio_ac_processing_unit_desc_2;
415
416// Note: Extension unit descriptors contain two inlined variable length arrays,
417// each with descriptor data following them.  They are therefor described using
418// 3 structure definitions which are logically concatenated, but separated by
419// the inline arrays.
420typedef struct {
421    uint8_t bLength;
422    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
423    uint8_t bDescriptorSubtype;     // USB_AUDIO_AC_EXTENSION_UNIT
424    uint8_t bUnitID;
425    uint16_t wExtensionCode;
426    uint8_t bNrInPins;
427    uint8_t baSourceID[];
428} __PACKED usb_audio_ac_extension_unit_desc_0;
429
430typedef struct {
431    uint8_t bNrChannels;
432    uint16_t wChannelConfig;
433    uint8_t iChannelNames;
434    uint8_t bControlSize;
435    uint8_t bmControls[];
436} __PACKED usb_audio_ac_extension_unit_desc_1;
437
438typedef struct {
439    uint8_t iExtension;
440} __PACKED usb_audio_ac_extension_unit_desc_2;
441
442// Audio Streaming Interface descriptor definitions
443//
444typedef struct {
445    uint8_t bLength;
446    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
447    uint8_t bDescriptorSubtype;     // USB_AUDIO_AS_GENERAL
448    uint8_t bTerminalLink;
449    uint8_t bDelay;
450    uint16_t wFormatTag;
451} __PACKED usb_audio_as_header_desc;
452
453typedef struct {
454    uint8_t freq[3];            // 24 bit unsigned integer, little-endian
455} __PACKED usb_audio_as_samp_freq;
456
457// Common header used by all format type descriptors
458typedef struct {
459    uint8_t bLength;
460    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
461    uint8_t bDescriptorSubtype;     // USB_AUDIO_AS_FORMAT_TYPE
462    uint8_t bFormatType;
463} __PACKED usb_audio_as_format_type_hdr;
464
465typedef struct {
466    uint8_t bLength;
467    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
468    uint8_t bDescriptorSubtype;     // USB_AUDIO_AS_FORMAT_TYPE
469    uint8_t bFormatType;            // USB_AUDIO_FORMAT_TYPE_I
470    uint8_t bNrChannels;
471    uint8_t bSubFrameSize;
472    uint8_t bBitResolution;
473    uint8_t bSamFreqType;           // number of sampling frequencies
474    usb_audio_as_samp_freq tSamFreq[]; // list of sampling frequencies (3 bytes each)
475} __PACKED usb_audio_as_format_type_i_desc;
476
477typedef struct {
478    uint8_t bLength;
479    uint8_t bDescriptorType;        // USB_AUDIO_CS_ENDPOINT
480    uint8_t bDescriptorSubtype;     // USB_AUDIO_EP_GENERAL
481    uint8_t bmAttributes;
482    uint8_t bLockDelayUnits;
483    uint16_t wLockDelay;
484} __PACKED usb_audio_as_isoch_ep_desc;
485
486// MIDI Streaming Interface descriptor definitions
487//
488typedef struct {
489    uint8_t bLength;
490    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
491    uint8_t bDescriptorSubtype;     // USB_MIDI_MS_HEADER
492    uint16_t bcdMSC;
493    uint16_t wTotalLength;
494} __PACKED usb_midi_ms_header_desc;
495
496typedef struct {
497    uint8_t bLength;
498    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
499    uint8_t bDescriptorSubtype;     // USB_MIDI_IN_JACK
500    uint8_t bJackType;
501    uint8_t bJackID;
502    uint8_t iJack;
503} __PACKED usb_midi_ms_in_jack_desc;
504
505typedef struct {
506    uint8_t bLength;
507    uint8_t bDescriptorType;        // USB_AUDIO_CS_INTERFACE
508    uint8_t bDescriptorSubtype;     // USB_MIDI_OUT_JACK
509    uint8_t bJackType;
510    uint8_t bJackID;
511    uint8_t bNrInputPins;
512    uint8_t baSourceID;
513    uint8_t baSourcePin;
514} __PACKED usb_midi_ms_out_jack_desc;
515
516typedef struct {
517    uint8_t bLength;
518    uint8_t bDescriptorType;        // USB_AUDIO_CS_ENDPOINT
519    uint8_t bDescriptorSubtype;     // USB_MIDI_MS_GENERAL
520    uint8_t bNumEmbMIDIJack;
521    uint8_t baAssocJackID[];
522} __PACKED usb_midi_ms_endpoint_desc;
523
524__END_CDECLS;
525