From: Johannes Anderwald Date: Tue, 18 Aug 2009 08:24:09 +0000 (+0000) Subject: - Implement IPortEvents interface for IPortTopology X-Git-Tag: ReactOS-0.3.11~1117 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=8739063551fb8bb4affd8976002e09798fb9c82d - Implement IPortEvents interface for IPortTopology - Fix a bug in the IPortEvents::QueryInterface handler of IPortWaveCyclic & IPortWavePci svn path=/trunk/; revision=42762 --- diff --git a/reactos/drivers/wdm/audio/backpln/portcls/port_topology.c b/reactos/drivers/wdm/audio/backpln/portcls/port_topology.c index c98a8185d3b..6f3f30cfd61 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/port_topology.c +++ b/reactos/drivers/wdm/audio/backpln/portcls/port_topology.c @@ -12,6 +12,7 @@ typedef struct { IPortTopologyVtbl *lpVtbl; ISubdeviceVtbl *lpVtblSubDevice; + IPortEventsVtbl *lpVtblPortEvents; LONG ref; BOOL bInitialized; @@ -66,6 +67,98 @@ KSPROPERTY_SET TopologyPropertySet[] = } }; +//--------------------------------------------------------------- +// IPortEvents +// + +static +NTSTATUS +NTAPI +IPortEvents_fnQueryInterface( + IPortEvents* iface, + IN REFIID refiid, + OUT PVOID* Output) +{ + IPortTopologyImpl * This = (IPortTopologyImpl*)CONTAINING_RECORD(iface, IPortTopologyImpl, lpVtblPortEvents); + + DPRINT("IPortEvents_fnQueryInterface entered\n"); + + if (IsEqualGUIDAligned(refiid, &IID_IPortEvents) || + IsEqualGUIDAligned(refiid, &IID_IUnknown)) + { + *Output = &This->lpVtblPortEvents; + InterlockedIncrement(&This->ref); + return STATUS_SUCCESS; + } + return STATUS_UNSUCCESSFUL; +} + +static +ULONG +NTAPI +IPortEvents_fnAddRef( + IPortEvents* iface) +{ + IPortTopologyImpl * This = (IPortTopologyImpl*)CONTAINING_RECORD(iface, IPortTopologyImpl, lpVtblPortEvents); + DPRINT("IPortEvents_fnQueryInterface entered\n"); + return InterlockedIncrement(&This->ref); +} + +static +ULONG +NTAPI +IPortEvents_fnRelease( + IPortEvents* iface) +{ + IPortTopologyImpl * This = (IPortTopologyImpl*)CONTAINING_RECORD(iface, IPortTopologyImpl, lpVtblPortEvents); + + DPRINT("IPortEvents_fnRelease entered\n"); + InterlockedDecrement(&This->ref); + + if (This->ref == 0) + { + FreeItem(This, TAG_PORTCLASS); + return 0; + } + /* Return new reference count */ + return This->ref; +} + +static +void +NTAPI +IPortEvents_fnAddEventToEventList( + IPortEvents* iface, + IN PKSEVENT_ENTRY EventEntry) +{ + UNIMPLEMENTED +} + + +static +void +NTAPI +IPortEvents_fnGenerateEventList( + IPortEvents* iface, + IN GUID* Set OPTIONAL, + IN ULONG EventId, + IN BOOL PinEvent, + IN ULONG PinId, + IN BOOL NodeEvent, + IN ULONG NodeId) +{ + UNIMPLEMENTED +} + +static IPortEventsVtbl vt_IPortEvents = +{ + IPortEvents_fnQueryInterface, + IPortEvents_fnAddRef, + IPortEvents_fnRelease, + IPortEvents_fnAddEventToEventList, + IPortEvents_fnGenerateEventList +}; + //--------------------------------------------------------------- // IUnknown interface functions @@ -97,6 +190,12 @@ IPortTopology_fnQueryInterface( InterlockedIncrement(&This->ref); return STATUS_SUCCESS; } + else if (IsEqualGUIDAligned(refiid, &IID_IPortEvents)) + { + *Output = &This->lpVtblPortEvents; + InterlockedIncrement(&This->ref); + return STATUS_SUCCESS; + } else if (IsEqualGUIDAligned(refiid, &IID_IPortClsVersion)) { return NewPortClsVersion((PPORTCLSVERSION*)Output); @@ -707,6 +806,7 @@ NewPortTopology( This->lpVtbl = &vt_IPortTopology; This->lpVtblSubDevice = &vt_ISubdeviceVtbl; + This->lpVtblPortEvents = &vt_IPortEvents; This->ref = 1; *OutPort = (PPORT)(&This->lpVtbl); DPRINT("NewPortTopology result %p\n", *OutPort); diff --git a/reactos/drivers/wdm/audio/backpln/portcls/port_wavecyclic.c b/reactos/drivers/wdm/audio/backpln/portcls/port_wavecyclic.c index 6a4408d55ee..2fd24135ad6 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/port_wavecyclic.c +++ b/reactos/drivers/wdm/audio/backpln/portcls/port_wavecyclic.c @@ -13,9 +13,6 @@ extern GUID IID_IDmaChannelSlave; typedef struct { IPortWaveCyclicVtbl *lpVtbl; - IPortEventsVtbl *lpVbtlPortEvents; - IUnregisterSubdeviceVtbl *lpVtblUnregisterSubdevice; - IUnregisterPhysicalConnectionVtbl *lpVtblPhysicalConnection; IPortEventsVtbl *lpVtblPortEvents; ISubdeviceVtbl *lpVtblSubDevice; @@ -111,7 +108,7 @@ IPortEvents_fnQueryInterface( if (IsEqualGUIDAligned(refiid, &IID_IPortEvents) || IsEqualGUIDAligned(refiid, &IID_IUnknown)) { - *Output = &This->lpVbtlPortEvents; + *Output = &This->lpVtblPortEvents; InterlockedIncrement(&This->ref); return STATUS_SUCCESS; } diff --git a/reactos/drivers/wdm/audio/backpln/portcls/port_wavepci.c b/reactos/drivers/wdm/audio/backpln/portcls/port_wavepci.c index 63ccedf0a1c..621ad535524 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/port_wavepci.c +++ b/reactos/drivers/wdm/audio/backpln/portcls/port_wavepci.c @@ -93,7 +93,7 @@ IPortEvents_fnQueryInterface( if (IsEqualGUIDAligned(refiid, &IID_IPortEvents) || IsEqualGUIDAligned(refiid, &IID_IUnknown)) { - *Output = &This->lpVtblServiceSink; + *Output = &This->lpVtblPortEvents; InterlockedIncrement(&This->ref); return STATUS_SUCCESS; }