171 lines
4.5 KiB
C
171 lines
4.5 KiB
C
|
//---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Module: gni.h
|
||
|
//
|
||
|
// Description: Graph Node Instance Class
|
||
|
//
|
||
|
//
|
||
|
//@@BEGIN_MSINTERNAL
|
||
|
// Development Team:
|
||
|
// Mike McLaughlin
|
||
|
//
|
||
|
// History: Date Author Comment
|
||
|
//
|
||
|
//@@END_MSINTERNAL
|
||
|
//---------------------------------------------------------------------------
|
||
|
//
|
||
|
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
|
||
|
// KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||
|
// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
|
||
|
// PURPOSE.
|
||
|
//
|
||
|
// Copyright (c) 1996-1999 Microsoft Corporation. All Rights Reserved.
|
||
|
//
|
||
|
//---------------------------------------------------------------------------
|
||
|
|
||
|
//---------------------------------------------------------------------------
|
||
|
// Constants and Macros
|
||
|
//---------------------------------------------------------------------------
|
||
|
|
||
|
#define cTopologyNodes Topology.TopologyNodesCount
|
||
|
#define cTopologyConnections Topology.TopologyConnectionsCount
|
||
|
|
||
|
//---------------------------------------------------------------------------
|
||
|
// Classes
|
||
|
//---------------------------------------------------------------------------
|
||
|
|
||
|
typedef class CGraphNodeInstance : public CListDoubleItem
|
||
|
{
|
||
|
public:
|
||
|
CGraphNodeInstance(
|
||
|
PGRAPH_NODE pGraphNode,
|
||
|
PFILTER_INSTANCE pFilterInstance
|
||
|
);
|
||
|
CGraphNodeInstance(
|
||
|
PGRAPH_NODE pGraphNode
|
||
|
);
|
||
|
~CGraphNodeInstance();
|
||
|
NTSTATUS Create();
|
||
|
ENUMFUNC Destroy()
|
||
|
{
|
||
|
Assert(this);
|
||
|
delete this;
|
||
|
return(STATUS_CONTINUE);
|
||
|
};
|
||
|
NTSTATUS GetTopologyNodeFileObject(
|
||
|
OUT PFILE_OBJECT *ppFileObject,
|
||
|
IN ULONG NodeId
|
||
|
);
|
||
|
BOOL IsGraphValid(
|
||
|
PSTART_NODE pStartNode,
|
||
|
ULONG PinId
|
||
|
);
|
||
|
VOID AddTopologyConnection(
|
||
|
ULONG ulFromNode,
|
||
|
ULONG ulFromPin,
|
||
|
ULONG ulToNode,
|
||
|
ULONG ulToPin
|
||
|
);
|
||
|
NTSTATUS GetPinInstances(
|
||
|
PIRP pIrp,
|
||
|
PKSP_PIN pPin,
|
||
|
PKSPIN_CINSTANCES pcInstances
|
||
|
);
|
||
|
BOOL IsPinInstances(
|
||
|
ULONG ulPinId
|
||
|
);
|
||
|
private:
|
||
|
NTSTATUS CreatePinDescriptors();
|
||
|
VOID DestroyPinDescriptors();
|
||
|
NTSTATUS CreateSysAudioTopology();
|
||
|
VOID DestroySysAudioTopology();
|
||
|
VOID CreateTopologyTables();
|
||
|
VOID ProcessLogicalFilterNodeTopologyNode(
|
||
|
PLIST_MULTI_LOGICAL_FILTER_NODE plstLogicalFilterNode,
|
||
|
NTSTATUS (CTopologyNode::*Function)(
|
||
|
PVOID pGraphNodeInstance
|
||
|
)
|
||
|
);
|
||
|
VOID ProcessLogicalFilterNodeTopologyConnection(
|
||
|
PLIST_MULTI_LOGICAL_FILTER_NODE plstLogicalFilterNode,
|
||
|
NTSTATUS (CTopologyConnection::*Function)(
|
||
|
PVOID pGraphNodeInstance
|
||
|
)
|
||
|
);
|
||
|
public:
|
||
|
#ifdef DEBUG
|
||
|
ENUMFUNC Dump();
|
||
|
VOID DumpPinDescriptors();
|
||
|
#endif
|
||
|
LIST_DATA_TOPOLOGY_NODE lstTopologyNodeGlobalSelect;
|
||
|
LIST_START_NODE_INSTANCE lstStartNodeInstance;
|
||
|
PFILTER_INSTANCE pFilterInstance;
|
||
|
PGRAPH_NODE pGraphNode;
|
||
|
KSTOPOLOGY Topology;
|
||
|
ULONG cPins;
|
||
|
|
||
|
// Index by pin number
|
||
|
PKSPIN_CINSTANCES pacPinInstances;
|
||
|
PULONG pulPinFlags;
|
||
|
PKSPIN_DESCRIPTOR paPinDescriptors;
|
||
|
PLIST_DATA_START_NODE *aplstStartNode;
|
||
|
PLIST_DATA_TOPOLOGY_NODE palstTopologyNodeSelect;
|
||
|
PLIST_DATA_TOPOLOGY_NODE palstTopologyNodeNotSelect;
|
||
|
|
||
|
// Index by node number
|
||
|
PTOPOLOGY_NODE *papTopologyNode;
|
||
|
PFILTER_NODE_INSTANCE *papFilterNodeInstanceTopologyTable;
|
||
|
|
||
|
// Index by virtual source index
|
||
|
ULONG *paulNodeNumber;
|
||
|
private:
|
||
|
ULONG ulFlags;
|
||
|
public:
|
||
|
DefineSignature(0x20494E47); // GNI
|
||
|
|
||
|
} GRAPH_NODE_INSTANCE, *PGRAPH_NODE_INSTANCE;
|
||
|
|
||
|
//---------------------------------------------------------------------------
|
||
|
|
||
|
typedef ListDoubleDestroy<GRAPH_NODE_INSTANCE> LIST_GRAPH_NODE_INSTANCE;
|
||
|
|
||
|
//---------------------------------------------------------------------------
|
||
|
// Local prototypes
|
||
|
//---------------------------------------------------------------------------
|
||
|
|
||
|
extern "C" {
|
||
|
|
||
|
NTSTATUS
|
||
|
CreateIdentifierArray(
|
||
|
PLIST_DATA_START_NODE pldhStartNode,
|
||
|
PULONG pulCount,
|
||
|
PKSIDENTIFIER *ppIdentifier,
|
||
|
PKSIDENTIFIER (*GetFunction)(
|
||
|
PSTART_NODE pStartNode
|
||
|
)
|
||
|
);
|
||
|
|
||
|
PKSDATARANGE
|
||
|
GetStartNodeDataRange(
|
||
|
PSTART_NODE pStartNode
|
||
|
);
|
||
|
|
||
|
PKSIDENTIFIER
|
||
|
GetStartNodeInterface(
|
||
|
PSTART_NODE pStartNode
|
||
|
);
|
||
|
|
||
|
PKSIDENTIFIER
|
||
|
GetStartNodeMedium(
|
||
|
PSTART_NODE pStartNode
|
||
|
);
|
||
|
|
||
|
ENUMFUNC
|
||
|
FindTopologyNode(
|
||
|
IN PTOPOLOGY_CONNECTION pTopologyConnection,
|
||
|
IN BOOL fToDirection,
|
||
|
IN PTOPOLOGY_NODE pTopologyNode
|
||
|
);
|
||
|
|
||
|
} // extern "C"
|