audio.h
001:
002:
003:
004:
005:
006: <ben.williamson@greyinnovation.com>
007:
008:
009:
010:
011:
012:
013:
014:
015: http://www.usb.org/developers/devclass_docs/audio10.pdf
016:
017:
018:
019:
020:
021: #ifndef __LINUX_USB_AUDIO_H
022: #define __LINUX_USB_AUDIO_H
023:
024: #include <linux/types.h>
025:
026:
027: #define UAC_VERSION_1 0x00
028: #define UAC_VERSION_2 0x20
029:
030:
031: #define USB_SUBCLASS_AUDIOCONTROL 0x01
032: #define USB_SUBCLASS_AUDIOSTREAMING 0x02
033: #define USB_SUBCLASS_MIDISTREAMING 0x03
034:
035:
036: #define UAC_HEADER 0x01
037: #define UAC_INPUT_TERMINAL 0x02
038: #define UAC_OUTPUT_TERMINAL 0x03
039: #define UAC_MIXER_UNIT 0x04
040: #define UAC_SELECTOR_UNIT 0x05
041: #define UAC_FEATURE_UNIT 0x06
042: #define UAC1_PROCESSING_UNIT 0x07
043: #define UAC1_EXTENSION_UNIT 0x08
044:
045:
046: #define UAC_AS_GENERAL 0x01
047: #define UAC_FORMAT_TYPE 0x02
048: #define UAC_FORMAT_SPECIFIC 0x03
049:
050:
051: #define UAC_PROCESS_UNDEFINED 0x00
052: #define UAC_PROCESS_UP_DOWNMIX 0x01
053: #define UAC_PROCESS_DOLBY_PROLOGIC 0x02
054: #define UAC_PROCESS_STEREO_EXTENDER 0x03
055: #define UAC_PROCESS_REVERB 0x04
056: #define UAC_PROCESS_CHORUS 0x05
057: #define UAC_PROCESS_DYN_RANGE_COMP 0x06
058:
059:
060: #define UAC_EP_GENERAL 0x01
061:
062:
063: #define UAC_SET_ 0x00
064: #define UAC_GET_ 0x80
065:
066: #define UAC__CUR 0x1
067: #define UAC__MIN 0x2
068: #define UAC__MAX 0x3
069: #define UAC__RES 0x4
070: #define UAC__MEM 0x5
071:
072: #define UAC_SET_CUR (UAC_SET_ | UAC__CUR)
073: #define UAC_GET_CUR (UAC_GET_ | UAC__CUR)
074: #define UAC_SET_MIN (UAC_SET_ | UAC__MIN)
075: #define UAC_GET_MIN (UAC_GET_ | UAC__MIN)
076: #define UAC_SET_MAX (UAC_SET_ | UAC__MAX)
077: #define UAC_GET_MAX (UAC_GET_ | UAC__MAX)
078: #define UAC_SET_RES (UAC_SET_ | UAC__RES)
079: #define UAC_GET_RES (UAC_GET_ | UAC__RES)
080: #define UAC_SET_MEM (UAC_SET_ | UAC__MEM)
081: #define UAC_GET_MEM (UAC_GET_ | UAC__MEM)
082:
083: #define UAC_GET_STAT 0xff
084:
085:
086:
087:
088: #define UAC_TERM_COPY_PROTECT 0x01
089:
090:
091: #define UAC_FU_MUTE 0x01
092: #define UAC_FU_VOLUME 0x02
093: #define UAC_FU_BASS 0x03
094: #define UAC_FU_MID 0x04
095: #define UAC_FU_TREBLE 0x05
096: #define UAC_FU_GRAPHIC_EQUALIZER 0x06
097: #define UAC_FU_AUTOMATIC_GAIN 0x07
098: #define UAC_FU_DELAY 0x08
099: #define UAC_FU_BASS_BOOST 0x09
100: #define UAC_FU_LOUDNESS 0x0a
101:
102: #define UAC_CONTROL_BIT(CS) (1 << ((CS) - 1))
103:
104:
105: #define UAC_UD_ENABLE 0x01
106: #define UAC_UD_MODE_SELECT 0x02
107:
108:
109: #define UAC_DP_ENABLE 0x01
110: #define UAC_DP_MODE_SELECT 0x02
111:
112:
113: #define UAC_3D_ENABLE 0x01
114: #define UAC_3D_SPACE 0x02
115:
116:
117: #define UAC_REVERB_ENABLE 0x01
118: #define UAC_REVERB_LEVEL 0x02
119: #define UAC_REVERB_TIME 0x03
120: #define UAC_REVERB_FEEDBACK 0x04
121:
122:
123: #define UAC_CHORUS_ENABLE 0x01
124: #define UAC_CHORUS_LEVEL 0x02
125: #define UAC_CHORUS_RATE 0x03
126: #define UAC_CHORUS_DEPTH 0x04
127:
128:
129: #define UAC_DCR_ENABLE 0x01
130: #define UAC_DCR_RATE 0x02
131: #define UAC_DCR_MAXAMPL 0x03
132: #define UAC_DCR_THRESHOLD 0x04
133: #define UAC_DCR_ATTACK_TIME 0x05
134: #define UAC_DCR_RELEASE_TIME 0x06
135:
136:
137: #define UAC_XU_ENABLE 0x01
138:
139:
140: #define UAC_MS_HEADER 0x01
141: #define UAC_MIDI_IN_JACK 0x02
142: #define UAC_MIDI_OUT_JACK 0x03
143:
144:
145: #define UAC_MS_GENERAL 0x01
146:
147:
148: #define UAC_TERMINAL_UNDEFINED 0x100
149: #define UAC_TERMINAL_STREAMING 0x101
150: #define UAC_TERMINAL_VENDOR_SPEC 0x1FF
151:
152:
153:
154: struct uac1_ac_header_descriptor {
155: __u8 bLength;
156: __u8 bDescriptorType;
157: __u8 bDescriptorSubtype;
158: __le16 bcdADC;
159: __le16 wTotalLength;
160: __u8 bInCollection;
161: __u8 baInterfaceNr[];
162: } __attribute__ ((packed));
163:
164: #define UAC_DT_AC_HEADER_SIZE(n) (8 + (n))
165:
166:
167: #define DECLARE_UAC_AC_HEADER_DESCRIPTOR(n) \
168: struct uac1_ac_header_descriptor_##n { \
169: __u8 bLength; \
170: __u8 bDescriptorType; \
171: __u8 bDescriptorSubtype; \
172: __le16 bcdADC; \
173: __le16 wTotalLength; \
174: __u8 bInCollection; \
175: __u8 baInterfaceNr[n]; \
176: } __attribute__ ((packed))
177:
178:
179: struct uac_input_terminal_descriptor {
180: __u8 bLength;
181: __u8 bDescriptorType;
182: __u8 bDescriptorSubtype;
183: __u8 bTerminalID;
184: __le16 wTerminalType;
185: __u8 bAssocTerminal;
186: __u8 bNrChannels;
187: __le16 wChannelConfig;
188: __u8 iChannelNames;
189: __u8 iTerminal;
190: } __attribute__ ((packed));
191:
192: #define UAC_DT_INPUT_TERMINAL_SIZE 12
193:
194:
195: #define UAC_INPUT_TERMINAL_UNDEFINED 0x200
196: #define UAC_INPUT_TERMINAL_MICROPHONE 0x201
197: #define UAC_INPUT_TERMINAL_DESKTOP_MICROPHONE 0x202
198: #define UAC_INPUT_TERMINAL_PERSONAL_MICROPHONE 0x203
199: #define UAC_INPUT_TERMINAL_OMNI_DIR_MICROPHONE 0x204
200: #define UAC_INPUT_TERMINAL_MICROPHONE_ARRAY 0x205
201: #define UAC_INPUT_TERMINAL_PROC_MICROPHONE_ARRAY 0x206
202:
203:
204:
205: #define UAC_TERMINAL_CS_COPY_PROTECT_CONTROL 0x01
206:
207:
208: struct uac1_output_terminal_descriptor {
209: __u8 bLength;
210: __u8 bDescriptorType;
211: __u8 bDescriptorSubtype;
212: __u8 bTerminalID;
213: __le16 wTerminalType;
214: __u8 bAssocTerminal;
215: __u8 bSourceID;
216: __u8 iTerminal;
217: } __attribute__ ((packed));
218:
219: #define UAC_DT_OUTPUT_TERMINAL_SIZE 9
220:
221:
222: #define UAC_OUTPUT_TERMINAL_UNDEFINED 0x300
223: #define UAC_OUTPUT_TERMINAL_SPEAKER 0x301
224: #define UAC_OUTPUT_TERMINAL_HEADPHONES 0x302
225: #define UAC_OUTPUT_TERMINAL_HEAD_MOUNTED_DISPLAY_AUDIO 0x303
226: #define UAC_OUTPUT_TERMINAL_DESKTOP_SPEAKER 0x304
227: #define UAC_OUTPUT_TERMINAL_ROOM_SPEAKER 0x305
228: #define UAC_OUTPUT_TERMINAL_COMMUNICATION_SPEAKER 0x306
229: #define UAC_OUTPUT_TERMINAL_LOW_FREQ_EFFECTS_SPEAKER 0x307
230:
231:
232: #define UAC_DT_FEATURE_UNIT_SIZE(ch) (7 + ((ch) + 1) * 2)
233:
234:
235: #define DECLARE_UAC_FEATURE_UNIT_DESCRIPTOR(ch) \
236: struct uac_feature_unit_descriptor_##ch { \
237: __u8 bLength; \
238: __u8 bDescriptorType; \
239: __u8 bDescriptorSubtype; \
240: __u8 bUnitID; \
241: __u8 bSourceID; \
242: __u8 bControlSize; \
243: __le16 bmaControls[ch + 1]; \
244: __u8 iFeature; \
245: } __attribute__ ((packed))
246:
247:
248: struct uac_mixer_unit_descriptor {
249: __u8 bLength;
250: __u8 bDescriptorType;
251: __u8 bDescriptorSubtype;
252: __u8 bUnitID;
253: __u8 bNrInPins;
254: __u8 baSourceID[];
255: } __attribute__ ((packed));
256:
257: static __inline__ __u8 uac_mixer_unit_bNrChannels(struct uac_mixer_unit_descriptor *desc)
258: {
259: return desc->baSourceID[desc->bNrInPins];
260: }
261:
262: static __inline__ __u32 uac_mixer_unit_wChannelConfig(struct uac_mixer_unit_descriptor *desc,
263: int protocol)
264: {
265: if (protocol == UAC_VERSION_1)
266: return (desc->baSourceID[desc->bNrInPins + 2] << 8) |
267: desc->baSourceID[desc->bNrInPins + 1];
268: else
269: return (desc->baSourceID[desc->bNrInPins + 4] << 24) |
270: (desc->baSourceID[desc->bNrInPins + 3] << 16) |
271: (desc->baSourceID[desc->bNrInPins + 2] << 8) |
272: (desc->baSourceID[desc->bNrInPins + 1]);
273: }
274:
275: static __inline__ __u8 uac_mixer_unit_iChannelNames(struct uac_mixer_unit_descriptor *desc,
276: int protocol)
277: {
278: return (protocol == UAC_VERSION_1) ?
279: desc->baSourceID[desc->bNrInPins + 3] :
280: desc->baSourceID[desc->bNrInPins + 5];
281: }
282:
283: static __inline__ __u8 *uac_mixer_unit_bmControls(struct uac_mixer_unit_descriptor *desc,
284: int protocol)
285: {
286: return (protocol == UAC_VERSION_1) ?
287: &desc->baSourceID[desc->bNrInPins + 4] :
288: &desc->baSourceID[desc->bNrInPins + 6];
289: }
290:
291: static __inline__ __u8 uac_mixer_unit_iMixer(struct uac_mixer_unit_descriptor *desc)
292: {
293: __u8 *raw = (__u8 *) desc;
294: return raw[desc->bLength - 1];
295: }
296:
297:
298: struct uac_selector_unit_descriptor {
299: __u8 bLength;
300: __u8 bDescriptorType;
301: __u8 bDescriptorSubtype;
302: __u8 bUintID;
303: __u8 bNrInPins;
304: __u8 baSourceID[];
305: } __attribute__ ((packed));
306:
307: static __inline__ __u8 uac_selector_unit_iSelector(struct uac_selector_unit_descriptor *desc)
308: {
309: __u8 *raw = (__u8 *) desc;
310: return raw[desc->bLength - 1];
311: }
312:
313:
314: struct uac_feature_unit_descriptor {
315: __u8 bLength;
316: __u8 bDescriptorType;
317: __u8 bDescriptorSubtype;
318: __u8 bUnitID;
319: __u8 bSourceID;
320: __u8 bControlSize;
321: __u8 bmaControls[0];
322: } __attribute__((packed));
323:
324: static __inline__ __u8 uac_feature_unit_iFeature(struct uac_feature_unit_descriptor *desc)
325: {
326: __u8 *raw = (__u8 *) desc;
327: return raw[desc->bLength - 1];
328: }
329:
330:
331: struct uac_processing_unit_descriptor {
332: __u8 bLength;
333: __u8 bDescriptorType;
334: __u8 bDescriptorSubtype;
335: __u8 bUnitID;
336: __u16 wProcessType;
337: __u8 bNrInPins;
338: __u8 baSourceID[];
339: } __attribute__ ((packed));
340:
341: static __inline__ __u8 uac_processing_unit_bNrChannels(struct uac_processing_unit_descriptor *desc)
342: {
343: return desc->baSourceID[desc->bNrInPins];
344: }
345:
346: static __inline__ __u32 uac_processing_unit_wChannelConfig(struct uac_processing_unit_descriptor *desc,
347: int protocol)
348: {
349: if (protocol == UAC_VERSION_1)
350: return (desc->baSourceID[desc->bNrInPins + 2] << 8) |
351: desc->baSourceID[desc->bNrInPins + 1];
352: else
353: return (desc->baSourceID[desc->bNrInPins + 4] << 24) |
354: (desc->baSourceID[desc->bNrInPins + 3] << 16) |
355: (desc->baSourceID[desc->bNrInPins + 2] << 8) |
356: (desc->baSourceID[desc->bNrInPins + 1]);
357: }
358:
359: static __inline__ __u8 uac_processing_unit_iChannelNames(struct uac_processing_unit_descriptor *desc,
360: int protocol)
361: {
362: return (protocol == UAC_VERSION_1) ?
363: desc->baSourceID[desc->bNrInPins + 3] :
364: desc->baSourceID[desc->bNrInPins + 5];
365: }
366:
367: static __inline__ __u8 uac_processing_unit_bControlSize(struct uac_processing_unit_descriptor *desc,
368: int protocol)
369: {
370: return (protocol == UAC_VERSION_1) ?
371: desc->baSourceID[desc->bNrInPins + 4] :
372: desc->baSourceID[desc->bNrInPins + 6];
373: }
374:
375: static __inline__ __u8 *uac_processing_unit_bmControls(struct uac_processing_unit_descriptor *desc,
376: int protocol)
377: {
378: return (protocol == UAC_VERSION_1) ?
379: &desc->baSourceID[desc->bNrInPins + 5] :
380: &desc->baSourceID[desc->bNrInPins + 7];
381: }
382:
383: static __inline__ __u8 uac_processing_unit_iProcessing(struct uac_processing_unit_descriptor *desc,
384: int protocol)
385: {
386: __u8 control_size = uac_processing_unit_bControlSize(desc, protocol);
387: return desc->baSourceID[desc->bNrInPins + control_size];
388: }
389:
390: static __inline__ __u8 *uac_processing_unit_specific(struct uac_processing_unit_descriptor *desc,
391: int protocol)
392: {
393: __u8 control_size = uac_processing_unit_bControlSize(desc, protocol);
394: return &desc->baSourceID[desc->bNrInPins + control_size + 1];
395: }
396:
397:
398: struct uac1_as_header_descriptor {
399: __u8 bLength;
400: __u8 bDescriptorType;
401: __u8 bDescriptorSubtype;
402: __u8 bTerminalLink;
403: __u8 bDelay;
404: __le16 wFormatTag;
405: } __attribute__ ((packed));
406:
407: #define UAC_DT_AS_HEADER_SIZE 7
408:
409:
410: #define UAC_FORMAT_TYPE_I_UNDEFINED 0x0
411: #define UAC_FORMAT_TYPE_I_PCM 0x1
412: #define UAC_FORMAT_TYPE_I_PCM8 0x2
413: #define UAC_FORMAT_TYPE_I_IEEE_FLOAT 0x3
414: #define UAC_FORMAT_TYPE_I_ALAW 0x4
415: #define UAC_FORMAT_TYPE_I_MULAW 0x5
416:
417: struct uac_format_type_i_continuous_descriptor {
418: __u8 bLength;
419: __u8 bDescriptorType;
420: __u8 bDescriptorSubtype;
421: __u8 bFormatType;
422: __u8 bNrChannels;
423: __u8 bSubframeSize;
424: __u8 bBitResolution;
425: __u8 bSamFreqType;
426: __u8 tLowerSamFreq[3];
427: __u8 tUpperSamFreq[3];
428: } __attribute__ ((packed));
429:
430: #define UAC_FORMAT_TYPE_I_CONTINUOUS_DESC_SIZE 14
431:
432: struct uac_format_type_i_discrete_descriptor {
433: __u8 bLength;
434: __u8 bDescriptorType;
435: __u8 bDescriptorSubtype;
436: __u8 bFormatType;
437: __u8 bNrChannels;
438: __u8 bSubframeSize;
439: __u8 bBitResolution;
440: __u8 bSamFreqType;
441: __u8 tSamFreq[][3];
442: } __attribute__ ((packed));
443:
444: #define DECLARE_UAC_FORMAT_TYPE_I_DISCRETE_DESC(n) \
445: struct uac_format_type_i_discrete_descriptor_##n { \
446: __u8 bLength; \
447: __u8 bDescriptorType; \
448: __u8 bDescriptorSubtype; \
449: __u8 bFormatType; \
450: __u8 bNrChannels; \
451: __u8 bSubframeSize; \
452: __u8 bBitResolution; \
453: __u8 bSamFreqType; \
454: __u8 tSamFreq[n][3]; \
455: } __attribute__ ((packed))
456:
457: #define UAC_FORMAT_TYPE_I_DISCRETE_DESC_SIZE(n) (8 + (n * 3))
458:
459: struct uac_format_type_i_ext_descriptor {
460: __u8 bLength;
461: __u8 bDescriptorType;
462: __u8 bDescriptorSubtype;
463: __u8 bFormatType;
464: __u8 bSubslotSize;
465: __u8 bBitResolution;
466: __u8 bHeaderLength;
467: __u8 bControlSize;
468: __u8 bSideBandProtocol;
469: } __attribute__((packed));
470:
471:
472:
473: #define UAC_FORMAT_TYPE_II_MPEG 0x1001
474: #define UAC_FORMAT_TYPE_II_AC3 0x1002
475:
476: struct uac_format_type_ii_discrete_descriptor {
477: __u8 bLength;
478: __u8 bDescriptorType;
479: __u8 bDescriptorSubtype;
480: __u8 bFormatType;
481: __le16 wMaxBitRate;
482: __le16 wSamplesPerFrame;
483: __u8 bSamFreqType;
484: __u8 tSamFreq[][3];
485: } __attribute__((packed));
486:
487: struct uac_format_type_ii_ext_descriptor {
488: __u8 bLength;
489: __u8 bDescriptorType;
490: __u8 bDescriptorSubtype;
491: __u8 bFormatType;
492: __u16 wMaxBitRate;
493: __u16 wSamplesPerFrame;
494: __u8 bHeaderLength;
495: __u8 bSideBandProtocol;
496: } __attribute__((packed));
497:
498:
499: #define UAC_FORMAT_TYPE_III_IEC1937_AC3 0x2001
500: #define UAC_FORMAT_TYPE_III_IEC1937_MPEG1_LAYER1 0x2002
501: #define UAC_FORMAT_TYPE_III_IEC1937_MPEG2_NOEXT 0x2003
502: #define UAC_FORMAT_TYPE_III_IEC1937_MPEG2_EXT 0x2004
503: #define UAC_FORMAT_TYPE_III_IEC1937_MPEG2_LAYER1_LS 0x2005
504: #define UAC_FORMAT_TYPE_III_IEC1937_MPEG2_LAYER23_LS 0x2006
505:
506:
507: #define UAC_FORMAT_TYPE_UNDEFINED 0x0
508: #define UAC_FORMAT_TYPE_I 0x1
509: #define UAC_FORMAT_TYPE_II 0x2
510: #define UAC_FORMAT_TYPE_III 0x3
511: #define UAC_EXT_FORMAT_TYPE_I 0x81
512: #define UAC_EXT_FORMAT_TYPE_II 0x82
513: #define UAC_EXT_FORMAT_TYPE_III 0x83
514:
515: struct uac_iso_endpoint_descriptor {
516: __u8 bLength;
517: __u8 bDescriptorType;
518: __u8 bDescriptorSubtype;
519: __u8 bmAttributes;
520: __u8 bLockDelayUnits;
521: __le16 wLockDelay;
522: } __attribute__((packed));
523: #define UAC_ISO_ENDPOINT_DESC_SIZE 7
524:
525: #define UAC_EP_CS_ATTR_SAMPLE_RATE 0x01
526: #define UAC_EP_CS_ATTR_PITCH_CONTROL 0x02
527: #define UAC_EP_CS_ATTR_FILL_MAX 0x80
528:
529:
530:
531: #define UAC1_STATUS_TYPE_ORIG_MASK 0x0f
532: #define UAC1_STATUS_TYPE_ORIG_AUDIO_CONTROL_IF 0x0
533: #define UAC1_STATUS_TYPE_ORIG_AUDIO_STREAM_IF 0x1
534: #define UAC1_STATUS_TYPE_ORIG_AUDIO_STREAM_EP 0x2
535:
536: #define UAC1_STATUS_TYPE_IRQ_PENDING (1 << 7)
537: #define UAC1_STATUS_TYPE_MEM_CHANGED (1 << 6)
538:
539: struct uac1_status_word {
540: __u8 bStatusType;
541: __u8 bOriginator;
542: } __attribute__((packed));
543:
544:
545: #endif
546:
© Andrew Scott 2006 -
2025,
All Rights Reserved