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
11 class CPortWaveRT
: public IPortWaveRT
,
16 STDMETHODIMP
QueryInterface( REFIID InterfaceId
, PVOID
* Interface
);
18 STDMETHODIMP_(ULONG
) AddRef()
20 InterlockedIncrement(&m_Ref
);
23 STDMETHODIMP_(ULONG
) Release()
25 InterlockedDecrement(&m_Ref
);
37 CPortWaveRT(IUnknown
*OuterUnknown
) {}
38 virtual ~CPortWaveRT() {}
43 PDEVICE_OBJECT m_pDeviceObject
;
44 PMINIPORTWAVERT m_pMiniport
;
45 PRESOURCELIST m_pResourceList
;
46 PPINCOUNT m_pPinCount
;
47 PPOWERNOTIFY m_pPowerNotify
;
48 PPCFILTER_DESCRIPTOR m_pDescriptor
;
49 PSUBDEVICE_DESCRIPTOR m_SubDeviceDescriptor
;
50 IPortFilterWaveRT
* m_Filter
;
52 friend PMINIPORTWAVERT
GetWaveRTMiniport(IN IPortWaveRT
* iface
);
53 friend PDEVICE_OBJECT
GetDeviceObjectFromPortWaveRT(PPORTWAVERT iface
);
58 static GUID InterfaceGuids
[3] =
62 0x65E8773EL
, 0x8F56, 0x11D0, {0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
65 /// KSCATEGORY_CAPTURE
66 0x65E8773DL
, 0x8F56, 0x11D0, {0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
70 0x6994AD04, 0x93EF, 0x11D0, {0xA3, 0xCC, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
74 DEFINE_KSPROPERTY_TOPOLOGYSET(PortFilterWaveRTTopologySet
, TopologyPropertyHandler
);
75 DEFINE_KSPROPERTY_PINPROPOSEDATAFORMAT(PortFilterWaveRTPinSet
, PinPropertyHandler
, PinPropertyHandler
, PinPropertyHandler
);
77 KSPROPERTY_SET WaveRTPropertySet
[] =
80 &KSPROPSETID_Topology
,
81 sizeof(PortFilterWaveRTTopologySet
) / sizeof(KSPROPERTY_ITEM
),
82 (const KSPROPERTY_ITEM
*)&PortFilterWaveRTTopologySet
,
88 sizeof(PortFilterWaveRTPinSet
) / sizeof(KSPROPERTY_ITEM
),
89 (const KSPROPERTY_ITEM
*)&PortFilterWaveRTPinSet
,
95 //KSEVENTSETID_LoopedStreaming, Type = KSEVENT_LOOPEDSTREAMING_POSITION
96 //KSEVENTSETID_Connection, Type = KSEVENT_CONNECTION_ENDOFSTREAM,
100 //---------------------------------------------------------------
106 CPortWaveRT::AddEventToEventList(
107 IN PKSEVENT_ENTRY EventEntry
)
115 CPortWaveRT::GenerateEventList(
116 IN GUID
* Set OPTIONAL
,
126 //---------------------------------------------------------------
127 // IUnknown interface functions
132 CPortWaveRT::QueryInterface(
136 UNICODE_STRING GuidString
;
138 if (IsEqualGUIDAligned(refiid
, IID_IPortWaveRT
) ||
139 IsEqualGUIDAligned(refiid
, IID_IUnknown
))
141 *Output
= PVOID(PPORTWAVERT(this));
142 PUNKNOWN(*Output
)->AddRef();
143 return STATUS_SUCCESS
;
145 else if (IsEqualGUIDAligned(refiid
, IID_IPortEvents
))
147 *Output
= PVOID(PPORTEVENTS(this));
148 PUNKNOWN(*Output
)->AddRef();
149 return STATUS_SUCCESS
;
151 else if (IsEqualGUIDAligned(refiid
, IID_ISubdevice
))
153 *Output
= PVOID(PSUBDEVICE(this));
154 PUNKNOWN(*Output
)->AddRef();
155 return STATUS_SUCCESS
;
157 else if (IsEqualGUIDAligned(refiid
, IID_IPortClsVersion
))
159 return NewPortClsVersion((PPORTCLSVERSION
*)Output
);
161 else if (IsEqualGUIDAligned(refiid
, IID_IDrmPort
) ||
162 IsEqualGUIDAligned(refiid
, IID_IDrmPort2
))
164 return NewIDrmPort((PDRMPORT2
*)Output
);
166 else if (IsEqualGUIDAligned(refiid
, IID_IUnregisterSubdevice
))
168 return NewIUnregisterSubdevice((PUNREGISTERSUBDEVICE
*)Output
);
170 else if (IsEqualGUIDAligned(refiid
, IID_IUnregisterPhysicalConnection
))
172 return NewIUnregisterPhysicalConnection((PUNREGISTERPHYSICALCONNECTION
*)Output
);
175 if (RtlStringFromGUID(refiid
, &GuidString
) == STATUS_SUCCESS
)
177 DPRINT1("IPortWaveRT_fnQueryInterface no interface!!! iface %S\n", GuidString
.Buffer
);
178 RtlFreeUnicodeString(&GuidString
);
181 return STATUS_UNSUCCESSFUL
;
183 //---------------------------------------------------------------
184 // IPort interface functions
189 CPortWaveRT::GetDeviceProperty(
190 IN DEVICE_REGISTRY_PROPERTY DeviceRegistryProperty
,
191 IN ULONG BufferLength
,
192 OUT PVOID PropertyBuffer
,
193 OUT PULONG ReturnLength
)
195 PC_ASSERT_IRQL_EQUAL(PASSIVE_LEVEL
);
199 DPRINT("IPortWaveRT_fnNewRegistryKey called w/o initiazed\n");
200 return STATUS_UNSUCCESSFUL
;
203 return IoGetDeviceProperty(m_pDeviceObject
, DeviceRegistryProperty
, BufferLength
, PropertyBuffer
, ReturnLength
);
209 IN PDEVICE_OBJECT DeviceObject
,
211 IN PUNKNOWN UnknownMiniport
,
212 IN PUNKNOWN UnknownAdapter OPTIONAL
,
213 IN PRESOURCELIST ResourceList
)
215 IMiniportWaveRT
* Miniport
;
218 PPOWERNOTIFY PowerNotify
;
220 DPRINT("IPortWaveRT_Init entered %p\n", this);
221 PC_ASSERT_IRQL_EQUAL(PASSIVE_LEVEL
);
225 DPRINT("IPortWaveRT_Init called again\n");
226 return STATUS_SUCCESS
;
229 Status
= UnknownMiniport
->QueryInterface(IID_IMiniportWaveRT
, (PVOID
*)&Miniport
);
230 if (!NT_SUCCESS(Status
))
232 DPRINT("IPortWaveRT_Init called with invalid IMiniport adapter\n");
233 return STATUS_INVALID_PARAMETER
;
236 // Initialize port object
237 m_pMiniport
= Miniport
;
238 m_pDeviceObject
= DeviceObject
;
239 m_bInitialized
= TRUE
;
240 m_pResourceList
= ResourceList
;
242 // increment reference on miniport adapter
245 Status
= Miniport
->Init(UnknownAdapter
, ResourceList
, this);
246 if (!NT_SUCCESS(Status
))
248 DPRINT("IMiniportWaveRT_Init failed with %x\n", Status
);
250 m_bInitialized
= FALSE
;
255 // get the miniport device descriptor
256 Status
= Miniport
->GetDescription(&m_pDescriptor
);
257 if (!NT_SUCCESS(Status
))
259 DPRINT1("failed to get description\n");
261 m_bInitialized
= FALSE
;
265 // create the subdevice descriptor
266 Status
= PcCreateSubdeviceDescriptor(&m_SubDeviceDescriptor
,
281 if (!NT_SUCCESS(Status
))
283 DPRINT1("PcCreateSubdeviceDescriptor failed with %x\n", Status
);
285 m_bInitialized
= FALSE
;
289 // check if it supports IPinCount interface
290 Status
= UnknownMiniport
->QueryInterface(IID_IPinCount
, (PVOID
*)&PinCount
);
291 if (NT_SUCCESS(Status
))
293 // store IPinCount interface
294 m_pPinCount
= PinCount
;
297 // does the Miniport adapter support IPowerNotify interface*/
298 Status
= UnknownMiniport
->QueryInterface(IID_IPowerNotify
, (PVOID
*)&PowerNotify
);
299 if (NT_SUCCESS(Status
))
302 m_pPowerNotify
= PowerNotify
;
305 // increment reference on resource list
306 ResourceList
->AddRef();
309 DPRINT("IPortWaveRT successfully initialized\n");
310 return STATUS_SUCCESS
;
316 CPortWaveRT::NewRegistryKey(
317 OUT PREGISTRYKEY
*OutRegistryKey
,
318 IN PUNKNOWN OuterUnknown OPTIONAL
,
319 IN ULONG RegistryKeyType
,
320 IN ACCESS_MASK DesiredAccess
,
321 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
,
322 IN ULONG CreateOptions OPTIONAL
,
323 OUT PULONG Disposition OPTIONAL
)
325 PC_ASSERT_IRQL_EQUAL(PASSIVE_LEVEL
);
329 DPRINT("IPortWaveRT_fnNewRegistryKey called w/o initialized\n");
330 return STATUS_UNSUCCESSFUL
;
332 return PcNewRegistryKey(OutRegistryKey
, OuterUnknown
, RegistryKeyType
, DesiredAccess
, m_pDeviceObject
, NULL
/*FIXME*/, ObjectAttributes
, CreateOptions
, Disposition
);
334 //---------------------------------------------------------------
335 // ISubdevice interface
340 CPortWaveRT::NewIrpTarget(
341 OUT
struct IIrpTarget
**OutTarget
,
344 IN POOL_TYPE PoolType
,
345 IN PDEVICE_OBJECT DeviceObject
,
347 IN KSOBJECT_CREATE
*CreateObject
)
350 IPortFilterWaveRT
* Filter
;
352 DPRINT("ISubDevice_NewIrpTarget this %p\n", this);
356 *OutTarget
= (IIrpTarget
*)m_Filter
;
357 return STATUS_SUCCESS
;
361 Status
= NewPortFilterWaveRT(&Filter
);
362 if (!NT_SUCCESS(Status
))
367 Status
= Filter
->Init(this);
368 if (!NT_SUCCESS(Status
))
374 *OutTarget
= (IIrpTarget
*)Filter
;
381 CPortWaveRT::ReleaseChildren()
384 return STATUS_UNSUCCESSFUL
;
389 CPortWaveRT::GetDescriptor(
390 IN SUBDEVICE_DESCRIPTOR
** Descriptor
)
392 PC_ASSERT(m_SubDeviceDescriptor
!= NULL
);
394 *Descriptor
= m_SubDeviceDescriptor
;
396 DPRINT("ISubDevice_GetDescriptor this %p desc %p\n", this, m_SubDeviceDescriptor
);
397 return STATUS_SUCCESS
;
402 CPortWaveRT::DataRangeIntersection(
404 IN PKSDATARANGE DataRange
,
405 IN PKSDATARANGE MatchingDataRange
,
406 IN ULONG OutputBufferLength
,
407 OUT PVOID ResultantFormat OPTIONAL
,
408 OUT PULONG ResultantFormatLength
)
410 DPRINT("ISubDevice_DataRangeIntersection this %p\n", this);
414 return m_pMiniport
->DataRangeIntersection (PinId
, DataRange
, MatchingDataRange
, OutputBufferLength
, ResultantFormat
, ResultantFormatLength
);
417 return STATUS_UNSUCCESSFUL
;
422 CPortWaveRT::PowerChangeNotify(
423 IN POWER_STATE PowerState
)
427 m_pPowerNotify
->PowerChangeNotify(PowerState
);
430 return STATUS_SUCCESS
;
435 CPortWaveRT::PinCount(
437 IN OUT PULONG FilterNecessary
,
438 IN OUT PULONG FilterCurrent
,
439 IN OUT PULONG FilterPossible
,
440 IN OUT PULONG GlobalCurrent
,
441 IN OUT PULONG GlobalPossible
)
445 m_pPinCount
->PinCount(PinId
, FilterNecessary
, FilterCurrent
, FilterPossible
, GlobalCurrent
, GlobalPossible
);
446 return STATUS_SUCCESS
;
450 // scan filter descriptor
452 return STATUS_UNSUCCESSFUL
;
455 ///--------------------------------------------------------------
458 IN IPortWaveRT
* iface
)
460 CPortWaveRT
* This
= (CPortWaveRT
*)iface
;
461 return This
->m_pMiniport
;
465 GetDeviceObjectFromPortWaveRT(
468 CPortWaveRT
* This
= (CPortWaveRT
*)iface
;
469 return This
->m_pDeviceObject
;
472 //---------------------------------------------------------------
473 // IPortWaveRT constructor
484 Port
= new(NonPagedPool
, TAG_PORTCLASS
) CPortWaveRT(NULL
);
486 return STATUS_INSUFFICIENT_RESOURCES
;
488 Status
= Port
->QueryInterface(IID_IPort
, (PVOID
*)OutPort
);
490 if (!NT_SUCCESS(Status
))
495 DPRINT("NewPortWaveRT %p Status %u\n", Port
, Status
);