- Check that all pins have been closed when the last filter reference is gone
[reactos.git] / reactos / drivers / wdm / audio / backpln / portcls / private.h
1 /*
2 PortCls FDO Extension
3
4 by Andrew Greenwood
5 */
6
7 #ifndef PORTCLS_PRIVATE_H
8 #define PORTCLS_PRIVATE_H
9
10 //#define _KS_NO_ANONYMOUS_STRUCTURES_
11
12 #include <ntddk.h>
13 #include <portcls.h>
14 #define NDEBUG
15 #include <debug.h>
16
17 #include <dmusicks.h>
18
19 #include "interfaces.h"
20 #include <ks.h>
21 #include <ksmedia.h>
22 #include <stdio.h>
23 #include <math.h>
24 #include <intrin.h>
25
26 #define TAG(A, B, C, D) (ULONG)(((A)<<0) + ((B)<<8) + ((C)<<16) + ((D)<<24))
27 #define TAG_PORTCLASS TAG('P', 'C', 'L', 'S')
28
29 #define ASSERT_IRQL(x) ASSERT(KeGetCurrentIrql() <= (x))
30
31 NTSTATUS
32 NTAPI
33 PortClsCreate(
34 IN PDEVICE_OBJECT DeviceObject,
35 IN PIRP Irp);
36
37 NTSTATUS
38 NTAPI
39 PortClsPnp(
40 IN PDEVICE_OBJECT DeviceObject,
41 IN PIRP Irp);
42
43 NTSTATUS
44 NTAPI
45 PortClsPower(
46 IN PDEVICE_OBJECT DeviceObject,
47 IN PIRP Irp);
48
49 NTSTATUS
50 NTAPI
51 PortClsSysControl(
52 IN PDEVICE_OBJECT DeviceObject,
53 IN PIRP Irp);
54
55 NTSTATUS NewMiniportDMusUART(
56 OUT PMINIPORT* OutMiniport,
57 IN REFCLSID ClassId);
58
59 NTSTATUS NewMiniportFmSynth(
60 OUT PMINIPORT* OutMiniport,
61 IN REFCLSID ClassId);
62
63 NTSTATUS NewPortDMus(
64 OUT PPORT* OutPort);
65
66 NTSTATUS NewPortTopology(
67 OUT PPORT* OutPort);
68
69 NTSTATUS NewPortWaveCyclic(
70 OUT PPORT* OutPort);
71
72 NTSTATUS NewPortWavePci(
73 OUT PPORT* OutPort);
74
75 NTSTATUS NewIDrmPort(
76 OUT PDRMPORT2 *OutPort);
77
78 NTSTATUS NewPortClsVersion(
79 OUT PPORTCLSVERSION * OutVersion);
80
81 NTSTATUS NewPortFilterWaveCyclic(
82 OUT IPortFilterWaveCyclic ** OutFilter);
83
84 NTSTATUS NewPortPinWaveCyclic(
85 OUT IPortPinWaveCyclic ** OutPin);
86
87 NTSTATUS
88 NewPortFilterWavePci(
89 OUT IPortFilterWavePci ** OutFilter);
90
91 NTSTATUS NewPortPinWavePci(
92 OUT IPortPinWavePci ** OutPin);
93
94 PDEVICE_OBJECT
95 GetDeviceObjectFromWaveCyclic(
96 IPortWavePci* iface);
97
98 PDEVICE_OBJECT
99 GetDeviceObjectFromPortWavePci(
100 IPortWavePci* iface);
101
102 PMINIPORTWAVEPCI
103 GetWavePciMiniport(
104 PPORTWAVEPCI Port);
105
106 NTSTATUS
107 NewPortFilterDMus(
108 OUT PPORTFILTERDMUS * OutFilter);
109
110 NTSTATUS NewPortPinDMus(
111 OUT PPORTPINDMUS * OutPin);
112
113 VOID
114 GetDMusMiniport(
115 IN IPortDMus * iface,
116 IN PMINIPORTDMUS * Miniport,
117 IN PMINIPORTMIDI * MidiMiniport);
118
119 #if (NTDDI_VERSION >= NTDDI_VISTA)
120
121 NTSTATUS
122 NewPortFilterWaveRT(
123 OUT IPortFilterWaveRT ** OutFilter);
124
125 NTSTATUS NewPortPinWaveRT(
126 OUT IPortPinWaveRT ** OutPin);
127
128 PMINIPORTWAVERT
129 GetWaveRTMiniport(
130 IN IPortWaveRT* iface);
131
132 PDEVICE_OBJECT
133 GetDeviceObjectFromPortWaveRT(
134 IPortWaveRT* iface);
135
136 NTSTATUS
137 NewPortWaveRTStream(
138 PPORTWAVERTSTREAM *OutStream);
139
140 NTSTATUS
141 NewPortWaveRT(
142 OUT PPORT* OutPort);
143
144
145 #endif
146
147 NTSTATUS
148 NewPortFilterTopology(
149 OUT IPortFilterTopology ** OutFilter);
150
151 PMINIPORTTOPOLOGY
152 GetTopologyMiniport(
153 PPORTTOPOLOGY Port);
154
155 NTSTATUS
156 NTAPI
157 NewDispatchObject(
158 IN PIRP Irp,
159 IN IIrpTarget * Target,
160 IN ULONG ObjectCreateItemCount,
161 IN PKSOBJECT_CREATE_ITEM ObjectCreateItem);
162
163 PMINIPORTWAVECYCLIC
164 GetWaveCyclicMiniport(
165 IN IPortWaveCyclic* iface);
166
167 PVOID
168 AllocateItem(
169 IN POOL_TYPE PoolType,
170 IN SIZE_T NumberOfBytes,
171 IN ULONG Tag);
172
173 VOID
174 FreeItem(
175 IN PVOID Item,
176 IN ULONG Tag);
177
178 NTSTATUS
179 NTAPI
180 NewIrpQueue(
181 IN IIrpQueue **Queue);
182
183 NTSTATUS
184 NTAPI
185 TopologyPropertyHandler(
186 IN PIRP Irp,
187 IN PKSIDENTIFIER Request,
188 IN OUT PVOID Data);
189
190 NTSTATUS
191 NTAPI
192 PinPropertyHandler(
193 IN PIRP Irp,
194 IN PKSIDENTIFIER Request,
195 IN OUT PVOID Data);
196
197 NTSTATUS
198 NTAPI
199 PcDmaMasterDescription(
200 IN PRESOURCELIST ResourceList OPTIONAL,
201 IN BOOLEAN ScatterGather,
202 IN BOOLEAN Dma32BitAddresses,
203 IN BOOLEAN IgnoreCount,
204 IN BOOLEAN Dma64BitAddresses,
205 IN DMA_WIDTH DmaWidth,
206 IN DMA_SPEED DmaSpeed,
207 IN ULONG MaximumLength,
208 IN ULONG DmaPort,
209 OUT PDEVICE_DESCRIPTION DeviceDescription);
210
211 NTSTATUS
212 NTAPI
213 PcDmaSlaveDescription(
214 IN PRESOURCELIST ResourceList OPTIONAL,
215 IN ULONG DmaIndex,
216 IN BOOL DemandMode,
217 IN ULONG AutoInitialize,
218 IN DMA_SPEED DmaSpeed,
219 IN ULONG MaximumLength,
220 IN ULONG DmaPort,
221 OUT PDEVICE_DESCRIPTION DeviceDescription);
222
223 NTSTATUS
224 NTAPI
225 PcCreateSubdeviceDescriptor(
226 OUT SUBDEVICE_DESCRIPTOR ** OutSubdeviceDescriptor,
227 IN ULONG InterfaceCount,
228 IN GUID * InterfaceGuids,
229 IN ULONG IdentifierCount,
230 IN KSIDENTIFIER *Identifier,
231 IN ULONG FilterPropertiesCount,
232 IN KSPROPERTY_SET * FilterProperties,
233 IN ULONG Unknown1,
234 IN ULONG Unknown2,
235 IN ULONG PinPropertiesCount,
236 IN KSPROPERTY_SET * PinProperties,
237 IN ULONG EventSetCount,
238 IN KSEVENT_SET * EventSet,
239 IN PPCFILTER_DESCRIPTOR FilterDescription);
240
241 NTSTATUS
242 NTAPI
243 PcValidateConnectRequest(
244 IN PIRP Irp,
245 IN KSPIN_FACTORY * Descriptor,
246 OUT PKSPIN_CONNECT* Connect);
247
248 NTSTATUS
249 NTAPI
250 PcCreateItemDispatch(
251 IN PDEVICE_OBJECT DeviceObject,
252 IN PIRP Irp);
253
254 NTSTATUS
255 NTAPI
256 PcPropertyHandler(
257 IN PIRP Irp,
258 IN PSUBDEVICE_DESCRIPTOR Descriptor);
259
260 NTSTATUS
261 NTAPI
262 FastPropertyHandler(
263 IN PFILE_OBJECT FileObject,
264 IN PKSPROPERTY UNALIGNED Property,
265 IN ULONG PropertyLength,
266 IN OUT PVOID UNALIGNED Data,
267 IN ULONG DataLength,
268 OUT PIO_STATUS_BLOCK IoStatus,
269 IN ULONG PropertySetsCount,
270 IN const KSPROPERTY_SET *PropertySet,
271 IN PSUBDEVICE_DESCRIPTOR Descriptor,
272 IN ISubdevice *SubDevice);
273
274 PDEVICE_OBJECT
275 GetDeviceObject(
276 IPortWaveCyclic* iface);
277
278 VOID
279 NTAPI
280 PcIoTimerRoutine(
281 IN PDEVICE_OBJECT DeviceObject,
282 IN PVOID Context);
283
284 NTSTATUS
285 NTAPI
286 NewIUnregisterSubdevice(
287 OUT PUNREGISTERSUBDEVICE *OutDevice);
288
289 NTSTATUS
290 NTAPI
291 NewIUnregisterPhysicalConnection(
292 OUT PUNREGISTERPHYSICALCONNECTION *OutConnection);
293
294 #define DEFINE_KSPROPERTY_PINPROPOSEDATAFORMAT(PinSet,\
295 PropGeneral, PropInstances, PropIntersection)\
296 DEFINE_KSPROPERTY_TABLE(PinSet) {\
297 DEFINE_KSPROPERTY_ITEM_PIN_CINSTANCES(PropInstances),\
298 DEFINE_KSPROPERTY_ITEM_PIN_CTYPES(PropGeneral),\
299 DEFINE_KSPROPERTY_ITEM_PIN_DATAFLOW(PropGeneral),\
300 DEFINE_KSPROPERTY_ITEM_PIN_DATARANGES(PropGeneral),\
301 DEFINE_KSPROPERTY_ITEM_PIN_DATAINTERSECTION(PropIntersection),\
302 DEFINE_KSPROPERTY_ITEM_PIN_INTERFACES(PropGeneral),\
303 DEFINE_KSPROPERTY_ITEM_PIN_MEDIUMS(PropGeneral),\
304 DEFINE_KSPROPERTY_ITEM_PIN_COMMUNICATION(PropGeneral),\
305 DEFINE_KSPROPERTY_ITEM_PIN_GLOBALCINSTANCES(PropGeneral),\
306 DEFINE_KSPROPERTY_ITEM_PIN_NECESSARYINSTANCES(PropGeneral),\
307 DEFINE_KSPROPERTY_ITEM_PIN_PHYSICALCONNECTION(PropGeneral),\
308 DEFINE_KSPROPERTY_ITEM_PIN_CATEGORY(PropGeneral),\
309 DEFINE_KSPROPERTY_ITEM_PIN_NAME(PropGeneral),\
310 DEFINE_KSPROPERTY_ITEM_PIN_CONSTRAINEDDATARANGES(PropGeneral),\
311 DEFINE_KSPROPERTY_ITEM_PIN_PROPOSEDATAFORMAT(PropGeneral)\
312 }
313
314 typedef struct
315 {
316 LIST_ENTRY Entry;
317 UNICODE_STRING SymbolicLink;
318 }SYMBOLICLINK_ENTRY, *PSYMBOLICLINK_ENTRY;
319
320
321 typedef struct
322 {
323 LIST_ENTRY Entry;
324 ISubdevice *SubDevice;
325 UNICODE_STRING Name;
326 LIST_ENTRY SymbolicLinkList;
327 }SUBDEVICE_ENTRY, *PSUBDEVICE_ENTRY;
328
329 typedef struct
330 {
331 LIST_ENTRY Entry;
332 ISubdevice * FromSubDevice;
333 UNICODE_STRING FromUnicodeString;
334 ULONG FromPin;
335 ISubdevice * ToSubDevice;
336 UNICODE_STRING ToUnicodeString;
337 ULONG ToPin;
338 }PHYSICAL_CONNECTION, *PPHYSICAL_CONNECTION;
339
340 typedef struct
341 {
342 KSDEVICE_HEADER KsDeviceHeader;
343 PDEVICE_OBJECT PhysicalDeviceObject;
344 PDEVICE_OBJECT PrevDeviceObject;
345 PCPFNSTARTDEVICE StartDevice;
346 ULONG_PTR Unused[4];
347 IAdapterPowerManagement * AdapterPowerManagement;
348 ULONG MaxSubDevices;
349 KSOBJECT_CREATE_ITEM * CreateItems;
350
351 IResourceList* resources;
352 LIST_ENTRY SubDeviceList;
353 LIST_ENTRY PhysicalConnectionList;
354
355 LIST_ENTRY TimerList;
356 KSPIN_LOCK TimerListLock;
357
358 } PCLASS_DEVICE_EXTENSION, *PPCLASS_DEVICE_EXTENSION;
359
360
361 typedef struct
362 {
363 KSSTREAM_HEADER Header;
364 PIRP Irp;
365 }CONTEXT_WRITE, *PCONTEXT_WRITE;
366
367 typedef struct
368 {
369 PVOID Pin;
370 PIO_WORKITEM WorkItem;
371 PIRP Irp;
372 }CLOSESTREAM_CONTEXT, *PCLOSESTREAM_CONTEXT;
373
374 typedef struct
375 {
376 LIST_ENTRY Entry;
377 PIO_TIMER_ROUTINE pTimerRoutine;
378 PVOID Context;
379 }TIMER_CONTEXT, *PTIMER_CONTEXT;
380
381 #endif