- 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
This commit is contained in:
Johannes Anderwald 2009-12-13 11:32:44 +00:00
parent 5ed5d97905
commit a20e1844ce
2 changed files with 35 additions and 11 deletions

View file

@ -96,6 +96,12 @@ MMixerGetControlsFromPinByConnectionIndex(
else else
NodeIndex = CurConnection->ToNode; NodeIndex = CurConnection->ToNode;
if (NodeIndex > NodeTypes->Count)
{
// reached end of pin connection
return MM_STATUS_SUCCESS;
}
/* get target node type of current connection */ /* get target node type of current connection */
NodeType = MMixerGetNodeType(NodeTypes, NodeIndex); NodeType = MMixerGetNodeType(NodeTypes, NodeIndex);
@ -124,7 +130,7 @@ MMixerGetControlsFromPinByConnectionIndex(
Status = MMixerGetNodeIndexes(MixerContext, NodeConnections, NodeIndex, TRUE, TRUE, &NodeConnectionCount, &NodeConnection); 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++) for(Index = 0; Index < NodeConnectionCount; Index++)
{ {
@ -332,6 +338,7 @@ MMixerAddMixerSourceLine(
LPWSTR PinName; LPWSTR PinName;
GUID NodeType; GUID NodeType;
ULONG BytesReturned, ControlCount, Index; ULONG BytesReturned, ControlCount, Index;
LPGUID Node;
PULONG Nodes; PULONG Nodes;
if (!bTargetPin) if (!bTargetPin)
@ -414,8 +421,14 @@ MMixerAddMixerSourceLine(
{ {
if (Nodes[Index]) if (Nodes[Index])
{ {
// found a node // get node type
ControlCount++; 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]) if (Nodes[Index])
{ {
/* store the node index for retrieving / setting details */ // get node type
SrcLine->NodeIds[ControlCount] = Index; Node = MMixerGetNodeType(NodeTypes, Index);
Status = MMixerAddMixerControl(MixerContext, MixerInfo, hDevice, NodeTypes, Index, SrcLine, &SrcLine->LineControls[ControlCount]); if (MMixerGetControlTypeFromTopologyNode(Node))
if (Status == MM_STATUS_SUCCESS)
{ {
/* increment control count on success */ /* store the node index for retrieving / setting details */
ControlCount++; 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; return Status;
} }
RtlZeroMemory(Pins, sizeof(ULONG) * PinCount); RtlZeroMemory(Pins, sizeof(ULONG) * PinCount);
// now get the target pins of the ADC / DAC node // now get the target pins of the ADC / DAC node
Status = MMixerGetTargetPins(MixerContext, NodeTypes, NodeConnections, NodeIndex, bInputMixer, Pins, PinCount); Status = MMixerGetTargetPins(MixerContext, NodeTypes, NodeConnections, NodeIndex, bInputMixer, Pins, PinCount);

View file

@ -251,6 +251,13 @@ MMixerGetNodeIndexes(
Connection++; Connection++;
} }
if (!Count)
{
*NodeReferenceCount = 0;
*NodeReference = NULL;
return MM_STATUS_SUCCESS;
}
ASSERT(Count != 0); ASSERT(Count != 0);
/* now allocate node index array */ /* now allocate node index array */