diff --git a/reactos/lib/drivers/sound/mmixer/controls.c b/reactos/lib/drivers/sound/mmixer/controls.c index 0587e6083b9..13ba3169cb8 100644 --- a/reactos/lib/drivers/sound/mmixer/controls.c +++ b/reactos/lib/drivers/sound/mmixer/controls.c @@ -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); diff --git a/reactos/lib/drivers/sound/mmixer/sup.c b/reactos/lib/drivers/sound/mmixer/sup.c index beeb6e9a4c9..fd5e65e0a15 100644 --- a/reactos/lib/drivers/sound/mmixer/sup.c +++ b/reactos/lib/drivers/sound/mmixer/sup.c @@ -251,6 +251,13 @@ MMixerGetNodeIndexes( Connection++; } + if (!Count) + { + *NodeReferenceCount = 0; + *NodeReference = NULL; + return MM_STATUS_SUCCESS; + } + ASSERT(Count != 0); /* now allocate node index array */