[USBAUDIO]
[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 #define DEFINE_KSPROPERTY_ITEM_AUDIO_VOLUME(Handler)\
39 DEFINE_KSPROPERTY_ITEM(\
40 KSPROPERTY_AUDIO_VOLUMELEVEL,\
41 (Handler),\
42 sizeof(KSNODEPROPERTY_AUDIO_CHANNEL),\
43 sizeof(LONG),\
44 (Handler), NULL, 0, NULL, NULL, 0)
45
46
47 #define DEFINE_KSPROPERTY_TABLE_AUDIO_VOLUME(TopologySet, Handler)\
48 DEFINE_KSPROPERTY_TABLE(TopologySet) {\
49 DEFINE_KSPROPERTY_ITEM_AUDIO_VOLUME(Handler)\
50 }
51
52 #define DEFINE_KSPROPERTY_ITEM_AUDIO_MUTE(Handler)\
53 DEFINE_KSPROPERTY_ITEM(\
54 KSPROPERTY_AUDIO_MUTE,\
55 (Handler),\
56 sizeof(KSNODEPROPERTY_AUDIO_CHANNEL),\
57 sizeof(BOOL),\
58 (Handler), NULL, 0, NULL, NULL, 0)
59
60 #define DEFINE_KSPROPERTY_TABLE_AUDIO_MUTE(TopologySet, Handler)\
61 DEFINE_KSPROPERTY_TABLE(TopologySet) {\
62 DEFINE_KSPROPERTY_ITEM_AUDIO_MUTE(Handler)\
63 }
64
65
66
67 #include <pshpack1.h>
68
69 typedef struct
70 {
71 UCHAR bLength;
72 UCHAR bDescriptorType;
73 UCHAR bDescriptorSubtype;
74 USHORT bcdADC;
75 USHORT wTotalLength;
76 UCHAR bInCollection;
77 UCHAR baInterfaceNr;
78 }USB_AUDIO_CONTROL_INTERFACE_HEADER_DESCRIPTOR, *PUSB_AUDIO_CONTROL_INTERFACE_HEADER_DESCRIPTOR;
79
80 typedef struct
81 {
82 UCHAR bLength;
83 UCHAR bDescriptorType;
84 UCHAR bDescriptorSubtype;
85 UCHAR bTerminalID;
86 USHORT wTerminalType;
87 UCHAR bAssocTerminal;
88 UCHAR bSourceID;
89 UCHAR iTerminal;
90 }USB_AUDIO_CONTROL_OUTPUT_TERMINAL_DESCRIPTOR, *PUSB_AUDIO_CONTROL_OUTPUT_TERMINAL_DESCRIPTOR;
91
92
93 typedef struct
94 {
95 UCHAR bLength;
96 UCHAR bDescriptorType;
97 UCHAR bDescriptorSubtype;
98 UCHAR bTerminalID;
99 USHORT wTerminalType;
100 UCHAR bAssocTerminal;
101 UCHAR bNrChannels;
102 USHORT wChannelConfig;
103 UCHAR iChannelNames;
104 UCHAR iTerminal;
105 }USB_AUDIO_CONTROL_INPUT_TERMINAL_DESCRIPTOR, *PUSB_AUDIO_CONTROL_INPUT_TERMINAL_DESCRIPTOR;
106
107 typedef struct
108 {
109 UCHAR bLength;
110 UCHAR bDescriptorType;
111 UCHAR bDescriptorSubtype;
112 UCHAR bUnitID;
113 UCHAR bSourceID;
114 UCHAR bControlSize;
115 UCHAR bmaControls[1];
116 UCHAR iFeature;
117 }USB_AUDIO_CONTROL_FEATURE_UNIT_DESCRIPTOR, *PUSB_AUDIO_CONTROL_FEATURE_UNIT_DESCRIPTOR;
118
119 typedef struct
120 {
121 UCHAR bLength;
122 UCHAR bDescriptorType;
123 UCHAR bDescriptorSubtype;
124 UCHAR bUnitID;
125 UCHAR bNrInPins;
126 UCHAR baSourceID[1];
127 UCHAR bNrChannels;
128 USHORT wChannelConfig;
129 UCHAR iChannelNames;
130 UCHAR bmControls;
131 UCHAR iMixer;
132 }USB_AUDIO_CONTROL_MIXER_UNIT_DESCRIPTOR, *PUSB_AUDIO_CONTROL_MIXER_UNIT_DESCRIPTOR;
133
134
135 typedef struct
136 {
137 UCHAR bLength;
138 UCHAR bDescriptorType;
139 UCHAR bDescriptorSubtype;
140 UCHAR bTerminalLink;
141 UCHAR bDelay;
142 USHORT wFormatTag;
143 }USB_AUDIO_STREAMING_INTERFACE_DESCRIPTOR, *PUSB_AUDIO_STREAMING_INTERFACE_DESCRIPTOR;
144
145 typedef struct
146 {
147 UCHAR bLength;
148 UCHAR bDescriptorType;
149 UCHAR bDescriptorSubtype;
150 UCHAR bFormatType;
151 UCHAR bNrChannels;
152 UCHAR bSubframeSize;
153 UCHAR bBitResolution;
154 UCHAR bSamFreqType;
155 UCHAR tSamFreq[1];
156 }USB_AUDIO_STREAMING_FORMAT_TYPE_DESCRIPTOR, *PUSB_AUDIO_STREAMING_FORMAT_TYPE_DESCRIPTOR;
157
158 #include <poppack.h>
159
160 typedef struct
161 {
162 PUSB_COMMON_DESCRIPTOR Descriptor;
163 ULONG NodeCount;
164 ULONG Nodes[20];
165 }NODE_CONTEXT, *PNODE_CONTEXT;
166
167 typedef struct __DEVICE_EXTENSION__
168 {
169 PDEVICE_OBJECT LowerDevice; /* lower device*/
170 PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor; /* usb configuration descriptor */
171 PUSB_DEVICE_DESCRIPTOR DeviceDescriptor; /* usb device descriptor */
172 PUSBD_INTERFACE_INFORMATION InterfaceInfo; /* interface information */
173 USBD_CONFIGURATION_HANDLE ConfigurationHandle; /* configuration handle */
174 PNODE_CONTEXT NodeContext; /* node context */
175 ULONG NodeContextCount; /* node context count */
176 }DEVICE_EXTENSION, *PDEVICE_EXTENSION;
177
178 typedef struct
179 {
180 PDEVICE_EXTENSION DeviceExtension; /* device extension */
181 PDEVICE_OBJECT LowerDevice; /* lower device*/
182
183 }FILTER_CONTEXT, *PFILTER_CONTEXT;
184
185 typedef struct
186 {
187 PDEVICE_EXTENSION DeviceExtension; /* device extension */
188 PDEVICE_OBJECT LowerDevice; /* lower device*/
189 LIST_ENTRY IrpListHead; /* irp list*/
190 LIST_ENTRY DoneIrpListHead; /* irp done list head */
191 KSPIN_LOCK IrpListLock; /* irp list lock*/
192 PUCHAR Buffer; /* iso buffer*/
193 ULONG BufferSize; /* iso buffer size */
194 PUSB_INTERFACE_DESCRIPTOR InterfaceDescriptor; /* interface descriptor */
195 WORK_QUEUE_ITEM CaptureWorkItem; /* work item */
196 PKSWORKER CaptureWorker; /* capture worker */
197 WORK_QUEUE_ITEM StarvationWorkItem; /* work item */
198 PKSWORKER StarvationWorker; /* capture worker */
199 }PIN_CONTEXT, *PPIN_CONTEXT;
200
201 /* filter.c */
202
203 NTSTATUS
204 NTAPI
205 USBAudioCreateFilterContext(
206 PKSDEVICE Device);
207
208 /* pool.c */
209 PVOID
210 NTAPI
211 AllocFunction(
212 IN ULONG ItemSize);
213
214 VOID
215 NTAPI
216 FreeFunction(
217 IN PVOID Item);
218
219 VOID
220 NTAPI
221 CountTerminalUnits(
222 IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor,
223 OUT PULONG NonStreamingTerminalDescriptorCount,
224 OUT PULONG TotalTerminalDescriptorCount);
225
226 /* usbaudio.c */
227
228 NTSTATUS
229 SubmitUrbSync(
230 IN PDEVICE_OBJECT Device,
231 IN PURB Urb);
232
233 NTSTATUS
234 NTAPI
235 USBAudioAddDevice(
236 _In_ PKSDEVICE Device
237 );
238
239 NTSTATUS
240 NTAPI
241 USBAudioPnPStart(
242 _In_ PKSDEVICE Device,
243 _In_ PIRP Irp,
244 _In_opt_ PCM_RESOURCE_LIST TranslatedResourceList,
245 _In_opt_ PCM_RESOURCE_LIST UntranslatedResourceList
246 );
247
248 NTSTATUS
249 NTAPI
250 USBAudioPnPQueryStop(
251 _In_ PKSDEVICE Device,
252 _In_ PIRP Irp
253 );
254
255 VOID
256 NTAPI
257 USBAudioPnPCancelStop(
258 _In_ PKSDEVICE Device,
259 _In_ PIRP Irp
260 );
261
262 VOID
263 NTAPI
264 USBAudioPnPStop(
265 _In_ PKSDEVICE Device,
266 _In_ PIRP Irp
267 );
268
269 NTSTATUS
270 NTAPI
271 USBAudioPnPQueryRemove(
272 _In_ PKSDEVICE Device,
273 _In_ PIRP Irp
274 );
275
276 VOID
277 NTAPI
278 USBAudioPnPCancelRemove(
279 _In_ PKSDEVICE Device,
280 _In_ PIRP Irp
281 );
282
283 VOID
284 NTAPI
285 USBAudioPnPRemove(
286 _In_ PKSDEVICE Device,
287 _In_ PIRP Irp
288 );
289
290 NTSTATUS
291 NTAPI
292 USBAudioPnPQueryCapabilities(
293 _In_ PKSDEVICE Device,
294 _In_ PIRP Irp,
295 _Inout_ PDEVICE_CAPABILITIES Capabilities
296 );
297
298 VOID
299 NTAPI
300 USBAudioPnPSurpriseRemoval(
301 _In_ PKSDEVICE Device,
302 _In_ PIRP Irp
303 );
304
305 NTSTATUS
306 NTAPI
307 USBAudioPnPQueryPower(
308 _In_ PKSDEVICE Device,
309 _In_ PIRP Irp,
310 _In_ DEVICE_POWER_STATE DeviceTo,
311 _In_ DEVICE_POWER_STATE DeviceFrom,
312 _In_ SYSTEM_POWER_STATE SystemTo,
313 _In_ SYSTEM_POWER_STATE SystemFrom,
314 _In_ POWER_ACTION Action
315 );
316
317 VOID
318 NTAPI
319 USBAudioPnPSetPower(
320 _In_ PKSDEVICE Device,
321 _In_ PIRP Irp,
322 _In_ DEVICE_POWER_STATE To,
323 _In_ DEVICE_POWER_STATE From
324 );
325
326 /* pin.c*/
327
328 NTSTATUS
329 NTAPI
330 UsbAudioPinDataIntersect(
331 _In_ PVOID Context,
332 _In_ PIRP Irp,
333 _In_ PKSP_PIN Pin,
334 _In_ PKSDATARANGE DataRange,
335 _In_ PKSDATARANGE MatchingDataRange,
336 _In_ ULONG DataBufferSize,
337 _Out_ PVOID Data,
338 _Out_ PULONG DataSize);
339
340 NTSTATUS
341 NTAPI
342 UsbAudioCaptureComplete(
343 IN PDEVICE_OBJECT DeviceObject,
344 IN PIRP Irp,
345 IN PVOID Context);
346
347 NTSTATUS
348 NTAPI
349 USBAudioPinCreate(
350 _In_ PKSPIN Pin,
351 _In_ PIRP Irp);
352
353 NTSTATUS
354 NTAPI
355 USBAudioPinClose(
356 _In_ PKSPIN Pin,
357 _In_ PIRP Irp);
358
359 NTSTATUS
360 NTAPI
361 USBAudioPinProcess(
362 _In_ PKSPIN Pin);
363
364 VOID
365 NTAPI
366 USBAudioPinReset(
367 _In_ PKSPIN Pin);
368
369 NTSTATUS
370 NTAPI
371 USBAudioPinSetDataFormat(
372 _In_ PKSPIN Pin,
373 _In_opt_ PKSDATAFORMAT OldFormat,
374 _In_opt_ PKSMULTIPLE_ITEM OldAttributeList,
375 _In_ const KSDATARANGE* DataRange,
376 _In_opt_ const KSATTRIBUTE_LIST* AttributeRange);
377
378 NTSTATUS
379 NTAPI
380 USBAudioPinSetDeviceState(
381 _In_ PKSPIN Pin,
382 _In_ KSSTATE ToState,
383 _In_ KSSTATE FromState);
384