36b95f0f7ea21e26e0206384f030fa7795248a84
[reactos.git] / reactos / drivers / usb / usbaudio / usbaudio.h
1 #pragma once
2
3 #include <ntddk.h>
4 #include <portcls.h>
5 #include <ksmedia.h>
6 #include <hubbusif.h>
7 #include <usbbusif.h>
8 #include <usbioctl.h>
9 #include <usb.h>
10 #include <usbdlib.h>
11 #include <debug.h>
12
13 #define USBAUDIO_TAG 'AbsU'
14 #define USB_AUDIO_CONTROL_TERMINAL_DESCRIPTOR_TYPE (0x24)
15
16 /* Universal Serial Bus Device Class Definition for Terminal Types Section 2.2 */
17 #define USB_AUDIO_STREAMING_TERMINAL_TYPE (0x0101)
18
19 #define USB_AUDIO_MICROPHONE_TERMINAL_TYPE (0x0201)
20 #define USB_AUDIO_DESKTOP_MICROPHONE_TERMINAL_TYPE (0x0202)
21 #define USB_AUDIO_PERSONAL_MICROPHONE_TERMINAL_TYPE (0x0203)
22 #define USB_AUDIO_OMMNI_MICROPHONE_TERMINAL_TYPE (0x0204)
23 #define USB_AUDIO_ARRAY_MICROPHONE_TERMINAL_TYPE (0x0205)
24 #define USB_AUDIO_ARRAY_PROCESSING_MICROPHONE_TERMINAL_TYPE (0x0206)
25
26 #define USB_AUDIO_SPEAKER_TERMINAL_TYPE (0x0301)
27 #define USB_HEADPHONES_SPEAKER_TERMINAL_TYPE (0x0302)
28 #define USB_AUDIO_HMDA_TERMINAL_TYPE (0x0303)
29 #define USB_AUDIO_DESKTOP_SPEAKER_TERMINAL_TYPE (0x0304)
30 #define USB_AUDIO_ROOM_SPEAKER_TERMINAL_TYPE (0x0305)
31 #define USB_AUDIO_COMMUNICATION_SPEAKER_TERMINAL_TYPE (0x0306)
32 #define USB_AUDIO_SUBWOOFER_TERMINAL_TYPE (0x0307)
33 #define USB_AUDIO_UNDEFINED_TERMINAL_TYPE (0xFFFF)
34
35 #define USB_AUDIO_INPUT_TERMINAL (0x02)
36 #define USB_AUDIO_OUTPUT_TERMINAL (0x03)
37
38 #include <pshpack1.h>
39
40 typedef struct
41 {
42 UCHAR bLength;
43 UCHAR bDescriptorType;
44 UCHAR bDescriptorSubtype;
45 USHORT bcdADC;
46 USHORT wTotalLength;
47 UCHAR bInCollection;
48 UCHAR baInterfaceNr;
49 }USB_AUDIO_CONTROL_INTERFACE_HEADER_DESCRIPTOR, *PUSB_AUDIO_CONTROL_INTERFACE_HEADER_DESCRIPTOR;
50
51 typedef struct
52 {
53 UCHAR bLength;
54 UCHAR bDescriptorType;
55 UCHAR bDescriptorSubtype;
56 UCHAR bTerminalID;
57 USHORT wTerminalType;
58 UCHAR bAssocTerminal;
59 UCHAR bSourceID;
60 UCHAR iTerminal;
61 }USB_AUDIO_CONTROL_OUTPUT_TERMINAL_DESCRIPTOR, *PUSB_AUDIO_CONTROL_OUTPUT_TERMINAL_DESCRIPTOR;
62
63
64 typedef struct
65 {
66 UCHAR bLength;
67 UCHAR bDescriptorType;
68 UCHAR bDescriptorSubtype;
69 UCHAR bTerminalID;
70 USHORT wTerminalType;
71 UCHAR bAssocTerminal;
72 UCHAR bNrChannels;
73 USHORT wChannelConfig;
74 UCHAR iChannelNames;
75 UCHAR iTerminal;
76 }USB_AUDIO_CONTROL_INPUT_TERMINAL_DESCRIPTOR, *PUSB_AUDIO_CONTROL_INPUT_TERMINAL_DESCRIPTOR;
77
78 typedef struct
79 {
80 UCHAR bLength;
81 UCHAR bDescriptorType;
82 UCHAR bDescriptorSubtype;
83 UCHAR bUnitID;
84 UCHAR bSourceID;
85 UCHAR bControlSize;
86 UCHAR bmaControls[1];
87 UCHAR iFeature;
88 }USB_AUDIO_CONTROL_FEATURE_UNIT_DESCRIPTOR, *PUSB_AUDIO_CONTROL_FEATURE_UNIT_DESCRIPTOR;
89
90 typedef struct
91 {
92 UCHAR bLength;
93 UCHAR bDescriptorType;
94 UCHAR bDescriptorSubtype;
95 UCHAR bUnitID;
96 UCHAR bNrInPins;
97 UCHAR baSourceID[1];
98 UCHAR bNrChannels;
99 USHORT wChannelConfig;
100 UCHAR iChannelNames;
101 UCHAR bmControls;
102 UCHAR iMixer;
103 }USB_AUDIO_CONTROL_MIXER_UNIT_DESCRIPTOR, *PUSB_AUDIO_CONTROL_MIXER_UNIT_DESCRIPTOR;
104
105
106 typedef struct
107 {
108 UCHAR bLength;
109 UCHAR bDescriptorType;
110 UCHAR bDescriptorSubtype;
111 UCHAR bTerminalLink;
112 UCHAR bDelay;
113 USHORT wFormatTag;
114 }USB_AUDIO_STREAMING_INTERFACE_DESCRIPTOR, *PUSB_AUDIO_STREAMING_INTERFACE_DESCRIPTOR;
115
116 typedef struct
117 {
118 UCHAR bLength;
119 UCHAR bDescriptorType;
120 UCHAR bDescriptorSubtype;
121 UCHAR bFormatType;
122 UCHAR bNrChannels;
123 UCHAR bSubframeSize;
124 UCHAR bBitResolution;
125 UCHAR bSamFreqType;
126 UCHAR tSamFreq[1];
127 }USB_AUDIO_STREAMING_FORMAT_TYPE_DESCRIPTOR, *PUSB_AUDIO_STREAMING_FORMAT_TYPE_DESCRIPTOR;
128
129 #include <poppack.h>
130
131 typedef struct __DEVICE_EXTENSION__
132 {
133 PDEVICE_OBJECT LowerDevice; /* lower device*/
134 PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor; /* usb configuration descriptor */
135 PUSB_DEVICE_DESCRIPTOR DeviceDescriptor; /* usb device descriptor */
136 PUSBD_INTERFACE_INFORMATION InterfaceInfo; /* interface information */
137 USBD_CONFIGURATION_HANDLE ConfigurationHandle; /* configuration handle */
138
139 }DEVICE_EXTENSION, *PDEVICE_EXTENSION;
140
141 typedef struct
142 {
143 PDEVICE_EXTENSION DeviceExtension; /* device extension */
144 PDEVICE_OBJECT LowerDevice; /* lower device*/
145
146 }FILTER_CONTEXT, *PFILTER_CONTEXT;
147
148 typedef struct
149 {
150 PDEVICE_EXTENSION DeviceExtension; /* device extension */
151 PDEVICE_OBJECT LowerDevice; /* lower device*/
152 LIST_ENTRY IrpListHead; /* irp list*/
153 LIST_ENTRY DoneIrpListHead; /* irp done list head */
154 KSPIN_LOCK IrpListLock; /* irp list lock*/
155 PUCHAR Buffer; /* iso buffer*/
156 ULONG BufferSize; /* iso buffer size */
157 PUSB_INTERFACE_DESCRIPTOR InterfaceDescriptor; /* interface descriptor */
158 WORK_QUEUE_ITEM CaptureWorkItem; /* work item */
159 PKSWORKER CaptureWorker; /* capture worker */
160 WORK_QUEUE_ITEM StarvationWorkItem; /* work item */
161 PKSWORKER StarvationWorker; /* capture worker */
162 }PIN_CONTEXT, *PPIN_CONTEXT;
163
164 typedef struct
165 {
166 PUSB_COMMON_DESCRIPTOR Descriptor;
167 ULONG NodeCount;
168 ULONG Nodes[20];
169 }NODE_CONTEXT, *PNODE_CONTEXT;
170
171
172 /* filter.c */
173
174 NTSTATUS
175 NTAPI
176 USBAudioCreateFilterContext(
177 PKSDEVICE Device);
178
179 /* pool.c */
180 PVOID
181 NTAPI
182 AllocFunction(
183 IN ULONG ItemSize);
184
185 VOID
186 NTAPI
187 FreeFunction(
188 IN PVOID Item);
189
190 VOID
191 NTAPI
192 CountTerminalUnits(
193 IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor,
194 OUT PULONG NonStreamingTerminalDescriptorCount,
195 OUT PULONG TotalTerminalDescriptorCount);
196
197 /* usbaudio.c */
198
199 NTSTATUS
200 SubmitUrbSync(
201 IN PDEVICE_OBJECT Device,
202 IN PURB Urb);
203
204 NTSTATUS
205 NTAPI
206 USBAudioAddDevice(
207 _In_ PKSDEVICE Device
208 );
209
210 NTSTATUS
211 NTAPI
212 USBAudioPnPStart(
213 _In_ PKSDEVICE Device,
214 _In_ PIRP Irp,
215 _In_opt_ PCM_RESOURCE_LIST TranslatedResourceList,
216 _In_opt_ PCM_RESOURCE_LIST UntranslatedResourceList
217 );
218
219 NTSTATUS
220 NTAPI
221 USBAudioPnPQueryStop(
222 _In_ PKSDEVICE Device,
223 _In_ PIRP Irp
224 );
225
226 VOID
227 NTAPI
228 USBAudioPnPCancelStop(
229 _In_ PKSDEVICE Device,
230 _In_ PIRP Irp
231 );
232
233 VOID
234 NTAPI
235 USBAudioPnPStop(
236 _In_ PKSDEVICE Device,
237 _In_ PIRP Irp
238 );
239
240 NTSTATUS
241 NTAPI
242 USBAudioPnPQueryRemove(
243 _In_ PKSDEVICE Device,
244 _In_ PIRP Irp
245 );
246
247 VOID
248 NTAPI
249 USBAudioPnPCancelRemove(
250 _In_ PKSDEVICE Device,
251 _In_ PIRP Irp
252 );
253
254 VOID
255 NTAPI
256 USBAudioPnPRemove(
257 _In_ PKSDEVICE Device,
258 _In_ PIRP Irp
259 );
260
261 NTSTATUS
262 NTAPI
263 USBAudioPnPQueryCapabilities(
264 _In_ PKSDEVICE Device,
265 _In_ PIRP Irp,
266 _Inout_ PDEVICE_CAPABILITIES Capabilities
267 );
268
269 VOID
270 NTAPI
271 USBAudioPnPSurpriseRemoval(
272 _In_ PKSDEVICE Device,
273 _In_ PIRP Irp
274 );
275
276 NTSTATUS
277 NTAPI
278 USBAudioPnPQueryPower(
279 _In_ PKSDEVICE Device,
280 _In_ PIRP Irp,
281 _In_ DEVICE_POWER_STATE DeviceTo,
282 _In_ DEVICE_POWER_STATE DeviceFrom,
283 _In_ SYSTEM_POWER_STATE SystemTo,
284 _In_ SYSTEM_POWER_STATE SystemFrom,
285 _In_ POWER_ACTION Action
286 );
287
288 VOID
289 NTAPI
290 USBAudioPnPSetPower(
291 _In_ PKSDEVICE Device,
292 _In_ PIRP Irp,
293 _In_ DEVICE_POWER_STATE To,
294 _In_ DEVICE_POWER_STATE From
295 );
296
297 /* pin.c*/
298
299 NTSTATUS
300 NTAPI
301 UsbAudioPinDataIntersect(
302 _In_ PVOID Context,
303 _In_ PIRP Irp,
304 _In_ PKSP_PIN Pin,
305 _In_ PKSDATARANGE DataRange,
306 _In_ PKSDATARANGE MatchingDataRange,
307 _In_ ULONG DataBufferSize,
308 _Out_ PVOID Data,
309 _Out_ PULONG DataSize);
310
311 NTSTATUS
312 NTAPI
313 UsbAudioCaptureComplete(
314 IN PDEVICE_OBJECT DeviceObject,
315 IN PIRP Irp,
316 IN PVOID Context);
317
318 NTSTATUS
319 NTAPI
320 USBAudioPinCreate(
321 _In_ PKSPIN Pin,
322 _In_ PIRP Irp);
323
324 NTSTATUS
325 NTAPI
326 USBAudioPinClose(
327 _In_ PKSPIN Pin,
328 _In_ PIRP Irp);
329
330 NTSTATUS
331 NTAPI
332 USBAudioPinProcess(
333 _In_ PKSPIN Pin);
334
335 VOID
336 NTAPI
337 USBAudioPinReset(
338 _In_ PKSPIN Pin);
339
340 NTSTATUS
341 NTAPI
342 USBAudioPinSetDataFormat(
343 _In_ PKSPIN Pin,
344 _In_opt_ PKSDATAFORMAT OldFormat,
345 _In_opt_ PKSMULTIPLE_ITEM OldAttributeList,
346 _In_ const KSDATARANGE* DataRange,
347 _In_opt_ const KSATTRIBUTE_LIST* AttributeRange);
348
349 NTSTATUS
350 NTAPI
351 USBAudioPinSetDeviceState(
352 _In_ PKSPIN Pin,
353 _In_ KSSTATE ToState,
354 _In_ KSSTATE FromState);
355