2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Kernel Streaming
4 * FILE: drivers/wdm/audio/backpln/portcls/filter_topology.c
5 * PURPOSE: portcls topology filter
6 * PROGRAMMER: Johannes Anderwald
13 IPortFilterTopologyVtbl
*lpVtbl
;
18 SUBDEVICE_DESCRIPTOR
* Descriptor
;
19 ISubdevice
*SubDevice
;
21 }IPortFilterTopologyImpl
;
28 IPortFilterTopology_fnQueryInterface(
29 IPortFilterTopology
* iface
,
33 IPortFilterTopologyImpl
* This
= (IPortFilterTopologyImpl
*)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
;
49 return STATUS_UNSUCCESSFUL
;
57 IPortFilterTopology_fnAddRef(
58 IPortFilterTopology
* iface
)
60 IPortFilterTopologyImpl
* This
= (IPortFilterTopologyImpl
*)iface
;
62 return InterlockedIncrement(&This
->ref
);
70 IPortFilterTopology_fnRelease(
71 IPortFilterTopology
* iface
)
73 IPortFilterTopologyImpl
* This
= (IPortFilterTopologyImpl
*)iface
;
75 InterlockedDecrement(&This
->ref
);
79 FreeItem(This
, TAG_PORTCLASS
);
90 IPortFilterTopology_fnNewIrpTarget(
91 IN IPortFilterTopology
* iface
,
92 OUT
struct IIrpTarget
**OutTarget
,
95 IN POOL_TYPE PoolType
,
96 IN PDEVICE_OBJECT DeviceObject
,
98 IN KSOBJECT_CREATE
*CreateObject
)
100 DPRINT("IPortFilterTopology_fnNewIrpTarget entered\n");
102 return STATUS_NOT_SUPPORTED
;
110 IPortFilterTopology_fnDeviceIoControl(
111 IN IPortFilterTopology
* iface
,
112 IN PDEVICE_OBJECT DeviceObject
,
115 PIO_STACK_LOCATION IoStack
;
116 IPortFilterTopologyImpl
* This
= (IPortFilterTopologyImpl
*)iface
;
118 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
119 ASSERT(IoStack
->Parameters
.DeviceIoControl
.IoControlCode
== IOCTL_KS_PROPERTY
);
121 return PcPropertyHandler(Irp
, This
->Descriptor
);
129 IPortFilterTopology_fnRead(
130 IN IPortFilterTopology
* iface
,
131 IN PDEVICE_OBJECT DeviceObject
,
134 return KsDispatchInvalidDeviceRequest(DeviceObject
, Irp
);
142 IPortFilterTopology_fnWrite(
143 IN IPortFilterTopology
* iface
,
144 IN PDEVICE_OBJECT DeviceObject
,
147 return KsDispatchInvalidDeviceRequest(DeviceObject
, Irp
);
155 IPortFilterTopology_fnFlush(
156 IN IPortFilterTopology
* iface
,
157 IN PDEVICE_OBJECT DeviceObject
,
160 return KsDispatchInvalidDeviceRequest(DeviceObject
, Irp
);
168 IPortFilterTopology_fnClose(
169 IN IPortFilterTopology
* iface
,
170 IN PDEVICE_OBJECT DeviceObject
,
173 NTSTATUS Status
= STATUS_SUCCESS
;
174 IPortFilterTopologyImpl
* This
= (IPortFilterTopologyImpl
*)iface
;
176 /* FIXME handle DirectSound */
180 /* release reference to port */
181 This
->SubDevice
->lpVtbl
->Release(This
->SubDevice
);
183 /* time to shutdown the audio system */
184 Status
= This
->SubDevice
->lpVtbl
->ReleaseChildren(This
->SubDevice
);
187 Irp
->IoStatus
.Status
= Status
;
188 Irp
->IoStatus
.Information
= 0;
189 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
191 return STATUS_SUCCESS
;
199 IPortFilterTopology_fnQuerySecurity(
200 IN IPortFilterTopology
* iface
,
201 IN PDEVICE_OBJECT DeviceObject
,
204 return KsDispatchInvalidDeviceRequest(DeviceObject
, Irp
);
212 IPortFilterTopology_fnSetSecurity(
213 IN IPortFilterTopology
* iface
,
214 IN PDEVICE_OBJECT DeviceObject
,
217 return KsDispatchInvalidDeviceRequest(DeviceObject
, Irp
);
225 IPortFilterTopology_fnFastDeviceIoControl(
226 IN IPortFilterTopology
* iface
,
227 IN PFILE_OBJECT FileObject
,
229 IN PVOID InputBuffer
,
230 IN ULONG InputBufferLength
,
231 OUT PVOID OutputBuffer
,
232 IN ULONG OutputBufferLength
,
233 IN ULONG IoControlCode
,
234 OUT PIO_STATUS_BLOCK StatusBlock
,
235 IN PDEVICE_OBJECT DeviceObject
)
238 PKSPROPERTY Property
;
239 IPortFilterTopologyImpl
* This
= (IPortFilterTopologyImpl
*)iface
;
241 Property
= (PKSPROPERTY
)InputBuffer
;
243 if (InputBufferLength
< sizeof(KSPROPERTY
))
246 for(Index
= 0; Index
< This
->Descriptor
->FilterPropertySet
.FreeKsPropertySetOffset
; Index
++)
248 if (IsEqualGUIDAligned(&Property
->Set
, This
->Descriptor
->FilterPropertySet
.Properties
[Index
].Set
))
250 FastPropertyHandler(FileObject
, (PKSPROPERTY
)InputBuffer
, InputBufferLength
, OutputBuffer
, OutputBufferLength
, StatusBlock
,
252 &This
->Descriptor
->FilterPropertySet
.Properties
[Index
],
253 This
->Descriptor
, This
->SubDevice
);
264 IPortFilterTopology_fnFastRead(
265 IN IPortFilterTopology
* iface
,
266 IN PFILE_OBJECT FileObject
,
267 IN PLARGE_INTEGER FileOffset
,
272 OUT PIO_STATUS_BLOCK StatusBlock
,
273 IN PDEVICE_OBJECT DeviceObject
)
283 IPortFilterTopology_fnFastWrite(
284 IN IPortFilterTopology
* iface
,
285 IN PFILE_OBJECT FileObject
,
286 IN PLARGE_INTEGER FileOffset
,
291 OUT PIO_STATUS_BLOCK StatusBlock
,
292 IN PDEVICE_OBJECT DeviceObject
)
303 IPortFilterTopology_fnInit(
304 IN IPortFilterTopology
* iface
,
305 IN IPortTopology
* Port
)
307 ISubdevice
* ISubDevice
;
308 SUBDEVICE_DESCRIPTOR
* Descriptor
;
310 IPortFilterTopologyImpl
* This
= (IPortFilterTopologyImpl
*)iface
;
312 /* get our private interface */
313 Status
= Port
->lpVtbl
->QueryInterface(Port
, &IID_ISubdevice
, (PVOID
*)&ISubDevice
);
314 if (!NT_SUCCESS(Status
))
315 return STATUS_UNSUCCESSFUL
;
317 /* get the subdevice descriptor */
318 Status
= ISubDevice
->lpVtbl
->GetDescriptor(ISubDevice
, &Descriptor
);
320 /* store subdevice interface */
321 This
->SubDevice
= ISubDevice
;
323 if (!NT_SUCCESS(Status
))
324 return STATUS_UNSUCCESSFUL
;
326 /* save descriptor */
327 This
->Descriptor
= Descriptor
;
329 /* store port object */
332 return STATUS_SUCCESS
;
335 static IPortFilterTopologyVtbl vt_IPortFilterTopology
=
337 IPortFilterTopology_fnQueryInterface
,
338 IPortFilterTopology_fnAddRef
,
339 IPortFilterTopology_fnRelease
,
340 IPortFilterTopology_fnNewIrpTarget
,
341 IPortFilterTopology_fnDeviceIoControl
,
342 IPortFilterTopology_fnRead
,
343 IPortFilterTopology_fnWrite
,
344 IPortFilterTopology_fnFlush
,
345 IPortFilterTopology_fnClose
,
346 IPortFilterTopology_fnQuerySecurity
,
347 IPortFilterTopology_fnSetSecurity
,
348 IPortFilterTopology_fnFastDeviceIoControl
,
349 IPortFilterTopology_fnFastRead
,
350 IPortFilterTopology_fnFastWrite
,
351 IPortFilterTopology_fnInit
355 NewPortFilterTopology(
356 OUT IPortFilterTopology
** OutFilter
)
358 IPortFilterTopologyImpl
* This
;
360 This
= AllocateItem(NonPagedPool
, sizeof(IPortFilterTopologyImpl
), TAG_PORTCLASS
);
362 return STATUS_INSUFFICIENT_RESOURCES
;
364 /* initialize IPortFilterTopology */
366 This
->lpVtbl
= &vt_IPortFilterTopology
;
369 *OutFilter
= (IPortFilterTopology
*)&This
->lpVtbl
;
371 return STATUS_SUCCESS
;