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
] && m_Descriptor
->Factory
.Instances
[ConnectDetails
->PinId
].CurrentPinInstanceCount
)
101 // release existing instance
103 m_Pins
[ConnectDetails
->PinId
]->Close(DeviceObject
, NULL
);
106 // now create the pin
107 Status
= NewPortPinWavePci(&Pin
);
108 if (!NT_SUCCESS(Status
))
113 // initialize the pin
114 Status
= Pin
->Init(m_Port
, this, ConnectDetails
, &m_Descriptor
->Factory
.KsPinDescriptor
[ConnectDetails
->PinId
], GetDeviceObjectFromPortWavePci(m_Port
));
115 if (!NT_SUCCESS(Status
))
122 m_Pins
[ConnectDetails
->PinId
] = Pin
;
125 *OutTarget
= (IIrpTarget
*)Pin
;
127 // increment current instance count
128 m_Descriptor
->Factory
.Instances
[ConnectDetails
->PinId
].CurrentPinInstanceCount
++;
135 CPortFilterWavePci::DeviceIoControl(
136 IN PDEVICE_OBJECT DeviceObject
,
139 PIO_STACK_LOCATION IoStack
;
142 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
144 if (IoStack
->Parameters
.DeviceIoControl
.IoControlCode
!= IOCTL_KS_PROPERTY
)
146 DPRINT("Unhandled function %lx Length %x\n", IoStack
->Parameters
.DeviceIoControl
.IoControlCode
, IoStack
->Parameters
.DeviceIoControl
.InputBufferLength
);
148 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
150 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
151 return STATUS_SUCCESS
;
154 Status
= PcHandlePropertyWithTable(Irp
, m_Descriptor
->FilterPropertySetCount
, m_Descriptor
->FilterPropertySet
, m_Descriptor
);
155 if (Status
!= STATUS_PENDING
)
157 Irp
->IoStatus
.Status
= Status
;
158 DPRINT("Result %x Length %u\n", Status
, Irp
->IoStatus
.Information
);
159 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
166 CPortFilterWavePci::Read(
167 IN PDEVICE_OBJECT DeviceObject
,
170 return KsDispatchInvalidDeviceRequest(DeviceObject
, Irp
);
175 CPortFilterWavePci::Write(
176 IN PDEVICE_OBJECT DeviceObject
,
179 return KsDispatchInvalidDeviceRequest(DeviceObject
, Irp
);
184 CPortFilterWavePci::Flush(
185 IN PDEVICE_OBJECT DeviceObject
,
188 return KsDispatchInvalidDeviceRequest(DeviceObject
, Irp
);
193 CPortFilterWavePci::Close(
194 IN PDEVICE_OBJECT DeviceObject
,
197 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
198 Irp
->IoStatus
.Information
= 0;
199 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
201 return STATUS_UNSUCCESSFUL
;
206 CPortFilterWavePci::QuerySecurity(
207 IN PDEVICE_OBJECT DeviceObject
,
210 return KsDispatchInvalidDeviceRequest(DeviceObject
, Irp
);
215 CPortFilterWavePci::SetSecurity(
216 IN PDEVICE_OBJECT DeviceObject
,
219 return KsDispatchInvalidDeviceRequest(DeviceObject
, Irp
);
224 CPortFilterWavePci::FastDeviceIoControl(
225 IN PFILE_OBJECT FileObject
,
227 IN PVOID InputBuffer
,
228 IN ULONG InputBufferLength
,
229 OUT PVOID OutputBuffer
,
230 IN ULONG OutputBufferLength
,
231 IN ULONG IoControlCode
,
232 OUT PIO_STATUS_BLOCK StatusBlock
,
233 IN PDEVICE_OBJECT DeviceObject
)
240 CPortFilterWavePci::FastRead(
241 IN PFILE_OBJECT FileObject
,
242 IN PLARGE_INTEGER FileOffset
,
247 OUT PIO_STATUS_BLOCK StatusBlock
,
248 IN PDEVICE_OBJECT DeviceObject
)
255 CPortFilterWavePci::FastWrite(
256 IN PFILE_OBJECT FileObject
,
257 IN PLARGE_INTEGER FileOffset
,
262 OUT PIO_STATUS_BLOCK StatusBlock
,
263 IN PDEVICE_OBJECT DeviceObject
)
270 CPortFilterWavePci::Init(
271 IN IPortWavePci
* Port
)
273 ISubdevice
* ISubDevice
;
274 SUBDEVICE_DESCRIPTOR
* Descriptor
;
279 // get our private interface
280 Status
= m_Port
->QueryInterface(IID_ISubdevice
, (PVOID
*)&ISubDevice
);
281 if (!NT_SUCCESS(Status
))
282 return STATUS_UNSUCCESSFUL
;
284 // get the subdevice descriptor
285 Status
= ISubDevice
->GetDescriptor(&Descriptor
);
287 // release subdevice interface
288 ISubDevice
->Release();
290 if (!NT_SUCCESS(Status
))
291 return STATUS_UNSUCCESSFUL
;
294 m_Descriptor
= Descriptor
;
296 // allocate pin array
297 m_Pins
= (IPortPinWavePci
**)AllocateItem(NonPagedPool
, Descriptor
->Factory
.PinDescriptorCount
* sizeof(IPortPinWavePci
*), TAG_PORTCLASS
);
300 return STATUS_UNSUCCESSFUL
;
302 // increment reference count
305 return STATUS_SUCCESS
;
309 NewPortFilterWavePci(
310 OUT IPortFilterWavePci
** OutFilter
)
312 CPortFilterWavePci
* This
;
314 This
= new(NonPagedPool
, TAG_PORTCLASS
)CPortFilterWavePci(NULL
);
316 return STATUS_INSUFFICIENT_RESOURCES
;
321 *OutFilter
= (IPortFilterWavePci
*)This
;
323 return STATUS_SUCCESS
;