[AUDIO-BRINGUP]
[reactos.git] / lib / drivers / sound / mmixer / topology.c
index 6113d1b..d5050e0 100644 (file)
@@ -14,23 +14,23 @@ MMixerPrintTopology(
 {
     ULONG Index, SubIndex;
 
-    DPRINT1("Num Pins %lu NumNodes %lu\n", Topology->TopologyPinsCount, Topology->TopologyNodesCount);
+    DPRINT("Num Pins %lu NumNodes %lu\n", Topology->TopologyPinsCount, Topology->TopologyNodesCount);
 
     for(Index = 0; Index < Topology->TopologyPinsCount; Index++)
     {
-        DPRINT1("PinId %lu NodesConnectedFromCount %lu NodesConnectedToCount %lu Visited %lu\n", Topology->TopologyPins[Index].PinId,
+        DPRINT("PinId %lu NodesConnectedFromCount %lu NodesConnectedToCount %lu Visited %lu\n", Topology->TopologyPins[Index].PinId,
             Topology->TopologyPins[Index].NodesConnectedFromCount, Topology->TopologyPins[Index].NodesConnectedToCount, Topology->TopologyPins[Index].Visited);
 
         for(SubIndex = 0; SubIndex < Topology->TopologyPins[Index].NodesConnectedFromCount; SubIndex++)
-            DPRINT1("NodesConnectedFrom Index %lu NodeId %lu\n", SubIndex, Topology->TopologyPins[Index].NodesConnectedFrom[SubIndex]->NodeIndex);
+            DPRINT("NodesConnectedFrom Index %lu NodeId %lu\n", SubIndex, Topology->TopologyPins[Index].NodesConnectedFrom[SubIndex]->NodeIndex);
 
         for(SubIndex = 0; SubIndex < Topology->TopologyPins[Index].NodesConnectedToCount; SubIndex++)
-            DPRINT1("NodesConnectedTo Index %lu NodeId %lu\n", SubIndex, Topology->TopologyPins[Index].NodesConnectedTo[SubIndex]->NodeIndex);
+            DPRINT("NodesConnectedTo Index %lu NodeId %lu\n", SubIndex, Topology->TopologyPins[Index].NodesConnectedTo[SubIndex]->NodeIndex);
     }
 
     for(Index = 0; Index < Topology->TopologyNodesCount; Index++)
     {
-        DPRINT1("NodeId %lu NodesConnectedFromCount %lu NodesConnectedToCount %lu Visited %lu PinConnectedFromCount %lu PinConnectedToCount %lu\n", Topology->TopologyNodes[Index].NodeIndex,
+        DPRINT("NodeId %lu NodesConnectedFromCount %lu NodesConnectedToCount %lu Visited %lu PinConnectedFromCount %lu PinConnectedToCount %lu\n", Topology->TopologyNodes[Index].NodeIndex,
             Topology->TopologyNodes[Index].NodeConnectedFromCount, Topology->TopologyNodes[Index].NodeConnectedToCount, Topology->TopologyNodes[Index].Visited,
             Topology->TopologyNodes[Index].PinConnectedFromCount, Topology->TopologyNodes[Index].PinConnectedToCount);
     }
@@ -264,7 +264,9 @@ MMixerHandleNodeToNodeConnection(
 {
     PTOPOLOGY_NODE InNode, OutNode;
     PTOPOLOGY_NODE * NewNodes;
+    PULONG NewLogicalPinNodeConnectedFrom;
     ULONG Count;
+    ULONG LogicalPinId;
 
     /* sanity checks */
     ASSERT(Topology->TopologyNodesCount > Connection->ToNode);
@@ -274,6 +276,9 @@ MMixerHandleNodeToNodeConnection(
     InNode = &Topology->TopologyNodes[Connection->FromNode];
     OutNode = &Topology->TopologyNodes[Connection->ToNode];
 
+    /* get logical pin node id */
+    LogicalPinId = Connection->ToNodePin;
+
     /* get existing count */
     Count = OutNode->NodeConnectedFromCount;
 
@@ -286,21 +291,42 @@ MMixerHandleNodeToNodeConnection(
         return MM_STATUS_NO_MEMORY;
     }
 
+    /* allocate logical pin nodes array */
+    NewLogicalPinNodeConnectedFrom = MixerContext->Alloc((Count + 1) * sizeof(ULONG));
+    if (!NewLogicalPinNodeConnectedFrom)
+    {
+        /* out of memory */
+        MixerContext->Free(NewNodes);
+        return MM_STATUS_NO_MEMORY;
+    }
+
     if (Count)
     {
         /* copy existing nodes */
         MixerContext->Copy(NewNodes, OutNode->NodeConnectedFrom, sizeof(PTOPOLOGY) * Count);
 
+        /* copy existing logical pin node array */
+        MixerContext->Copy(NewLogicalPinNodeConnectedFrom, OutNode->LogicalPinNodeConnectedFrom, sizeof(ULONG) * Count);
+
         /* release old nodes array */
         MixerContext->Free(OutNode->NodeConnectedFrom);
+
+        /* release old logical pin node array */
+        MixerContext->Free(OutNode->LogicalPinNodeConnectedFrom);
     }
 
     /* add new topology node */
     NewNodes[OutNode->NodeConnectedFromCount] = InNode;
 
+    /* add logical node id */
+    NewLogicalPinNodeConnectedFrom[OutNode->NodeConnectedFromCount] = LogicalPinId;
+
     /* replace old nodes array */
     OutNode->NodeConnectedFrom = NewNodes;
 
+    /* replace old logical pin node array */
+    OutNode->LogicalPinNodeConnectedFrom = NewLogicalPinNodeConnectedFrom;
+
     /* increment nodes count */
     OutNode->NodeConnectedFromCount++;
 
@@ -745,16 +771,15 @@ MMixerGetUpOrDownstreamNodes(
         /* node should not have been visited */
         ASSERT(Node->Visited == FALSE);
 
+        /* mark node as visited */
+        TopologyNode->Visited = TRUE;
+
         /* add them to node array */
         MMixerAddPinIndexToArray(MixerContext, Node->NodeIndex, Topology->TopologyNodesCount, OutNodeCount, OutNodes);
 
         /* recursively visit them */
         MMixerGetUpOrDownstreamNodes(MixerContext, Topology, TopologyNodes[Index], bUpStream, OutNodeCount, OutNodes);
     }
-
-    /* mark node as visited */
-    TopologyNode->Visited = TRUE;
-
 }
 
 MIXER_STATUS
@@ -983,6 +1008,15 @@ MMixerGetNextNodesFromNodeIndex(
     *OutNodesCount = TopologyNodesCount;
 }
 
+VOID
+MMixerGetTopologyPinCount(
+    IN PTOPOLOGY Topology,
+    OUT PULONG PinCount)
+{
+    /* store pin count */
+    *PinCount = Topology->TopologyPinsCount;
+}
+
 MIXER_STATUS
 MMixerAllocateTopologyPinArray(
     IN PMIXER_CONTEXT MixerContext,