2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Kernel Streaming
4 * FILE: drivers/wdm/audio/backpln/portcls/filter_wavepci.cpp
5 * PURPOSE: portcls wave pci filter
6 * PROGRAMMER: Johannes Anderwald
11 class CPortFilterWavePci
: public IPortFilterWavePci
14 STDMETHODIMP
QueryInterface( REFIID InterfaceId
, PVOID
* Interface
);
16 STDMETHODIMP_(ULONG
) AddRef()
18 InterlockedIncrement(&m_Ref
);
21 STDMETHODIMP_(ULONG
) Release()
23 InterlockedDecrement(&m_Ref
);
33 CPortFilterWavePci(IUnknown
*OuterUnknown
){}
34 virtual ~CPortFilterWavePci(){}
38 IPortPinWavePci
** m_Pins
;
39 SUBDEVICE_DESCRIPTOR
* m_Descriptor
;
46 CPortFilterWavePci::QueryInterface(
52 if (IsEqualGUIDAligned(refiid
, IID_IIrpTarget
) ||
53 IsEqualGUIDAligned(refiid
, IID_IUnknown
))
55 *Output
= PVOID(PUNKNOWN(this));
56 PUNKNOWN(*Output
)->AddRef();
57 return STATUS_SUCCESS
;
59 else if (IsEqualGUIDAligned(refiid
, IID_IPort
))
61 *Output
= PUNKNOWN(m_Port
);
62 PUNKNOWN(*Output
)->AddRef();
63 return STATUS_SUCCESS
;
66 return STATUS_UNSUCCESSFUL
;
71 CPortFilterWavePci::NewIrpTarget(
72 OUT
struct IIrpTarget
**OutTarget
,
75 IN POOL_TYPE PoolType
,
76 IN PDEVICE_OBJECT DeviceObject
,
78 IN KSOBJECT_CREATE
*CreateObject
)
81 IPortPinWavePci
* Pin
;
82 PKSPIN_CONNECT ConnectDetails
;
90 DPRINT("CPortFilterWavePci::NewIrpTarget entered\n");
92 // let's verify the connection request
93 Status
= PcValidateConnectRequest(Irp
, &m_Descriptor
->Factory
, &ConnectDetails
);
94 if (!NT_SUCCESS(Status
))
96 return STATUS_UNSUCCESSFUL
;
99 if (m_Pins
[ConnectDetails
->PinId
] &&
100 (m_Descriptor
->Factory
.Instances
[ConnectDetails
->PinId
].CurrentPinInstanceCount
== m_Descriptor
->Factory
.Instances
[ConnectDetails
->PinId
].MaxFilterInstanceCount
))
102 // no available instance
103 return STATUS_UNSUCCESSFUL
;
107 // now create the pin
108 Status
= NewPortPinWavePci(&Pin
);
109 if (!NT_SUCCESS(Status
))
114 // initialize the pin
115 Status
= Pin
->Init(m_Port
, this, ConnectDetails
, &m_Descriptor
->Factory
.KsPinDescriptor
[ConnectDetails
->PinId
], GetDeviceObjectFromPortWavePci(m_Port
));
116 if (!NT_SUCCESS(Status
))
123 m_Pins
[ConnectDetails
->PinId
] = Pin
;
126 *OutTarget
= (IIrpTarget
*)Pin
;
128 // increment current instance count
129 m_Descriptor
->Factory
.Instances
[ConnectDetails
->PinId
].CurrentPinInstanceCount
++;
136 CPortFilterWavePci::DeviceIoControl(
137 IN PDEVICE_OBJECT DeviceObject
,
140 PIO_STACK_LOCATION IoStack
;
143 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
145 if (IoStack
->Parameters
.DeviceIoControl
.IoControlCode
!= IOCTL_KS_PROPERTY
)
147 DPRINT("Unhandled function %lx Length %x\n", IoStack
->Parameters
.DeviceIoControl
.IoControlCode
, IoStack
->Parameters
.DeviceIoControl
.InputBufferLength
);
149 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
151 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
152 return STATUS_SUCCESS
;
155 Status
= PcHandlePropertyWithTable(Irp
, m_Descriptor
->FilterPropertySetCount
, m_Descriptor
->FilterPropertySet
, m_Descriptor
);
156 if (Status
!= STATUS_PENDING
)
158 Irp
->IoStatus
.Status
= Status
;
159 DPRINT("Result %x Length %u\n", Status
, Irp
->IoStatus
.Information
);
160 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
167 CPortFilterWavePci::Read(
168 IN PDEVICE_OBJECT DeviceObject
,
171 return KsDispatchInvalidDeviceRequest(DeviceObject
, Irp
);
176 CPortFilterWavePci::Write(
177 IN PDEVICE_OBJECT DeviceObject
,
180 return KsDispatchInvalidDeviceRequest(DeviceObject
, Irp
);
185 CPortFilterWavePci::Flush(
186 IN PDEVICE_OBJECT DeviceObject
,
189 return KsDispatchInvalidDeviceRequest(DeviceObject
, Irp
);
194 CPortFilterWavePci::Close(
195 IN PDEVICE_OBJECT DeviceObject
,
198 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
199 Irp
->IoStatus
.Information
= 0;
200 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
202 return STATUS_UNSUCCESSFUL
;
207 CPortFilterWavePci::QuerySecurity(
208 IN PDEVICE_OBJECT DeviceObject
,
211 return KsDispatchInvalidDeviceRequest(DeviceObject
, Irp
);
216 CPortFilterWavePci::SetSecurity(
217 IN PDEVICE_OBJECT DeviceObject
,
220 return KsDispatchInvalidDeviceRequest(DeviceObject
, Irp
);
225 CPortFilterWavePci::FastDeviceIoControl(
226 IN PFILE_OBJECT FileObject
,
228 IN PVOID InputBuffer
,
229 IN ULONG InputBufferLength
,
230 OUT PVOID OutputBuffer
,
231 IN ULONG OutputBufferLength
,
232 IN ULONG IoControlCode
,
233 OUT PIO_STATUS_BLOCK StatusBlock
,
234 IN PDEVICE_OBJECT DeviceObject
)
241 CPortFilterWavePci::FastRead(
242 IN PFILE_OBJECT FileObject
,
243 IN PLARGE_INTEGER FileOffset
,
248 OUT PIO_STATUS_BLOCK StatusBlock
,
249 IN PDEVICE_OBJECT DeviceObject
)
256 CPortFilterWavePci::FastWrite(
257 IN PFILE_OBJECT FileObject
,
258 IN PLARGE_INTEGER FileOffset
,
263 OUT PIO_STATUS_BLOCK StatusBlock
,
264 IN PDEVICE_OBJECT DeviceObject
)
271 CPortFilterWavePci::Init(
272 IN IPortWavePci
* Port
)
274 ISubdevice
* ISubDevice
;
275 SUBDEVICE_DESCRIPTOR
* Descriptor
;
280 // get our private interface
281 Status
= m_Port
->QueryInterface(IID_ISubdevice
, (PVOID
*)&ISubDevice
);
282 if (!NT_SUCCESS(Status
))
283 return STATUS_UNSUCCESSFUL
;
285 // get the subdevice descriptor
286 Status
= ISubDevice
->GetDescriptor(&Descriptor
);
288 // release subdevice interface
289 ISubDevice
->Release();
291 if (!NT_SUCCESS(Status
))
292 return STATUS_UNSUCCESSFUL
;
295 m_Descriptor
= Descriptor
;
297 // allocate pin array
298 m_Pins
= (IPortPinWavePci
**)AllocateItem(NonPagedPool
, Descriptor
->Factory
.PinDescriptorCount
* sizeof(IPortPinWavePci
*), TAG_PORTCLASS
);
301 return STATUS_UNSUCCESSFUL
;
303 // increment reference count
306 return STATUS_SUCCESS
;
311 CPortFilterWavePci::FreePin(
312 IN
struct IPortPinWavePci
* Pin
)
316 for(Index
= 0; Index
< m_Descriptor
->Factory
.PinDescriptorCount
; Index
++)
318 if (m_Pins
[Index
] == Pin
)
320 m_Descriptor
->Factory
.Instances
[Index
].CurrentPinInstanceCount
--;
321 m_Pins
[Index
] = NULL
;
322 return STATUS_SUCCESS
;
325 return STATUS_UNSUCCESSFUL
;
330 NewPortFilterWavePci(
331 OUT IPortFilterWavePci
** OutFilter
)
333 CPortFilterWavePci
* This
;
335 This
= new(NonPagedPool
, TAG_PORTCLASS
)CPortFilterWavePci(NULL
);
337 return STATUS_INSUFFICIENT_RESOURCES
;
342 *OutFilter
= (IPortFilterWavePci
*)This
;
344 return STATUS_SUCCESS
;