2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Kernel Streaming
4 * FILE: drivers/wdm/audio/backpln/portcls/filter_dmus.cpp
5 * PURPOSE: portcls wave pci filter
6 * PROGRAMMER: Johannes Anderwald
11 class CPortFilterDMus
: public IPortFilterDMus
14 STDMETHODIMP
QueryInterface( REFIID InterfaceId
, PVOID
* Interface
);
16 STDMETHODIMP_(ULONG
) AddRef()
18 InterlockedIncrement(&m_Ref
);
21 STDMETHODIMP_(ULONG
) Release()
23 InterlockedDecrement(&m_Ref
);
33 CPortFilterDMus(IUnknown
*OuterUnknown
){}
34 virtual ~CPortFilterDMus(){}
38 IPortPinDMus
** m_Pins
;
39 SUBDEVICE_DESCRIPTOR
* m_Descriptor
;
45 CPortFilterDMus::QueryInterface(
50 if (IsEqualGUIDAligned(refiid
, IID_IIrpTarget
) ||
51 IsEqualGUIDAligned(refiid
, IID_IUnknown
))
53 *Output
= PVOID(PUNKNOWN(this));
54 PUNKNOWN(*Output
)->AddRef();
55 return STATUS_SUCCESS
;
57 else if (IsEqualGUIDAligned(refiid
, IID_IPort
))
59 *Output
= PUNKNOWN(m_Port
);
60 PUNKNOWN(*Output
)->AddRef();
61 return STATUS_SUCCESS
;
64 return STATUS_UNSUCCESSFUL
;
69 CPortFilterDMus::NewIrpTarget(
70 OUT
struct IIrpTarget
**OutTarget
,
73 IN POOL_TYPE PoolType
,
74 IN PDEVICE_OBJECT DeviceObject
,
76 IN KSOBJECT_CREATE
*CreateObject
)
80 PKSPIN_CONNECT ConnectDetails
;
83 PC_ASSERT(m_Descriptor
);
86 DPRINT("CPortFilterDMus::NewIrpTarget entered\n");
88 // let's verify the connection request
89 Status
= PcValidateConnectRequest(Irp
, &m_Descriptor
->Factory
, &ConnectDetails
);
90 if (!NT_SUCCESS(Status
))
92 return STATUS_UNSUCCESSFUL
;
95 if (m_Pins
[ConnectDetails
->PinId
] && m_Descriptor
->Factory
.Instances
[ConnectDetails
->PinId
].CurrentPinInstanceCount
)
97 // release existing instance
101 // now create the pin
102 Status
= NewPortPinDMus(&Pin
);
103 if (!NT_SUCCESS(Status
))
108 // initialize the pin
109 Status
= Pin
->Init(m_Port
, this, ConnectDetails
, &m_Descriptor
->Factory
.KsPinDescriptor
[ConnectDetails
->PinId
], DeviceObject
);
110 if (!NT_SUCCESS(Status
))
117 m_Pins
[ConnectDetails
->PinId
] = Pin
;
120 *OutTarget
= (IIrpTarget
*)Pin
;
122 // increment current instance count
123 m_Descriptor
->Factory
.Instances
[ConnectDetails
->PinId
].CurrentPinInstanceCount
++;
130 CPortFilterDMus::DeviceIoControl(
131 IN PDEVICE_OBJECT DeviceObject
,
134 PIO_STACK_LOCATION IoStack
;
137 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
139 if (IoStack
->Parameters
.DeviceIoControl
.IoControlCode
!= IOCTL_KS_PROPERTY
)
141 DPRINT("Unhandled function %lx Length %x\n", IoStack
->Parameters
.DeviceIoControl
.IoControlCode
, IoStack
->Parameters
.DeviceIoControl
.InputBufferLength
);
143 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
145 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
146 return STATUS_SUCCESS
;
149 Status
= PcHandlePropertyWithTable(Irp
, m_Descriptor
->FilterPropertySetCount
, m_Descriptor
->FilterPropertySet
, m_Descriptor
);
150 if (Status
!= STATUS_PENDING
)
152 Irp
->IoStatus
.Status
= Status
;
153 DPRINT("Result %x Length %u\n", Status
, Irp
->IoStatus
.Information
);
154 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
161 CPortFilterDMus::Read(
162 IN PDEVICE_OBJECT DeviceObject
,
165 return KsDispatchInvalidDeviceRequest(DeviceObject
, Irp
);
170 CPortFilterDMus::Write(
171 IN PDEVICE_OBJECT DeviceObject
,
174 return KsDispatchInvalidDeviceRequest(DeviceObject
, Irp
);
179 CPortFilterDMus::Flush(
180 IN PDEVICE_OBJECT DeviceObject
,
183 return KsDispatchInvalidDeviceRequest(DeviceObject
, Irp
);
188 CPortFilterDMus::Close(
189 IN PDEVICE_OBJECT DeviceObject
,
192 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
193 Irp
->IoStatus
.Information
= 0;
194 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
196 return STATUS_UNSUCCESSFUL
;
201 CPortFilterDMus::QuerySecurity(
202 IN PDEVICE_OBJECT DeviceObject
,
205 return KsDispatchInvalidDeviceRequest(DeviceObject
, Irp
);
210 CPortFilterDMus::SetSecurity(
211 IN PDEVICE_OBJECT DeviceObject
,
214 return KsDispatchInvalidDeviceRequest(DeviceObject
, Irp
);
219 CPortFilterDMus::FastDeviceIoControl(
220 IN PFILE_OBJECT FileObject
,
222 IN PVOID InputBuffer
,
223 IN ULONG InputBufferLength
,
224 OUT PVOID OutputBuffer
,
225 IN ULONG OutputBufferLength
,
226 IN ULONG IoControlCode
,
227 OUT PIO_STATUS_BLOCK StatusBlock
,
228 IN PDEVICE_OBJECT DeviceObject
)
235 CPortFilterDMus::FastRead(
236 IN PFILE_OBJECT FileObject
,
237 IN PLARGE_INTEGER FileOffset
,
242 OUT PIO_STATUS_BLOCK StatusBlock
,
243 IN PDEVICE_OBJECT DeviceObject
)
251 CPortFilterDMus::FastWrite(
252 IN PFILE_OBJECT FileObject
,
253 IN PLARGE_INTEGER FileOffset
,
258 OUT PIO_STATUS_BLOCK StatusBlock
,
259 IN PDEVICE_OBJECT DeviceObject
)
267 CPortFilterDMus::Init(
270 ISubdevice
* ISubDevice
;
275 // get our private interface
276 Status
= m_Port
->QueryInterface(IID_ISubdevice
, (PVOID
*)&ISubDevice
);
277 if (!NT_SUCCESS(Status
))
278 return STATUS_UNSUCCESSFUL
;
280 // get the subdevice descriptor
281 Status
= ISubDevice
->GetDescriptor(&m_Descriptor
);
283 // release subdevice interface
284 ISubDevice
->Release();
286 if (!NT_SUCCESS(Status
))
287 return STATUS_UNSUCCESSFUL
;
289 // allocate pin array
290 m_Pins
= (IPortPinDMus
**)AllocateItem(NonPagedPool
, m_Descriptor
->Factory
.PinDescriptorCount
* sizeof(IPortPinDMus
*), TAG_PORTCLASS
);
293 return STATUS_UNSUCCESSFUL
;
295 // increment reference count
298 return STATUS_SUCCESS
;
304 CPortFilterDMus::FreePin(
305 IN
struct IPortPinDMus
* Pin
)
309 for(Index
= 0; Index
< m_Descriptor
->Factory
.PinDescriptorCount
; Index
++)
311 if (m_Pins
[Index
] == Pin
)
313 m_Pins
[Index
]->Release();
314 m_Pins
[Index
] = NULL
;
315 return STATUS_SUCCESS
;
318 return STATUS_UNSUCCESSFUL
;
323 CPortFilterDMus::NotifyPins()
327 DPRINT("Notifying %u pins\n", m_Descriptor
->Factory
.PinDescriptorCount
);
329 for(Index
= 0; Index
< m_Descriptor
->Factory
.PinDescriptorCount
; Index
++)
331 m_Pins
[Index
]->Notify();
338 OUT PPORTFILTERDMUS
* OutFilter
)
340 CPortFilterDMus
* This
;
342 This
= new(NonPagedPool
, TAG_PORTCLASS
) CPortFilterDMus(NULL
);
344 return STATUS_INSUFFICIENT_RESOURCES
;
349 *OutFilter
= (CPortFilterDMus
*)This
;
351 return STATUS_SUCCESS
;