2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Kernel Streaming
4 * FILE: drivers/wdm/audio/backpln/portcls/filter_wavecyclic.c
5 * PURPOSE: portcls wave cyclic filter
6 * PROGRAMMER: Johannes Anderwald
13 IPortFilterWaveCyclicVtbl
*lpVtbl
;
17 IPortWaveCyclic
* Port
;
18 IPortPinWaveCyclic
** Pins
;
19 SUBDEVICE_DESCRIPTOR
* Descriptor
;
20 ISubdevice
* SubDevice
;
22 }IPortFilterWaveCyclicImpl
;
29 IPortFilterWaveCyclic_fnQueryInterface(
30 IPortFilterWaveCyclic
* iface
,
34 IPortFilterWaveCyclicImpl
* This
= (IPortFilterWaveCyclicImpl
*)iface
;
36 if (IsEqualGUIDAligned(refiid
, &IID_IIrpTarget
) ||
37 IsEqualGUIDAligned(refiid
, &IID_IUnknown
))
39 *Output
= &This
->lpVtbl
;
40 InterlockedIncrement(&This
->ref
);
41 return STATUS_SUCCESS
;
43 else if (IsEqualGUIDAligned(refiid
, &IID_IPort
))
46 This
->Port
->lpVtbl
->AddRef(This
->Port
);
47 return STATUS_SUCCESS
;
51 return STATUS_UNSUCCESSFUL
;
59 IPortFilterWaveCyclic_fnAddRef(
60 IPortFilterWaveCyclic
* iface
)
62 IPortFilterWaveCyclicImpl
* This
= (IPortFilterWaveCyclicImpl
*)iface
;
64 return InterlockedIncrement(&This
->ref
);
72 IPortFilterWaveCyclic_fnRelease(
73 IPortFilterWaveCyclic
* iface
)
75 IPortFilterWaveCyclicImpl
* This
= (IPortFilterWaveCyclicImpl
*)iface
;
77 InterlockedDecrement(&This
->ref
);
81 FreeItem(This
, TAG_PORTCLASS
);
92 IPortFilterWaveCyclic_fnNewIrpTarget(
93 IN IPortFilterWaveCyclic
* iface
,
94 OUT
struct IIrpTarget
**OutTarget
,
97 IN POOL_TYPE PoolType
,
98 IN PDEVICE_OBJECT DeviceObject
,
100 IN KSOBJECT_CREATE
*CreateObject
)
103 IPortPinWaveCyclic
* Pin
;
104 PKSPIN_CONNECT ConnectDetails
;
105 IPortFilterWaveCyclicImpl
* This
= (IPortFilterWaveCyclicImpl
*)iface
;
108 ASSERT(This
->Descriptor
);
111 DPRINT("IPortFilterWaveCyclic_fnNewIrpTarget entered\n");
113 /* let's verify the connection request */
114 Status
= PcValidateConnectRequest(Irp
, &This
->Descriptor
->Factory
, &ConnectDetails
);
115 if (!NT_SUCCESS(Status
))
117 return STATUS_UNSUCCESSFUL
;
120 if (This
->Pins
[ConnectDetails
->PinId
] &&
121 (This
->Descriptor
->Factory
.Instances
[ConnectDetails
->PinId
].CurrentPinInstanceCount
== This
->Descriptor
->Factory
.Instances
[ConnectDetails
->PinId
].MaxFilterInstanceCount
))
123 /* release existing instance */
124 return STATUS_UNSUCCESSFUL
;
127 /* now create the pin */
128 Status
= NewPortPinWaveCyclic(&Pin
);
129 if (!NT_SUCCESS(Status
))
134 /* initialize the pin */
135 Status
= Pin
->lpVtbl
->Init(Pin
, This
->Port
, iface
, ConnectDetails
, &This
->Descriptor
->Factory
.KsPinDescriptor
[ConnectDetails
->PinId
]);
136 if (!NT_SUCCESS(Status
))
138 Pin
->lpVtbl
->Release(Pin
);
143 This
->Pins
[ConnectDetails
->PinId
] = Pin
;
146 *OutTarget
= (IIrpTarget
*)Pin
;
148 /* increment current instance count */
149 This
->Descriptor
->Factory
.Instances
[ConnectDetails
->PinId
].CurrentPinInstanceCount
++;
159 IPortFilterWaveCyclic_fnDeviceIoControl(
160 IN IPortFilterWaveCyclic
* iface
,
161 IN PDEVICE_OBJECT DeviceObject
,
164 PIO_STACK_LOCATION IoStack
;
165 IPortFilterWaveCyclicImpl
* This
= (IPortFilterWaveCyclicImpl
*)iface
;
167 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
169 if (IoStack
->Parameters
.DeviceIoControl
.IoControlCode
!= IOCTL_KS_PROPERTY
)
171 DPRINT1("Unhandled function %lx Length %x\n", IoStack
->Parameters
.DeviceIoControl
.IoControlCode
, IoStack
->Parameters
.DeviceIoControl
.InputBufferLength
);
173 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
175 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
176 return STATUS_SUCCESS
;
180 ASSERT(IoStack
->Parameters
.DeviceIoControl
.IoControlCode
== IOCTL_KS_PROPERTY
);
182 return PcPropertyHandler(Irp
, This
->Descriptor
);
190 IPortFilterWaveCyclic_fnRead(
191 IN IPortFilterWaveCyclic
* iface
,
192 IN PDEVICE_OBJECT DeviceObject
,
195 return KsDispatchInvalidDeviceRequest(DeviceObject
, Irp
);
203 IPortFilterWaveCyclic_fnWrite(
204 IN IPortFilterWaveCyclic
* iface
,
205 IN PDEVICE_OBJECT DeviceObject
,
208 return KsDispatchInvalidDeviceRequest(DeviceObject
, Irp
);
216 IPortFilterWaveCyclic_fnFlush(
217 IN IPortFilterWaveCyclic
* iface
,
218 IN PDEVICE_OBJECT DeviceObject
,
221 return KsDispatchInvalidDeviceRequest(DeviceObject
, Irp
);
229 IPortFilterWaveCyclic_fnClose(
230 IN IPortFilterWaveCyclic
* iface
,
231 IN PDEVICE_OBJECT DeviceObject
,
235 NTSTATUS Status
= STATUS_SUCCESS
;
236 IPortFilterWaveCyclicImpl
* This
= (IPortFilterWaveCyclicImpl
*)iface
;
238 for(Index
= 0; Index
< This
->Descriptor
->Factory
.PinDescriptorCount
; Index
++)
240 /* all pins should have been closed by now */
241 ASSERT(This
->Pins
[Index
] == NULL
);
244 DPRINT("IPortFilterWaveCyclic_fnClose ref %u\n", This
->ref
);
248 /* release reference to port */
249 This
->SubDevice
->lpVtbl
->Release(This
->SubDevice
);
251 /* time to shutdown the audio system */
252 Status
= This
->SubDevice
->lpVtbl
->ReleaseChildren(This
->SubDevice
);
255 Irp
->IoStatus
.Status
= Status
;
256 Irp
->IoStatus
.Information
= 0;
257 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
259 return STATUS_SUCCESS
;
267 IPortFilterWaveCyclic_fnQuerySecurity(
268 IN IPortFilterWaveCyclic
* iface
,
269 IN PDEVICE_OBJECT DeviceObject
,
272 return KsDispatchInvalidDeviceRequest(DeviceObject
, Irp
);
280 IPortFilterWaveCyclic_fnSetSecurity(
281 IN IPortFilterWaveCyclic
* iface
,
282 IN PDEVICE_OBJECT DeviceObject
,
285 return KsDispatchInvalidDeviceRequest(DeviceObject
, Irp
);
293 IPortFilterWaveCyclic_fnFastDeviceIoControl(
294 IN IPortFilterWaveCyclic
* iface
,
295 IN PFILE_OBJECT FileObject
,
297 IN PVOID InputBuffer
,
298 IN ULONG InputBufferLength
,
299 OUT PVOID OutputBuffer
,
300 IN ULONG OutputBufferLength
,
301 IN ULONG IoControlCode
,
302 OUT PIO_STATUS_BLOCK StatusBlock
,
303 IN PDEVICE_OBJECT DeviceObject
)
314 IPortFilterWaveCyclic_fnFastRead(
315 IN IPortFilterWaveCyclic
* iface
,
316 IN PFILE_OBJECT FileObject
,
317 IN PLARGE_INTEGER FileOffset
,
322 OUT PIO_STATUS_BLOCK StatusBlock
,
323 IN PDEVICE_OBJECT DeviceObject
)
334 IPortFilterWaveCyclic_fnFastWrite(
335 IN IPortFilterWaveCyclic
* iface
,
336 IN PFILE_OBJECT FileObject
,
337 IN PLARGE_INTEGER FileOffset
,
342 OUT PIO_STATUS_BLOCK StatusBlock
,
343 IN PDEVICE_OBJECT DeviceObject
)
355 IPortFilterWaveCyclic_fnInit(
356 IN IPortFilterWaveCyclic
* iface
,
357 IN IPortWaveCyclic
* Port
)
359 ISubdevice
* ISubDevice
;
360 SUBDEVICE_DESCRIPTOR
* Descriptor
;
362 IPortFilterWaveCyclicImpl
* This
= (IPortFilterWaveCyclicImpl
*)iface
;
364 /* get our private interface */
365 Status
= Port
->lpVtbl
->QueryInterface(Port
, &IID_ISubdevice
, (PVOID
*)&ISubDevice
);
366 if (!NT_SUCCESS(Status
))
367 return STATUS_UNSUCCESSFUL
;
369 /* get the subdevice descriptor */
370 Status
= ISubDevice
->lpVtbl
->GetDescriptor(ISubDevice
, &Descriptor
);
372 /* store subdevice interface */
373 This
->SubDevice
= ISubDevice
;
375 if (!NT_SUCCESS(Status
))
376 return STATUS_UNSUCCESSFUL
;
378 /* save descriptor */
379 This
->Descriptor
= Descriptor
;
381 /* allocate pin array */
382 This
->Pins
= AllocateItem(NonPagedPool
, Descriptor
->Factory
.PinDescriptorCount
* sizeof(IPortPinWaveCyclic
*), TAG_PORTCLASS
);
385 return STATUS_UNSUCCESSFUL
;
387 /* store port driver */
390 return STATUS_SUCCESS
;
397 IPortFilterWaveCyclic_fnFreePin(
398 IN IPortFilterWaveCyclic
* iface
,
399 IN
struct IPortPinWaveCyclic
* Pin
)
402 IPortFilterWaveCyclicImpl
* This
= (IPortFilterWaveCyclicImpl
*)iface
;
404 for(Index
= 0; Index
< This
->Descriptor
->Factory
.PinDescriptorCount
; Index
++)
406 if (This
->Pins
[Index
] == Pin
)
408 This
->Descriptor
->Factory
.Instances
[Index
].CurrentPinInstanceCount
--;
409 This
->Pins
[Index
]->lpVtbl
->Release(This
->Pins
[Index
]);
410 This
->Pins
[Index
] = NULL
;
411 return STATUS_SUCCESS
;
414 return STATUS_UNSUCCESSFUL
;
417 static IPortFilterWaveCyclicVtbl vt_IPortFilterWaveCyclic
=
419 IPortFilterWaveCyclic_fnQueryInterface
,
420 IPortFilterWaveCyclic_fnAddRef
,
421 IPortFilterWaveCyclic_fnRelease
,
422 IPortFilterWaveCyclic_fnNewIrpTarget
,
423 IPortFilterWaveCyclic_fnDeviceIoControl
,
424 IPortFilterWaveCyclic_fnRead
,
425 IPortFilterWaveCyclic_fnWrite
,
426 IPortFilterWaveCyclic_fnFlush
,
427 IPortFilterWaveCyclic_fnClose
,
428 IPortFilterWaveCyclic_fnQuerySecurity
,
429 IPortFilterWaveCyclic_fnSetSecurity
,
430 IPortFilterWaveCyclic_fnFastDeviceIoControl
,
431 IPortFilterWaveCyclic_fnFastRead
,
432 IPortFilterWaveCyclic_fnFastWrite
,
433 IPortFilterWaveCyclic_fnInit
,
434 IPortFilterWaveCyclic_fnFreePin
438 NewPortFilterWaveCyclic(
439 OUT IPortFilterWaveCyclic
** OutFilter
)
441 IPortFilterWaveCyclicImpl
* This
;
443 This
= AllocateItem(NonPagedPool
, sizeof(IPortFilterWaveCyclicImpl
), TAG_PORTCLASS
);
445 return STATUS_INSUFFICIENT_RESOURCES
;
447 /* initialize IPortFilterWaveCyclic */
449 This
->lpVtbl
= &vt_IPortFilterWaveCyclic
;
452 *OutFilter
= (IPortFilterWaveCyclic
*)&This
->lpVtbl
;
454 return STATUS_SUCCESS
;