[MMIXER]
authorJohannes Anderwald <johannes.anderwald@reactos.org>
Sun, 13 Dec 2009 11:32:44 +0000 (11:32 +0000)
committerJohannes Anderwald <johannes.anderwald@reactos.org>
Sun, 13 Dec 2009 11:32:44 +0000 (11:32 +0000)
- Add more error checks
- Fix a bug MMixerGetControlsFromPinByConnectionIndex which pre-early stopped the enumeration of mixer controls
- Only add guids which can be later be resolved to mixer control
- Check if no a topology connection has no links connected

svn path=/trunk/; revision=44559

reactos/lib/drivers/sound/mmixer/controls.c
reactos/lib/drivers/sound/mmixer/sup.c

index 0587e60..13ba316 100644 (file)
@@ -96,6 +96,12 @@ MMixerGetControlsFromPinByConnectionIndex(
     else
         NodeIndex = CurConnection->ToNode;
 
+    if (NodeIndex > NodeTypes->Count)
+    {
+        // reached end of pin connection
+        return MM_STATUS_SUCCESS;
+    }
+
     /* get target node type of current connection */
     NodeType = MMixerGetNodeType(NodeTypes, NodeIndex);
 
@@ -124,7 +130,7 @@ MMixerGetControlsFromPinByConnectionIndex(
         Status = MMixerGetNodeIndexes(MixerContext, NodeConnections, NodeIndex, TRUE, TRUE, &NodeConnectionCount, &NodeConnection);
     }
 
-    if (Status != MM_STATUS_SUCCESS)
+    if (Status == MM_STATUS_SUCCESS)
     {
         for(Index = 0; Index < NodeConnectionCount; Index++)
         {
@@ -332,6 +338,7 @@ MMixerAddMixerSourceLine(
     LPWSTR PinName;
     GUID NodeType;
     ULONG BytesReturned, ControlCount, Index;
+    LPGUID Node;
     PULONG Nodes;
 
     if (!bTargetPin)
@@ -414,8 +421,14 @@ MMixerAddMixerSourceLine(
     {
         if (Nodes[Index])
         {
-            // found a node
-            ControlCount++;
+            // get node type
+            Node = MMixerGetNodeType(NodeTypes, Index);
+
+            if (MMixerGetControlTypeFromTopologyNode(Node))
+            {
+                // found a node which can be resolved to a type
+                ControlCount++;
+            }
         }
     }
 
@@ -457,14 +470,20 @@ MMixerAddMixerSourceLine(
         {
             if (Nodes[Index])
             {
-                /* store the node index for retrieving / setting details */
-                SrcLine->NodeIds[ControlCount] = Index;
+                // get node type
+                Node = MMixerGetNodeType(NodeTypes, Index);
 
-                Status = MMixerAddMixerControl(MixerContext, MixerInfo, hDevice, NodeTypes, Index, SrcLine, &SrcLine->LineControls[ControlCount]);
-                if (Status == MM_STATUS_SUCCESS)
+                if (MMixerGetControlTypeFromTopologyNode(Node))
                 {
-                    /* increment control count on success */
-                    ControlCount++;
+                    /* store the node index for retrieving / setting details */
+                    SrcLine->NodeIds[ControlCount] = Index;
+
+                    Status = MMixerAddMixerControl(MixerContext, MixerInfo, hDevice, NodeTypes, Index, SrcLine, &SrcLine->LineControls[ControlCount]);
+                    if (Status == MM_STATUS_SUCCESS)
+                    {
+                        /* increment control count on success */
+                        ControlCount++;
+                    }
                 }
             }
         }
@@ -902,8 +921,6 @@ MMixerInitializeFilter(
         return Status;
     }
 
-
-
     RtlZeroMemory(Pins, sizeof(ULONG) * PinCount);
     // now get the target pins of the ADC / DAC node
     Status = MMixerGetTargetPins(MixerContext, NodeTypes, NodeConnections, NodeIndex, bInputMixer, Pins, PinCount);
index beeb6e9..fd5e65e 100644 (file)
@@ -251,6 +251,13 @@ MMixerGetNodeIndexes(
         Connection++;
     }
 
+    if (!Count)
+    {
+        *NodeReferenceCount = 0;
+        *NodeReference = NULL;
+        return MM_STATUS_SUCCESS;
+    }
+
     ASSERT(Count != 0);
 
     /* now allocate node index array */