2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Kernel Streaming
4 * FILE: drivers/wdm/audio/backpln/portcls/port_wavert.cpp
5 * PURPOSE: WaveRT Port Driver
6 * PROGRAMMER: Johannes Anderwald
17 class CPortWaveRT
: public IPortWaveRT
,
22 STDMETHODIMP
QueryInterface( REFIID InterfaceId
, PVOID
* Interface
);
24 STDMETHODIMP_(ULONG
) AddRef()
26 InterlockedIncrement(&m_Ref
);
29 STDMETHODIMP_(ULONG
) Release()
31 InterlockedDecrement(&m_Ref
);
43 CPortWaveRT(IUnknown
*OuterUnknown
) {}
44 virtual ~CPortWaveRT() {}
49 PDEVICE_OBJECT m_pDeviceObject
;
50 PMINIPORTWAVERT m_pMiniport
;
51 PRESOURCELIST m_pResourceList
;
52 PPINCOUNT m_pPinCount
;
53 PPOWERNOTIFY m_pPowerNotify
;
54 PPCFILTER_DESCRIPTOR m_pDescriptor
;
55 PSUBDEVICE_DESCRIPTOR m_SubDeviceDescriptor
;
56 IPortFilterWaveRT
* m_Filter
;
58 friend PMINIPORTWAVERT
GetWaveRTMiniport(IN IPortWaveRT
* iface
);
59 friend PDEVICE_OBJECT
GetDeviceObjectFromPortWaveRT(PPORTWAVERT iface
);
64 static GUID InterfaceGuids
[3] =
68 0x6994AD04, 0x93EF, 0x11D0, {0xA3, 0xCC, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
72 0x65E8773EL
, 0x8F56, 0x11D0, {0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
75 /// KSCATEGORY_CAPTURE
76 0x65E8773DL
, 0x8F56, 0x11D0, {0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
80 DEFINE_KSPROPERTY_TOPOLOGYSET(PortFilterWaveRTTopologySet
, TopologyPropertyHandler
);
81 DEFINE_KSPROPERTY_PINPROPOSEDATAFORMAT(PortFilterWaveRTPinSet
, PinPropertyHandler
, PinPropertyHandler
, PinPropertyHandler
);
83 KSPROPERTY_SET WaveRTPropertySet
[] =
86 &KSPROPSETID_Topology
,
87 sizeof(PortFilterWaveRTTopologySet
) / sizeof(KSPROPERTY_ITEM
),
88 (const KSPROPERTY_ITEM
*)&PortFilterWaveRTTopologySet
,
94 sizeof(PortFilterWaveRTPinSet
) / sizeof(KSPROPERTY_ITEM
),
95 (const KSPROPERTY_ITEM
*)&PortFilterWaveRTPinSet
,
101 //KSEVENTSETID_LoopedStreaming, Type = KSEVENT_LOOPEDSTREAMING_POSITION
102 //KSEVENTSETID_Connection, Type = KSEVENT_CONNECTION_ENDOFSTREAM,
106 //---------------------------------------------------------------
112 CPortWaveRT::AddEventToEventList(
113 IN PKSEVENT_ENTRY EventEntry
)
121 CPortWaveRT::GenerateEventList(
122 IN GUID
* Set OPTIONAL
,
132 //---------------------------------------------------------------
133 // IUnknown interface functions
138 CPortWaveRT::QueryInterface(
142 UNICODE_STRING GuidString
;
144 if (IsEqualGUIDAligned(refiid
, IID_IPortWaveRT
) ||
145 IsEqualGUIDAligned(refiid
, IID_IUnknown
))
147 *Output
= PVOID(PPORTWAVERT(this));
148 PUNKNOWN(*Output
)->AddRef();
149 return STATUS_SUCCESS
;
151 else if (IsEqualGUIDAligned(refiid
, IID_IPortEvents
))
153 *Output
= PVOID(PPORTEVENTS(this));
154 PUNKNOWN(*Output
)->AddRef();
155 return STATUS_SUCCESS
;
157 else if (IsEqualGUIDAligned(refiid
, IID_ISubdevice
))
159 *Output
= PVOID(PSUBDEVICE(this));
160 PUNKNOWN(*Output
)->AddRef();
161 return STATUS_SUCCESS
;
163 else if (IsEqualGUIDAligned(refiid
, IID_IPortClsVersion
))
165 return NewPortClsVersion((PPORTCLSVERSION
*)Output
);
167 else if (IsEqualGUIDAligned(refiid
, IID_IDrmPort
) ||
168 IsEqualGUIDAligned(refiid
, IID_IDrmPort2
))
170 return NewIDrmPort((PDRMPORT2
*)Output
);
172 else if (IsEqualGUIDAligned(refiid
, IID_IUnregisterSubdevice
))
174 return NewIUnregisterSubdevice((PUNREGISTERSUBDEVICE
*)Output
);
176 else if (IsEqualGUIDAligned(refiid
, IID_IUnregisterPhysicalConnection
))
178 return NewIUnregisterPhysicalConnection((PUNREGISTERPHYSICALCONNECTION
*)Output
);
181 if (RtlStringFromGUID(refiid
, &GuidString
) == STATUS_SUCCESS
)
183 DPRINT("IPortWaveRT_fnQueryInterface no interface!!! iface %S\n", GuidString
.Buffer
);
184 RtlFreeUnicodeString(&GuidString
);
187 return STATUS_UNSUCCESSFUL
;
189 //---------------------------------------------------------------
190 // IPort interface functions
195 CPortWaveRT::GetDeviceProperty(
196 IN DEVICE_REGISTRY_PROPERTY DeviceRegistryProperty
,
197 IN ULONG BufferLength
,
198 OUT PVOID PropertyBuffer
,
199 OUT PULONG ReturnLength
)
201 PC_ASSERT_IRQL_EQUAL(PASSIVE_LEVEL
);
205 DPRINT("IPortWaveRT_fnNewRegistryKey called w/o initialized\n");
206 return STATUS_UNSUCCESSFUL
;
209 return IoGetDeviceProperty(m_pDeviceObject
, DeviceRegistryProperty
, BufferLength
, PropertyBuffer
, ReturnLength
);
215 IN PDEVICE_OBJECT DeviceObject
,
217 IN PUNKNOWN UnknownMiniport
,
218 IN PUNKNOWN UnknownAdapter OPTIONAL
,
219 IN PRESOURCELIST ResourceList
)
221 IMiniportWaveRT
* Miniport
;
224 PPOWERNOTIFY PowerNotify
;
226 DPRINT("IPortWaveRT_Init entered %p\n", this);
227 PC_ASSERT_IRQL_EQUAL(PASSIVE_LEVEL
);
231 DPRINT("IPortWaveRT_Init called again\n");
232 return STATUS_SUCCESS
;
235 Status
= UnknownMiniport
->QueryInterface(IID_IMiniportWaveRT
, (PVOID
*)&Miniport
);
236 if (!NT_SUCCESS(Status
))
238 DPRINT("IPortWaveRT_Init called with invalid IMiniport adapter\n");
239 return STATUS_INVALID_PARAMETER
;
242 // Initialize port object
243 m_pMiniport
= Miniport
;
244 m_pDeviceObject
= DeviceObject
;
245 m_bInitialized
= TRUE
;
246 m_pResourceList
= ResourceList
;
248 // increment reference on miniport adapter
251 Status
= Miniport
->Init(UnknownAdapter
, ResourceList
, this);
252 if (!NT_SUCCESS(Status
))
254 DPRINT("IMiniportWaveRT_Init failed with %x\n", Status
);
256 m_bInitialized
= FALSE
;
261 // get the miniport device descriptor
262 Status
= Miniport
->GetDescription(&m_pDescriptor
);
263 if (!NT_SUCCESS(Status
))
265 DPRINT("failed to get description\n");
267 m_bInitialized
= FALSE
;
271 // create the subdevice descriptor
272 Status
= PcCreateSubdeviceDescriptor(&m_SubDeviceDescriptor
,
287 if (!NT_SUCCESS(Status
))
289 DPRINT("PcCreateSubdeviceDescriptor failed with %x\n", Status
);
291 m_bInitialized
= FALSE
;
295 // check if it supports IPinCount interface
296 Status
= UnknownMiniport
->QueryInterface(IID_IPinCount
, (PVOID
*)&PinCount
);
297 if (NT_SUCCESS(Status
))
299 // store IPinCount interface
300 m_pPinCount
= PinCount
;
303 // does the Miniport adapter support IPowerNotify interface*/
304 Status
= UnknownMiniport
->QueryInterface(IID_IPowerNotify
, (PVOID
*)&PowerNotify
);
305 if (NT_SUCCESS(Status
))
308 m_pPowerNotify
= PowerNotify
;
311 // increment reference on resource list
312 ResourceList
->AddRef();
315 DPRINT("IPortWaveRT successfully initialized\n");
316 return STATUS_SUCCESS
;
322 CPortWaveRT::NewRegistryKey(
323 OUT PREGISTRYKEY
*OutRegistryKey
,
324 IN PUNKNOWN OuterUnknown OPTIONAL
,
325 IN ULONG RegistryKeyType
,
326 IN ACCESS_MASK DesiredAccess
,
327 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
,
328 IN ULONG CreateOptions OPTIONAL
,
329 OUT PULONG Disposition OPTIONAL
)
331 PC_ASSERT_IRQL_EQUAL(PASSIVE_LEVEL
);
335 DPRINT("IPortWaveRT_fnNewRegistryKey called w/o initialized\n");
336 return STATUS_UNSUCCESSFUL
;
338 return PcNewRegistryKey(OutRegistryKey
, OuterUnknown
, RegistryKeyType
, DesiredAccess
, m_pDeviceObject
, (ISubdevice
*)this, ObjectAttributes
, CreateOptions
, Disposition
);
340 //---------------------------------------------------------------
341 // ISubdevice interface
346 CPortWaveRT::NewIrpTarget(
347 OUT
struct IIrpTarget
**OutTarget
,
350 IN POOL_TYPE PoolType
,
351 IN PDEVICE_OBJECT DeviceObject
,
353 IN KSOBJECT_CREATE
*CreateObject
)
356 IPortFilterWaveRT
* Filter
;
358 DPRINT("ISubDevice_NewIrpTarget this %p\n", this);
362 *OutTarget
= (IIrpTarget
*)m_Filter
;
363 return STATUS_SUCCESS
;
367 Status
= NewPortFilterWaveRT(&Filter
);
368 if (!NT_SUCCESS(Status
))
373 Status
= Filter
->Init(this);
374 if (!NT_SUCCESS(Status
))
380 *OutTarget
= (IIrpTarget
*)Filter
;
387 CPortWaveRT::ReleaseChildren()
390 return STATUS_UNSUCCESSFUL
;
395 CPortWaveRT::GetDescriptor(
396 IN SUBDEVICE_DESCRIPTOR
** Descriptor
)
398 PC_ASSERT(m_SubDeviceDescriptor
!= NULL
);
400 *Descriptor
= m_SubDeviceDescriptor
;
402 DPRINT("ISubDevice_GetDescriptor this %p desc %p\n", this, m_SubDeviceDescriptor
);
403 return STATUS_SUCCESS
;
408 CPortWaveRT::DataRangeIntersection(
410 IN PKSDATARANGE DataRange
,
411 IN PKSDATARANGE MatchingDataRange
,
412 IN ULONG OutputBufferLength
,
413 OUT PVOID ResultantFormat OPTIONAL
,
414 OUT PULONG ResultantFormatLength
)
416 DPRINT("ISubDevice_DataRangeIntersection this %p\n", this);
420 return m_pMiniport
->DataRangeIntersection (PinId
, DataRange
, MatchingDataRange
, OutputBufferLength
, ResultantFormat
, ResultantFormatLength
);
423 return STATUS_UNSUCCESSFUL
;
428 CPortWaveRT::PowerChangeNotify(
429 IN POWER_STATE PowerState
)
433 m_pPowerNotify
->PowerChangeNotify(PowerState
);
436 return STATUS_SUCCESS
;
441 CPortWaveRT::PinCount(
443 IN OUT PULONG FilterNecessary
,
444 IN OUT PULONG FilterCurrent
,
445 IN OUT PULONG FilterPossible
,
446 IN OUT PULONG GlobalCurrent
,
447 IN OUT PULONG GlobalPossible
)
451 m_pPinCount
->PinCount(PinId
, FilterNecessary
, FilterCurrent
, FilterPossible
, GlobalCurrent
, GlobalPossible
);
452 return STATUS_SUCCESS
;
456 // scan filter descriptor
458 return STATUS_UNSUCCESSFUL
;
461 ///--------------------------------------------------------------
464 IN IPortWaveRT
* iface
)
466 CPortWaveRT
* This
= (CPortWaveRT
*)iface
;
467 return This
->m_pMiniport
;
471 GetDeviceObjectFromPortWaveRT(
474 CPortWaveRT
* This
= (CPortWaveRT
*)iface
;
475 return This
->m_pDeviceObject
;
478 //---------------------------------------------------------------
479 // IPortWaveRT constructor
490 Port
= new(NonPagedPool
, TAG_PORTCLASS
) CPortWaveRT(NULL
);
492 return STATUS_INSUFFICIENT_RESOURCES
;
494 Status
= Port
->QueryInterface(IID_IPort
, (PVOID
*)OutPort
);
496 if (!NT_SUCCESS(Status
))
501 DPRINT("NewPortWaveRT %p Status %u\n", Port
, Status
);