36 DPRINT(
"NodeId %lu NodesConnectedFromCount %lu NodesConnectedToCount %lu Visited %lu PinConnectedFromCount %lu PinConnectedToCount %lu\n", Topology->
TopologyNodes[
Index].
NodeIndex,
96 *OutTopology = Topology;
111 Topology->TopologyNodes[
Index].Visited =
FALSE;
117 Topology->TopologyPins[
Index].Visited =
FALSE;
131 ASSERT(Topology->TopologyNodesCount == NodeTypes->Count);
134 Guids = (
LPGUID)(NodeTypes + 1);
139 Topology->TopologyNodes[
Index].NodeIndex =
Index;
154 PULONG NewPinsIndex, OldPinsIndex;
161 OldNodes =
Pin->NodesConnectedTo;
166 Count =
Pin->NodesConnectedFromCount;
167 OldNodes =
Pin->NodesConnectedFrom;
194 Pin->NodesConnectedTo = NewNodes;
197 Pin->NodesConnectedToCount++;
203 OldPinsIndex =
Node->PinConnectedFrom;
208 Pin->NodesConnectedFrom = NewNodes;
211 Pin->NodesConnectedFromCount++;
217 OldPinsIndex =
Node->PinConnectedTo;
244 Node->PinConnectedFrom = NewPinsIndex;
247 Node->PinConnectedFromCount++;
252 Node->PinConnectedTo = NewPinsIndex;
255 Node->PinConnectedToCount++;
270 PULONG NewLogicalPinNodeConnectedFrom;
275 ASSERT(Topology->TopologyNodesCount > Connection->ToNode);
276 ASSERT(Topology->TopologyNodesCount > Connection->FromNode);
279 InNode = &Topology->TopologyNodes[Connection->FromNode];
280 OutNode = &Topology->TopologyNodes[Connection->ToNode];
283 LogicalPinId = Connection->ToNodePin;
299 if (!NewLogicalPinNodeConnectedFrom)
380 Count = InPin->PinConnectedToCount;
401 NewPinsIndex[
Count] = OutPin->PinId;
404 InPin->PinConnectedTo = NewPinsIndex;
407 InPin->PinConnectedToCount++;
410 Count = OutPin->PinConnectedFromCount;
431 NewPinsIndex[
Count] = InPin->PinId;
434 OutPin->PinConnectedFrom = NewPinsIndex;
437 OutPin->PinConnectedFromCount++;
459 ASSERT(Topology->TopologyPinsCount > Connection->FromNodePin);
460 ASSERT(Topology->TopologyPinsCount > Connection->ToNodePin);
464 &Topology->TopologyPins[Connection->FromNodePin],
465 &Topology->TopologyPins[Connection->ToNodePin]);
473 ASSERT(Topology->TopologyPinsCount > Connection->FromNodePin);
474 ASSERT(Topology->TopologyNodesCount > Connection->ToNode);
478 Pin = &Topology->TopologyPins[Connection->FromNodePin];
481 Node = &Topology->TopologyNodes[Connection->ToNode];
484 Pin->PinId = Connection->FromNodePin;
498 ASSERT(Topology->TopologyPinsCount > Connection->ToNodePin);
499 ASSERT(Topology->TopologyNodesCount > Connection->FromNode);
503 Pin = &Topology->TopologyPins[Connection->ToNodePin];
506 Node = &Topology->TopologyNodes[Connection->FromNode];
509 Pin->PinId = Connection->ToNodePin;
535 ASSERT(Topology->TopologyNodesCount == NodeTypes->Count);
584 if (OutPins[
Index] > PinId)
590 OutPins[
Index] = PinId;
602 OutPins[
Index] = PinId;
633 PinsCount = TopologyNode->PinConnectedFromCount;
634 Pins = TopologyNode->PinConnectedFrom;
636 TopologyNodesCount = TopologyNode->NodeConnectedFromCount;
642 PinsCount = TopologyNode->PinConnectedToCount;
643 Pins = TopologyNode->PinConnectedTo;
645 TopologyNodesCount = TopologyNode->NodeConnectedToCount;
656 Pin = &Topology->TopologyPins[Pins[
Index]];
682 TopologyNode->Visited =
TRUE;
727 ASSERT(Topology->TopologyNodesCount > NodeIndex);
730 TopologyNode = &Topology->TopologyNodes[NodeIndex];
751 TopologyNodesCount = TopologyNode->NodeConnectedFromCount;
757 TopologyNodesCount = TopologyNode->NodeConnectedToCount;
774 TopologyNode->Visited =
TRUE;
799 ASSERT(Topology->TopologyNodesCount > NodeIndex);
802 TopologyNode = &Topology->TopologyNodes[NodeIndex];
821 ULONG Index, TopologyNodesCount, TopologyPinsCount;
827 Pin = &Topology->TopologyPins[PinIndex];
833 TopologyNodesCount =
Pin->NodesConnectedFromCount;
836 TopologyPins =
Pin->PinConnectedFrom;
837 TopologyPinsCount =
Pin->PinConnectedFromCount;
844 TopologyNodesCount =
Pin->NodesConnectedToCount;
847 TopologyPins =
Pin->PinConnectedTo;
848 TopologyPinsCount =
Pin->PinConnectedToCount;
856 ASSERT(Topology->TopologyPinsCount > PinIndex);
894 Pin = &Topology->TopologyPins[PinIndex];
900 TopologyNodesCount =
Pin->NodesConnectedFromCount;
906 TopologyNodesCount =
Pin->NodesConnectedToCount;
914 ASSERT(Topology->TopologyPinsCount > PinIndex);
939 ULONG TopologyNodesCount;
943 ASSERT(PinIndex < Topology->TopologyPinsCount);
946 Pin = &Topology->TopologyPins[PinIndex];
952 TopologyNodesCount =
Pin->NodesConnectedFromCount;
958 TopologyNodesCount =
Pin->NodesConnectedToCount;
968 *OutNodesCount = TopologyNodesCount;
981 ULONG TopologyNodesCount;
985 ASSERT(NodeIndex < Topology->TopologyNodesCount);
990 TopologyNodes = Topology->TopologyNodes[NodeIndex].NodeConnectedFrom;
991 TopologyNodesCount = Topology->TopologyNodes[NodeIndex].NodeConnectedFromCount;
996 TopologyNodes = Topology->TopologyNodes[NodeIndex].NodeConnectedTo;
997 TopologyNodesCount = Topology->TopologyNodes[NodeIndex].NodeConnectedToCount;
1007 *OutNodesCount = TopologyNodesCount;
1016 *
PinCount = Topology->TopologyPinsCount;
1029 ASSERT(Topology->TopologyPinsCount != 0);
1061 ASSERT(Topology->TopologyNodesCount != 0);
1090 ASSERT(NodeIndex < Topology->TopologyNodesCount);
1093 if (Topology->TopologyNodes[NodeIndex].NodeConnectedFromCount > 1)
1096 *bTerminator =
TRUE;
1107 *bTerminator =
TRUE;
1115 *bTerminator =
FALSE;
1149 if (Pins[
Index] == PinId)
1175 ASSERT(NodeIndex < Topology->TopologyNodesCount);
1178 Node = &Topology->TopologyNodes[NodeIndex];
1187 *OutPinCount =
Node->NodeConnectedFromCount;
1196 ASSERT(NodeIndex < Topology->TopologyNodesCount);
1198 return &Topology->TopologyNodes[NodeIndex].NodeType;
1207 ASSERT(PinId < Topology->TopologyPinsCount);
1210 Topology->TopologyPins[PinId].Reserved =
TRUE;
1220 ASSERT(PinId < Topology->TopologyPinsCount);
1223 *bReserved = Topology->TopologyPins[PinId].Reserved;
1232 ASSERT(NodeIndex < Topology->TopologyNodesCount);
1235 Topology->TopologyNodes[NodeIndex].Reserved =
TRUE;
1245 ASSERT(NodeIndex < Topology->TopologyNodesCount);
1248 *bReserved = Topology->TopologyNodes[NodeIndex].Reserved;
1287 *OutTopology = Topology;
MIXER_CONTEXT MixerContext
IN PDCB IN VBO IN ULONG IN BOOLEAN Pin
static PCNODE_DESCRIPTOR TopologyNodes[]
@ MM_STATUS_INVALID_PARAMETER
struct __TOPOLOGY_NODE__ * PTOPOLOGY_NODE
struct TOPOLOGY * PTOPOLOGY
VOID MMixerPrintTopology()
VOID MMixerGetNextNodesFromPinIndex(IN PMIXER_CONTEXT MixerContext, IN PTOPOLOGY Topology, IN ULONG PinIndex, IN ULONG bUpStream, OUT PULONG OutNodesCount, OUT PULONG OutNodes)
VOID MMixerGetTopologyPinCount(IN PTOPOLOGY Topology, OUT PULONG PinCount)
VOID MMixerIsTopologyPinReserved(IN PTOPOLOGY Topology, IN ULONG PinId, OUT PULONG bReserved)
VOID MMixerGetUpOrDownstreamNodes(IN PMIXER_CONTEXT MixerContext, IN PTOPOLOGY Topology, IN PTOPOLOGY_NODE TopologyNode, IN ULONG bUpStream, OUT PULONG OutNodeCount, OUT PULONG OutNodes)
MIXER_STATUS MMixerAddPinConnection(IN PMIXER_CONTEXT MixerContext, IN PPIN Pin, IN PTOPOLOGY_NODE Node, IN ULONG bPinToNode)
MIXER_STATUS MMixerAllocateTopologyNodeArray(IN PMIXER_CONTEXT MixerContext, IN PTOPOLOGY Topology, OUT PULONG *OutNodes)
ULONG MMixerGetNodeIndexFromGuid(IN PTOPOLOGY Topology, IN const GUID *NodeType)
VOID MMixerGetAllUpOrDownstreamNodesFromPinIndex(IN PMIXER_CONTEXT MixerContext, IN PTOPOLOGY Topology, IN ULONG PinIndex, IN ULONG bUpStream, OUT PULONG OutNodesCount, OUT PULONG OutNodes)
VOID MMixerAddPinIndexToArray(IN PMIXER_CONTEXT MixerContext, IN ULONG PinId, IN ULONG MaxPins, OUT PULONG OutPinCount, OUT PULONG OutPins)
VOID MMixerIsTopologyNodeReserved(IN PTOPOLOGY Topology, IN ULONG NodeIndex, OUT PULONG bReserved)
VOID MMixerIsNodeTerminator(IN PTOPOLOGY Topology, IN ULONG NodeIndex, OUT ULONG *bTerminator)
MIXER_STATUS MMixerExploreTopology(IN PMIXER_CONTEXT MixerContext, IN PKSMULTIPLE_ITEM NodeConnections, IN PKSMULTIPLE_ITEM NodeTypes, IN OUT PTOPOLOGY Topology)
VOID MMixerSetTopologyPinReserved(IN PTOPOLOGY Topology, IN ULONG PinId)
MIXER_STATUS MMixerGetAllUpOrDownstreamNodesFromNodeIndex(IN PMIXER_CONTEXT MixerContext, IN PTOPOLOGY Topology, IN ULONG NodeIndex, IN ULONG bUpStream, OUT PULONG OutNodesCount, OUT PULONG OutNodes)
MIXER_STATUS MMixerHandleNodeToNodeConnection(IN PMIXER_CONTEXT MixerContext, IN PKSTOPOLOGY_CONNECTION Connection, IN OUT PTOPOLOGY Topology)
VOID MMixerResetTopologyVisitStatus(IN OUT PTOPOLOGY Topology)
VOID MMixerGetAllUpOrDownstreamPinsFromNodeIndex(IN PMIXER_CONTEXT MixerContext, IN PTOPOLOGY Topology, IN ULONG NodeIndex, IN ULONG bUpStream, OUT PULONG OutPinsCount, OUT PULONG OutPins)
VOID MMixerGetConnectedFromLogicalTopologyPins(IN PTOPOLOGY Topology, IN ULONG NodeIndex, OUT PULONG OutPinCount, OUT PULONG OutPins)
LPGUID MMixerGetNodeTypeFromTopology(IN PTOPOLOGY Topology, IN ULONG NodeIndex)
MIXER_STATUS MMixerAddPinToPinConnection(IN PMIXER_CONTEXT MixerContext, IN OUT PPIN InPin, IN OUT PPIN OutPin)
MIXER_STATUS MMixerCreateTopology(IN PMIXER_CONTEXT MixerContext, IN ULONG PinCount, IN PKSMULTIPLE_ITEM NodeConnections, IN PKSMULTIPLE_ITEM NodeTypes, OUT PTOPOLOGY *OutTopology)
VOID MMixerGetUpOrDownStreamPins(IN PMIXER_CONTEXT MixerContext, IN PTOPOLOGY Topology, IN PTOPOLOGY_NODE TopologyNode, IN ULONG bUpStream, OUT PULONG OutPinCount, OUT PULONG OutPins)
VOID MMixerInitializeTopologyNodes(IN PMIXER_CONTEXT MixerContext, IN PKSMULTIPLE_ITEM NodeTypes, IN OUT PTOPOLOGY Topology)
VOID MMixerGetNextNodesFromNodeIndex(IN PMIXER_CONTEXT MixerContext, IN PTOPOLOGY Topology, IN ULONG NodeIndex, IN ULONG bUpStream, OUT PULONG OutNodesCount, OUT PULONG OutNodes)
MIXER_STATUS MMixerAllocateTopology(IN PMIXER_CONTEXT MixerContext, IN ULONG NodesCount, IN ULONG PinCount, OUT PTOPOLOGY *OutTopology)
MIXER_STATUS MMixerIsNodeConnectedToPin(IN PMIXER_CONTEXT MixerContext, IN PTOPOLOGY Topology, IN ULONG NodeIndex, IN ULONG PinId, IN ULONG bUpStream, OUT PULONG bConnected)
MIXER_STATUS MMixerHandleNodePinConnection(IN PMIXER_CONTEXT MixerContext, IN PKSTOPOLOGY_CONNECTION Connection, IN OUT PTOPOLOGY Topology)
MIXER_STATUS MMixerAllocateTopologyPinArray(IN PMIXER_CONTEXT MixerContext, IN PTOPOLOGY Topology, OUT PULONG *OutPins)
MIXER_STATUS MMixerGetAllUpOrDownstreamPinsFromPinIndex(IN PMIXER_CONTEXT MixerContext, IN PTOPOLOGY Topology, IN ULONG PinIndex, IN ULONG bUpStream, OUT PULONG OutPinsCount, OUT PULONG OutPins)
VOID MMixerSetTopologyNodeReserved(IN PTOPOLOGY Topology, IN ULONG NodeIndex)
_In_ const GUID _In_ ULONG PinCount
ULONG NodesConnectedToCount
PTOPOLOGY_NODE * NodesConnectedFrom
ULONG NodesConnectedFromCount
PTOPOLOGY_NODE * NodesConnectedTo
PTOPOLOGY_NODE TopologyNodes
ULONG PinConnectedFromCount
ULONG NodeConnectedFromCount
struct __TOPOLOGY_NODE__ ** NodeConnectedFrom
ULONG NodeConnectedToCount
PULONG LogicalPinNodeConnectedFrom
ULONG PinConnectedToCount
struct __TOPOLOGY_NODE__ ** NodeConnectedTo
struct KSTOPOLOGY_CONNECTION * PKSTOPOLOGY_CONNECTION
_In_ WDFCOLLECTION _In_ ULONG Index
#define IsEqualGUIDAligned(guid1, guid2)