[ros-diffs] [janderwald] 42762: - Implement IPortEvents interface for IPortTopology - Fix a bug in the IPortEvents::QueryInterface handler of IPortWaveCyclic & IPortWavePci

janderwald at svn.reactos.org janderwald at svn.reactos.org
Tue Aug 18 10:24:09 CEST 2009


Author: janderwald
Date: Tue Aug 18 10:24:09 2009
New Revision: 42762

URL: http://svn.reactos.org/svn/reactos?rev=42762&view=rev
Log:
- Implement IPortEvents interface for IPortTopology
- Fix a bug in the IPortEvents::QueryInterface handler of IPortWaveCyclic & IPortWavePci 

Modified:
    trunk/reactos/drivers/wdm/audio/backpln/portcls/port_topology.c
    trunk/reactos/drivers/wdm/audio/backpln/portcls/port_wavecyclic.c
    trunk/reactos/drivers/wdm/audio/backpln/portcls/port_wavepci.c

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/port_topology.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/port_topology.c?rev=42762&r1=42761&r2=42762&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/port_topology.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/port_topology.c [iso-8859-1] Tue Aug 18 10:24:09 2009
@@ -12,6 +12,7 @@
 {
     IPortTopologyVtbl *lpVtbl;
     ISubdeviceVtbl *lpVtblSubDevice;
+    IPortEventsVtbl *lpVtblPortEvents;
 
     LONG ref;
     BOOL bInitialized;
@@ -66,6 +67,98 @@
     }
 };
 
+//---------------------------------------------------------------
+// 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
@@ -94,6 +187,12 @@
     else if (IsEqualGUIDAligned(refiid, &IID_ISubdevice))
     {
         *Output = &This->lpVtblSubDevice;
+        InterlockedIncrement(&This->ref);
+        return STATUS_SUCCESS;
+    }
+    else if (IsEqualGUIDAligned(refiid, &IID_IPortEvents))
+    {
+        *Output = &This->lpVtblPortEvents;
         InterlockedIncrement(&This->ref);
         return STATUS_SUCCESS;
     }
@@ -707,6 +806,7 @@
 
     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);

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/port_wavecyclic.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/port_wavecyclic.c?rev=42762&r1=42761&r2=42762&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/port_wavecyclic.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/port_wavecyclic.c [iso-8859-1] Tue Aug 18 10:24:09 2009
@@ -13,9 +13,6 @@
 typedef struct
 {
     IPortWaveCyclicVtbl *lpVtbl;
-    IPortEventsVtbl *lpVbtlPortEvents;
-    IUnregisterSubdeviceVtbl *lpVtblUnregisterSubdevice;
-    IUnregisterPhysicalConnectionVtbl *lpVtblPhysicalConnection;
     IPortEventsVtbl *lpVtblPortEvents;
     ISubdeviceVtbl *lpVtblSubDevice;
 
@@ -111,7 +108,7 @@
     if (IsEqualGUIDAligned(refiid, &IID_IPortEvents) ||
         IsEqualGUIDAligned(refiid, &IID_IUnknown))
     {
-        *Output = &This->lpVbtlPortEvents;
+        *Output = &This->lpVtblPortEvents;
         InterlockedIncrement(&This->ref);
         return STATUS_SUCCESS;
     }

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/port_wavepci.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/port_wavepci.c?rev=42762&r1=42761&r2=42762&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/port_wavepci.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/port_wavepci.c [iso-8859-1] Tue Aug 18 10:24:09 2009
@@ -93,7 +93,7 @@
     if (IsEqualGUIDAligned(refiid, &IID_IPortEvents) ||
         IsEqualGUIDAligned(refiid, &IID_IUnknown))
     {
-        *Output = &This->lpVtblServiceSink;
+        *Output = &This->lpVtblPortEvents;
         InterlockedIncrement(&This->ref);
         return STATUS_SUCCESS;
     }




More information about the Ros-diffs mailing list