mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
194 lines
4.9 KiB
194 lines
4.9 KiB
//---------------------------------------------------------------------------
|
|
//
|
|
// Module: ci.cpp
|
|
//
|
|
// Description:
|
|
//
|
|
// Connect Info Class
|
|
//
|
|
//@@BEGIN_MSINTERNAL
|
|
// Development Team:
|
|
// Mike McLaughlin
|
|
//
|
|
// History: Date Author Comment
|
|
//
|
|
// To Do: 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.
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
#include "common.h"
|
|
|
|
//---------------------------------------------------------------------------
|
|
//---------------------------------------------------------------------------
|
|
|
|
NTSTATUS
|
|
CConnectInfo::Create(
|
|
PCONNECT_NODE pConnectNode,
|
|
PLOGICAL_FILTER_NODE pLogicalFilterNode,
|
|
PCONNECT_INFO pConnectInfoNext,
|
|
PGRAPH_PIN_INFO pGraphPinInfo,
|
|
ULONG ulFlagsCurrent,
|
|
PGRAPH_NODE pGraphNode
|
|
)
|
|
{
|
|
NTSTATUS Status = STATUS_SUCCESS;
|
|
PCONNECT_INFO pConnectInfo;
|
|
|
|
Assert(pGraphNode);
|
|
Assert(pConnectNode);
|
|
|
|
FOR_EACH_LIST_ITEM(&pGraphNode->lstConnectInfo, pConnectInfo) {
|
|
|
|
if(pConnectInfo->pPinInfoSource ==
|
|
pConnectNode->pPinNodeSource->pPinInfo &&
|
|
pConnectInfo->pPinInfoSink ==
|
|
pConnectNode->pPinNodeSink->pPinInfo) {
|
|
|
|
if(pConnectInfo->pConnectInfoNext->IsSameGraph(pConnectInfoNext)) {
|
|
pConnectInfo->AddRef();
|
|
ASSERT(NT_SUCCESS(Status));
|
|
goto exit;
|
|
}
|
|
}
|
|
|
|
} END_EACH_LIST_ITEM
|
|
|
|
pConnectInfo = new CONNECT_INFO(
|
|
pConnectNode,
|
|
pConnectInfoNext,
|
|
pGraphPinInfo,
|
|
pGraphNode);
|
|
|
|
if(pConnectInfo == NULL) {
|
|
Status = STATUS_INSUFFICIENT_RESOURCES;
|
|
goto exit;
|
|
}
|
|
if(ulFlagsCurrent & LFN_FLAGS_CONNECT_NORMAL_TOPOLOGY) {
|
|
BOOL fReserve = FALSE;
|
|
|
|
if(pLogicalFilterNode->GetOrder() <= ORDER_MIXER) {
|
|
pConnectInfo->ulFlags |= CI_FLAGS_LIMIT_FORMAT;
|
|
}
|
|
else {
|
|
pConnectInfo->ulFlags |= CI_FLAGS_CONNECT_TOP_DOWN;
|
|
}
|
|
//
|
|
// Reserve pins for the filters below the mixer or splitter (if one)
|
|
//
|
|
if(ulFlagsCurrent & LFN_FLAGS_CONNECT_CAPTURE) {
|
|
if(pLogicalFilterNode->GetOrder() <= ORDER_SPLITTER) {
|
|
pConnectInfo->ulFlags |= CI_FLAGS_REUSE_FILTER_INSTANCE;
|
|
if(gcSplitters > 0) {
|
|
fReserve = TRUE;
|
|
}
|
|
}
|
|
}
|
|
if(ulFlagsCurrent & LFN_FLAGS_CONNECT_RENDER) {
|
|
if(pLogicalFilterNode->GetOrder() <= ORDER_MIXER) {
|
|
pConnectInfo->ulFlags |= CI_FLAGS_REUSE_FILTER_INSTANCE;
|
|
if(gcMixers > 0) {
|
|
fReserve = TRUE;
|
|
}
|
|
}
|
|
}
|
|
if(fReserve) {
|
|
Status = pConnectInfo->ReservePinInstance(pGraphNode);
|
|
if(!NT_SUCCESS(Status)) {
|
|
Trap();
|
|
goto exit;
|
|
}
|
|
}
|
|
}
|
|
DPF2(80, "CConnectInfo::Create %08x GN %08x", pConnectInfo, pGraphNode);
|
|
exit:
|
|
pConnectNode->pConnectInfo = pConnectInfo;
|
|
return(Status);
|
|
}
|
|
|
|
CConnectInfo::CConnectInfo(
|
|
PCONNECT_NODE pConnectNode,
|
|
PCONNECT_INFO pConnectInfoNext,
|
|
PGRAPH_PIN_INFO pGraphPinInfo,
|
|
PGRAPH_NODE pGraphNode
|
|
)
|
|
{
|
|
Assert(pGraphNode);
|
|
Assert(pConnectNode);
|
|
|
|
this->pPinInfoSource = pConnectNode->pPinNodeSource->pPinInfo;
|
|
this->pPinInfoSink = pConnectNode->pPinNodeSink->pPinInfo;
|
|
this->pGraphPinInfo = pGraphPinInfo;
|
|
pGraphPinInfo->AddRef();
|
|
this->pConnectInfoNext = pConnectInfoNext;
|
|
pConnectInfoNext->AddRef();
|
|
AddList(&pGraphNode->lstConnectInfo);
|
|
AddRef();
|
|
DPF2(80, "CConnectInfo: %08x GN %08x", this, pGraphNode);
|
|
}
|
|
|
|
CConnectInfo::~CConnectInfo(
|
|
)
|
|
{
|
|
DPF1(80, "~CConnectInfo: %08x", this);
|
|
Assert(this);
|
|
RemoveList();
|
|
pGraphPinInfo->Destroy();
|
|
pConnectInfoNext->Destroy();
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
#ifdef DEBUG
|
|
|
|
ENUMFUNC
|
|
CConnectInfo::Dump(
|
|
)
|
|
{
|
|
// .sgv or .so
|
|
if(ulDebugFlags & (DEBUG_FLAGS_VERBOSE | DEBUG_FLAGS_OBJECT)) {
|
|
dprintf("CI: %08x cRef %08x CNI %08x%s%s%s%s\n",
|
|
this,
|
|
cReference,
|
|
pConnectNodeInstance,
|
|
IsTopDown() ? " TOP_DOWN" : "",
|
|
IsLimitFormat() ? " LIMIT" : "",
|
|
IsReuseFilterInstance() ? " REUSE" : "",
|
|
IsPinInstanceReserved() ? " RESERVED" : "");
|
|
}
|
|
// .sg
|
|
else {
|
|
dprintf("CI: %08x CNI %08x P%-2d C%-d%s%s%s%s\n",
|
|
this,
|
|
pConnectNodeInstance,
|
|
GetPinInstances()->PossibleCount,
|
|
GetPinInstances()->CurrentCount,
|
|
IsTopDown() ? " TOP_DOWN" : "",
|
|
IsLimitFormat() ? " LIMIT" : "",
|
|
IsReuseFilterInstance() ? " REUSE" : "",
|
|
IsPinInstanceReserved() ? " RESERVED" : "");
|
|
}
|
|
dprintf(" Source: %08x #%d %s\n",
|
|
pPinInfoSource,
|
|
pPinInfoSource->PinId,
|
|
pPinInfoSource->pFilterNode->DumpName());
|
|
dprintf(" Sink: %08x #%d %s\n",
|
|
pPinInfoSink,
|
|
pPinInfoSink->PinId,
|
|
pPinInfoSink->pFilterNode->DumpName());
|
|
|
|
if(ulDebugFlags & (DEBUG_FLAGS_VERBOSE | DEBUG_FLAGS_OBJECT)) {
|
|
pGraphPinInfo->Dump();
|
|
}
|
|
return(STATUS_CONTINUE);
|
|
}
|
|
|
|
#endif
|