2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Kernel Streaming
4 * FILE: drivers/wdm/audio/backpln/portcls/filter_wavert.c
5 * PURPOSE: portcls wave RT filter
6 * PROGRAMMER: Johannes Anderwald
13 IPortFilterWaveRTVtbl
*lpVtbl
;
18 IPortPinWaveRT
** Pins
;
19 SUBDEVICE_DESCRIPTOR
* Descriptor
;
21 }IPortFilterWaveRTImpl
;
28 IPortFilterWaveRT_fnQueryInterface(
29 IPortFilterWaveRT
* iface
,
33 IPortFilterWaveRTImpl
* This
= (IPortFilterWaveRTImpl
*)iface
;
35 if (IsEqualGUIDAligned(refiid
, &IID_IIrpTarget
) ||
36 IsEqualGUIDAligned(refiid
, &IID_IUnknown
))
38 *Output
= &This
->lpVtbl
;
39 InterlockedIncrement(&This
->ref
);
40 return STATUS_SUCCESS
;
42 else if (IsEqualGUIDAligned(refiid
, &IID_IPort
))
45 This
->Port
->lpVtbl
->AddRef(This
->Port
);
46 return STATUS_SUCCESS
;
50 return STATUS_UNSUCCESSFUL
;
58 IPortFilterWaveRT_fnAddRef(
59 IPortFilterWaveRT
* iface
)
61 IPortFilterWaveRTImpl
* This
= (IPortFilterWaveRTImpl
*)iface
;
63 return InterlockedIncrement(&This
->ref
);
71 IPortFilterWaveRT_fnRelease(
72 IPortFilterWaveRT
* iface
)
74 IPortFilterWaveRTImpl
* This
= (IPortFilterWaveRTImpl
*)iface
;
76 InterlockedDecrement(&This
->ref
);
80 FreeItem(This
, TAG_PORTCLASS
);
91 IPortFilterWaveRT_fnNewIrpTarget(
92 IN IPortFilterWaveRT
* iface
,
93 OUT
struct IIrpTarget
**OutTarget
,
96 IN POOL_TYPE PoolType
,
97 IN PDEVICE_OBJECT DeviceObject
,
99 IN KSOBJECT_CREATE
*CreateObject
)
102 IPortPinWaveRT
* Pin
;
103 PKSPIN_CONNECT ConnectDetails
;
104 IPortFilterWaveRTImpl
* This
= (IPortFilterWaveRTImpl
*)iface
;
107 ASSERT(This
->Descriptor
);
110 DPRINT("IPortFilterWaveRT_fnNewIrpTarget entered\n");
112 /* let's verify the connection request */
113 Status
= PcValidateConnectRequest(Irp
, &This
->Descriptor
->Factory
, &ConnectDetails
);
114 if (!NT_SUCCESS(Status
))
116 return STATUS_UNSUCCESSFUL
;
119 if (This
->Pins
[ConnectDetails
->PinId
] && This
->Descriptor
->Factory
.Instances
[ConnectDetails
->PinId
].CurrentPinInstanceCount
)
121 /* release existing instance */
123 This
->Pins
[ConnectDetails
->PinId
]->lpVtbl
->Close(This
->Pins
[ConnectDetails
->PinId
], DeviceObject
, NULL
);
126 /* now create the pin */
127 Status
= NewPortPinWaveRT(&Pin
);
128 if (!NT_SUCCESS(Status
))
133 /* initialize the pin */
134 Status
= Pin
->lpVtbl
->Init(Pin
, This
->Port
, iface
, ConnectDetails
, &This
->Descriptor
->Factory
.KsPinDescriptor
[ConnectDetails
->PinId
], GetDeviceObjectFromPortWaveRT(This
->Port
));
135 if (!NT_SUCCESS(Status
))
137 Pin
->lpVtbl
->Release(Pin
);
141 /* release existing pin */
142 if (This
->Pins
[ConnectDetails
->PinId
])
144 This
->Pins
[ConnectDetails
->PinId
]->lpVtbl
->Release(This
->Pins
[ConnectDetails
->PinId
]);
147 This
->Pins
[ConnectDetails
->PinId
] = Pin
;
150 *OutTarget
= (IIrpTarget
*)Pin
;
152 /* increment current instance count */
153 This
->Descriptor
->Factory
.Instances
[ConnectDetails
->PinId
].CurrentPinInstanceCount
++;
163 IPortFilterWaveRT_fnDeviceIoControl(
164 IN IPortFilterWaveRT
* iface
,
165 IN PDEVICE_OBJECT DeviceObject
,
168 PIO_STACK_LOCATION IoStack
;
169 ISubdevice
*SubDevice
= NULL
;
170 SUBDEVICE_DESCRIPTOR
* Descriptor
;
172 IPortFilterWaveRTImpl
* This
= (IPortFilterWaveRTImpl
*)iface
;
174 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
175 ASSERT(IoStack
->Parameters
.DeviceIoControl
.IoControlCode
== IOCTL_KS_PROPERTY
);
176 Status
= This
->Port
->lpVtbl
->QueryInterface(This
->Port
, &IID_ISubdevice
, (PVOID
*)&SubDevice
);
177 ASSERT(Status
== STATUS_SUCCESS
);
178 ASSERT(SubDevice
!= NULL
);
180 Status
= SubDevice
->lpVtbl
->GetDescriptor(SubDevice
, &Descriptor
);
181 ASSERT(Status
== STATUS_SUCCESS
);
182 ASSERT(Descriptor
!= NULL
);
184 SubDevice
->lpVtbl
->Release(SubDevice
);
186 return PcPropertyHandler(Irp
, Descriptor
);
194 IPortFilterWaveRT_fnRead(
195 IN IPortFilterWaveRT
* iface
,
196 IN PDEVICE_OBJECT DeviceObject
,
199 return KsDispatchInvalidDeviceRequest(DeviceObject
, Irp
);
207 IPortFilterWaveRT_fnWrite(
208 IN IPortFilterWaveRT
* iface
,
209 IN PDEVICE_OBJECT DeviceObject
,
212 return KsDispatchInvalidDeviceRequest(DeviceObject
, Irp
);
220 IPortFilterWaveRT_fnFlush(
221 IN IPortFilterWaveRT
* iface
,
222 IN PDEVICE_OBJECT DeviceObject
,
225 return KsDispatchInvalidDeviceRequest(DeviceObject
, Irp
);
233 IPortFilterWaveRT_fnClose(
234 IN IPortFilterWaveRT
* iface
,
235 IN PDEVICE_OBJECT DeviceObject
,
239 IPortFilterWaveRTImpl
* This
= (IPortFilterWaveRTImpl
*)iface
;
241 for(Index
= 0; Index
< This
->Descriptor
->Factory
.PinDescriptorCount
; Index
++)
243 if (This
->Pins
[Index
])
245 This
->Pins
[Index
]->lpVtbl
->Close(This
->Pins
[Index
], DeviceObject
, NULL
);
250 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
251 Irp
->IoStatus
.Information
= 0;
252 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
254 return STATUS_UNSUCCESSFUL
;
262 IPortFilterWaveRT_fnQuerySecurity(
263 IN IPortFilterWaveRT
* iface
,
264 IN PDEVICE_OBJECT DeviceObject
,
267 return KsDispatchInvalidDeviceRequest(DeviceObject
, Irp
);
275 IPortFilterWaveRT_fnSetSecurity(
276 IN IPortFilterWaveRT
* iface
,
277 IN PDEVICE_OBJECT DeviceObject
,
280 return KsDispatchInvalidDeviceRequest(DeviceObject
, Irp
);
288 IPortFilterWaveRT_fnFastDeviceIoControl(
289 IN IPortFilterWaveRT
* iface
,
290 IN PFILE_OBJECT FileObject
,
292 IN PVOID InputBuffer
,
293 IN ULONG InputBufferLength
,
294 OUT PVOID OutputBuffer
,
295 IN ULONG OutputBufferLength
,
296 IN ULONG IoControlCode
,
297 OUT PIO_STATUS_BLOCK StatusBlock
,
298 IN PDEVICE_OBJECT DeviceObject
)
301 PKSPROPERTY Property
;
303 ISubdevice
* SubDevice
= NULL
;
304 PSUBDEVICE_DESCRIPTOR Descriptor
= NULL
;
305 IPortFilterWaveRTImpl
* This
= (IPortFilterWaveRTImpl
*)iface
;
307 Property
= (PKSPROPERTY
)InputBuffer
;
309 if (InputBufferLength
< sizeof(KSPROPERTY
))
313 /* get private interface */
314 Status
= This
->Port
->lpVtbl
->QueryInterface(This
->Port
, &IID_ISubdevice
, (PVOID
*)&SubDevice
);
315 if (!NT_SUCCESS(Status
))
319 Status
= SubDevice
->lpVtbl
->GetDescriptor(SubDevice
, &Descriptor
);
320 if (!NT_SUCCESS(Status
))
322 SubDevice
->lpVtbl
->Release(SubDevice
);
326 for(Index
= 0; Index
< Descriptor
->FilterPropertySet
.FreeKsPropertySetOffset
; Index
++)
328 if (IsEqualGUIDAligned(&Property
->Set
, Descriptor
->FilterPropertySet
.Properties
[Index
].Set
))
330 FastPropertyHandler(FileObject
, (PKSPROPERTY
)InputBuffer
, InputBufferLength
, OutputBuffer
, OutputBufferLength
, StatusBlock
,
332 &Descriptor
->FilterPropertySet
.Properties
[Index
],
333 Descriptor
, SubDevice
);
344 IPortFilterWaveRT_fnFastRead(
345 IN IPortFilterWaveRT
* iface
,
346 IN PFILE_OBJECT FileObject
,
347 IN PLARGE_INTEGER FileOffset
,
352 OUT PIO_STATUS_BLOCK StatusBlock
,
353 IN PDEVICE_OBJECT DeviceObject
)
364 IPortFilterWaveRT_fnFastWrite(
365 IN IPortFilterWaveRT
* iface
,
366 IN PFILE_OBJECT FileObject
,
367 IN PLARGE_INTEGER FileOffset
,
372 OUT PIO_STATUS_BLOCK StatusBlock
,
373 IN PDEVICE_OBJECT DeviceObject
)
385 IPortFilterWaveRT_fnInit(
386 IN IPortFilterWaveRT
* iface
,
387 IN IPortWaveRT
* Port
)
389 ISubdevice
* ISubDevice
;
390 SUBDEVICE_DESCRIPTOR
* Descriptor
;
392 IPortFilterWaveRTImpl
* This
= (IPortFilterWaveRTImpl
*)iface
;
396 /* get our private interface */
397 Status
= This
->Port
->lpVtbl
->QueryInterface(This
->Port
, &IID_ISubdevice
, (PVOID
*)&ISubDevice
);
398 if (!NT_SUCCESS(Status
))
399 return STATUS_UNSUCCESSFUL
;
401 /* get the subdevice descriptor */
402 Status
= ISubDevice
->lpVtbl
->GetDescriptor(ISubDevice
, &Descriptor
);
404 /* release subdevice interface */
405 ISubDevice
->lpVtbl
->Release(ISubDevice
);
407 if (!NT_SUCCESS(Status
))
408 return STATUS_UNSUCCESSFUL
;
410 /* save descriptor */
411 This
->Descriptor
= Descriptor
;
413 /* allocate pin array */
414 This
->Pins
= AllocateItem(NonPagedPool
, Descriptor
->Factory
.PinDescriptorCount
* sizeof(IPortPinWaveRT
*), TAG_PORTCLASS
);
417 return STATUS_UNSUCCESSFUL
;
419 /* increment reference count */
420 Port
->lpVtbl
->AddRef(Port
);
422 return STATUS_SUCCESS
;
425 static IPortFilterWaveRTVtbl vt_IPortFilterWaveRT
=
427 IPortFilterWaveRT_fnQueryInterface
,
428 IPortFilterWaveRT_fnAddRef
,
429 IPortFilterWaveRT_fnRelease
,
430 IPortFilterWaveRT_fnNewIrpTarget
,
431 IPortFilterWaveRT_fnDeviceIoControl
,
432 IPortFilterWaveRT_fnRead
,
433 IPortFilterWaveRT_fnWrite
,
434 IPortFilterWaveRT_fnFlush
,
435 IPortFilterWaveRT_fnClose
,
436 IPortFilterWaveRT_fnQuerySecurity
,
437 IPortFilterWaveRT_fnSetSecurity
,
438 IPortFilterWaveRT_fnFastDeviceIoControl
,
439 IPortFilterWaveRT_fnFastRead
,
440 IPortFilterWaveRT_fnFastWrite
,
441 IPortFilterWaveRT_fnInit
446 OUT IPortFilterWaveRT
** OutFilter
)
448 IPortFilterWaveRTImpl
* This
;
450 This
= AllocateItem(NonPagedPool
, sizeof(IPortFilterWaveRTImpl
), TAG_PORTCLASS
);
452 return STATUS_INSUFFICIENT_RESOURCES
;
454 /* initialize IPortFilterWaveRT */
456 This
->lpVtbl
= &vt_IPortFilterWaveRT
;
459 *OutFilter
= (IPortFilterWaveRT
*)&This
->lpVtbl
;
461 return STATUS_SUCCESS
;