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
11 class CPortFilterTopology
: public IPortFilterTopology
14 STDMETHODIMP
QueryInterface( REFIID InterfaceId
, PVOID
* Interface
);
16 STDMETHODIMP_(ULONG
) AddRef()
18 InterlockedIncrement(&m_Ref
);
21 STDMETHODIMP_(ULONG
) Release()
23 InterlockedDecrement(&m_Ref
);
32 IMP_IPortFilterTopology
;
33 CPortFilterTopology(IUnknown
*OuterUnknown
){}
34 virtual ~CPortFilterTopology(){}
37 IPortTopology
* m_Port
;
38 SUBDEVICE_DESCRIPTOR
* m_Descriptor
;
39 ISubdevice
* m_SubDevice
;
46 CPortFilterTopology::QueryInterface(
51 if (IsEqualGUIDAligned(refiid
, IID_IIrpTarget
) ||
52 IsEqualGUIDAligned(refiid
, IID_IUnknown
))
54 *Output
= PVOID(PUNKNOWN(this));
55 PUNKNOWN(*Output
)->AddRef();
56 return STATUS_SUCCESS
;
58 else if (IsEqualGUIDAligned(refiid
, IID_IPort
))
60 *Output
= PVOID(PUNKNOWN(m_Port
));
61 PUNKNOWN(*Output
)->AddRef();
62 return STATUS_SUCCESS
;
65 return STATUS_UNSUCCESSFUL
;
70 CPortFilterTopology::NewIrpTarget(
71 OUT
struct IIrpTarget
**OutTarget
,
74 IN POOL_TYPE PoolType
,
75 IN PDEVICE_OBJECT DeviceObject
,
77 IN KSOBJECT_CREATE
*CreateObject
)
79 DPRINT("CPortFilterTopology::NewIrpTarget entered\n");
81 return STATUS_NOT_SUPPORTED
;
87 CPortFilterTopology::DeviceIoControl(
88 IN PDEVICE_OBJECT DeviceObject
,
91 PIO_STACK_LOCATION IoStack
;
93 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
94 PC_ASSERT(IoStack
->Parameters
.DeviceIoControl
.IoControlCode
== IOCTL_KS_PROPERTY
);
96 return PcPropertyHandler(Irp
, m_Descriptor
);
101 CPortFilterTopology::Read(
102 IN PDEVICE_OBJECT DeviceObject
,
105 return KsDispatchInvalidDeviceRequest(DeviceObject
, Irp
);
110 CPortFilterTopology::Write(
111 IN PDEVICE_OBJECT DeviceObject
,
114 return KsDispatchInvalidDeviceRequest(DeviceObject
, Irp
);
119 CPortFilterTopology::Flush(
120 IN PDEVICE_OBJECT DeviceObject
,
123 return KsDispatchInvalidDeviceRequest(DeviceObject
, Irp
);
128 CPortFilterTopology::Close(
129 IN PDEVICE_OBJECT DeviceObject
,
132 NTSTATUS Status
= STATUS_SUCCESS
;
134 // FIXME handle DirectSound
140 // release reference to port
141 This
->SubDevice
->lpVtbl
->Release(This
->SubDevice
);
143 // time to shutdown the audio system
144 Status
= This
->SubDevice
->lpVtbl
->ReleaseChildren(This
->SubDevice
);
148 Irp
->IoStatus
.Status
= Status
;
149 Irp
->IoStatus
.Information
= 0;
150 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
152 return STATUS_SUCCESS
;
157 CPortFilterTopology::QuerySecurity(
158 IN PDEVICE_OBJECT DeviceObject
,
161 return KsDispatchInvalidDeviceRequest(DeviceObject
, Irp
);
166 CPortFilterTopology::SetSecurity(
167 IN PDEVICE_OBJECT DeviceObject
,
170 return KsDispatchInvalidDeviceRequest(DeviceObject
, Irp
);
175 CPortFilterTopology::FastDeviceIoControl(
176 IN PFILE_OBJECT FileObject
,
178 IN PVOID InputBuffer
,
179 IN ULONG InputBufferLength
,
180 OUT PVOID OutputBuffer
,
181 IN ULONG OutputBufferLength
,
182 IN ULONG IoControlCode
,
183 OUT PIO_STATUS_BLOCK StatusBlock
,
184 IN PDEVICE_OBJECT DeviceObject
)
191 CPortFilterTopology::FastRead(
192 IN PFILE_OBJECT FileObject
,
193 IN PLARGE_INTEGER FileOffset
,
198 OUT PIO_STATUS_BLOCK StatusBlock
,
199 IN PDEVICE_OBJECT DeviceObject
)
206 CPortFilterTopology::FastWrite(
207 IN PFILE_OBJECT FileObject
,
208 IN PLARGE_INTEGER FileOffset
,
213 OUT PIO_STATUS_BLOCK StatusBlock
,
214 IN PDEVICE_OBJECT DeviceObject
)
221 CPortFilterTopology::Init(
222 IN IPortTopology
* Port
)
224 ISubdevice
* ISubDevice
;
225 SUBDEVICE_DESCRIPTOR
* Descriptor
;
229 // get our private interface
230 Status
= Port
->QueryInterface(IID_ISubdevice
, (PVOID
*)&ISubDevice
);
231 if (!NT_SUCCESS(Status
))
232 return STATUS_UNSUCCESSFUL
;
234 // get the subdevice descriptor
235 Status
= ISubDevice
->GetDescriptor(&Descriptor
);
237 // store subdevice interface
238 m_SubDevice
= ISubDevice
;
240 if (!NT_SUCCESS(Status
))
241 return STATUS_UNSUCCESSFUL
;
244 m_Descriptor
= Descriptor
;
249 return STATUS_SUCCESS
;
253 NewPortFilterTopology(
254 OUT IPortFilterTopology
** OutFilter
)
256 CPortFilterTopology
* This
;
258 This
= new(NonPagedPool
, TAG_PORTCLASS
)CPortFilterTopology(NULL
);
260 return STATUS_INSUFFICIENT_RESOURCES
;
265 *OutFilter
= (CPortFilterTopology
*)This
;
267 return STATUS_SUCCESS
;