- Implement IPortEvents interface for IPortTopology
authorJohannes Anderwald <johannes.anderwald@reactos.org>
Tue, 18 Aug 2009 08:24:09 +0000 (08:24 +0000)
committerJohannes Anderwald <johannes.anderwald@reactos.org>
Tue, 18 Aug 2009 08:24:09 +0000 (08:24 +0000)
- Fix a bug in the IPortEvents::QueryInterface handler of IPortWaveCyclic & IPortWavePci

svn path=/trunk/; revision=42762

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

index c98a818..6f3f30c 100644 (file)
@@ -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);
index 6a4408d..2fd2413 100644 (file)
@@ -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;
     }
index 63ccedf..621ad53 100644 (file)
@@ -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;
     }