|
|
//---------------------------------------------------------------------------
//
// Module: si.cpp
//
// Description:
//
// Start 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 CStartInfo::Create( PSTART_NODE pStartNode, PCONNECT_INFO pConnectInfo, PGRAPH_PIN_INFO pGraphPinInfo, PGRAPH_NODE pGraphNode ) { NTSTATUS Status = STATUS_SUCCESS; PSTART_INFO pStartInfo;
Assert(pGraphNode); Assert(pStartNode);
FOR_EACH_LIST_ITEM(&pGraphNode->lstStartInfo, pStartInfo) {
if(pStartInfo->GetPinInfo() == pStartNode->pPinNode->pPinInfo && pStartInfo->pConnectInfoHead == pConnectInfo) {
ASSERT(pStartInfo->pConnectInfoHead->IsSameGraph(pConnectInfo)); pStartInfo->AddRef(); goto exit; }
} END_EACH_LIST_ITEM
pStartInfo = new START_INFO( pStartNode->pPinNode->pPinInfo, pConnectInfo, pGraphPinInfo, pGraphNode);
if(pStartInfo == NULL) { Status = STATUS_INSUFFICIENT_RESOURCES; goto exit; } DPF2(80, "CStartInfo::Create %08x GN %08x", pStartInfo, pGraphNode); exit: pStartNode->pStartInfo = pStartInfo; return(Status); }
CStartInfo::CStartInfo( PPIN_INFO pPinInfo, PCONNECT_INFO pConnectInfo, PGRAPH_PIN_INFO pGraphPinInfo, PGRAPH_NODE pGraphNode ) { Assert(pGraphPinInfo); Assert(pGraphNode);
this->pPinInfo = pPinInfo; this->ulTopologyConnectionTableIndex = MAXULONG; this->ulVolumeNodeNumberPre = MAXULONG; this->ulVolumeNodeNumberSuperMix = MAXULONG; this->ulVolumeNodeNumberPost = MAXULONG; this->pGraphPinInfo = pGraphPinInfo; pGraphPinInfo->AddRef(); this->pConnectInfoHead = pConnectInfo; pConnectInfo->AddRef(); AddList(&pGraphNode->lstStartInfo); AddRef(); DPF2(80, "CStartInfo: %08x GN %08x", this, pGraphNode); }
CStartInfo::~CStartInfo( ) { DPF1(80, "~CStartInfo: %08x", this); Assert(this); RemoveList(); pGraphPinInfo->Destroy(); pConnectInfoHead->Destroy(); }
ENUMFUNC CStartInfo::CreatePinInfoConnection( PVOID pReference ) { PGRAPH_NODE pGraphNode = PGRAPH_NODE(pReference); PTOPOLOGY_CONNECTION pTopologyConnection = NULL; PCONNECT_INFO pConnectInfo; NTSTATUS Status;
Assert(this); Assert(pGraphNode);
for(pConnectInfo = GetFirstConnectInfo(); pConnectInfo != NULL; pConnectInfo = pConnectInfo->GetNextConnectInfo()) {
Assert(pConnectInfo); Status = ::CreatePinInfoConnection( &pTopologyConnection, NULL, pGraphNode, pConnectInfo->pPinInfoSource, pConnectInfo->pPinInfoSink);
if(!NT_SUCCESS(Status)) { Trap(); goto exit; } } Status = STATUS_CONTINUE; exit: return(Status); }
ENUMFUNC FindVolumeNode( IN PTOPOLOGY_CONNECTION pTopologyConnection, IN BOOL fToDirection, IN PSTART_INFO pStartInfo ) { PTOPOLOGY_PIN pTopologyPin;
Assert(pTopologyConnection);
// Need this check when called from EnumerateGraphTopology
if(IS_CONNECTION_TYPE(pTopologyConnection, GRAPH)) { return(STATUS_DEAD_END); }
if(fToDirection) { pTopologyPin = pTopologyConnection->pTopologyPinTo; } else { pTopologyPin = pTopologyConnection->pTopologyPinFrom; }
if(pTopologyPin == NULL) { return(STATUS_CONTINUE); }
if(IsEqualGUID(pTopologyPin->pTopologyNode->pguidType, &KSNODETYPE_SUM)) { return(STATUS_DEAD_END); }
if(IsEqualGUID(pTopologyPin->pTopologyNode->pguidType, &KSNODETYPE_MUX)) { return(STATUS_DEAD_END); }
if(IsEqualGUID( pTopologyPin->pTopologyNode->pguidType, &KSNODETYPE_SUPERMIX)) {
Assert(pStartInfo); pStartInfo->ulVolumeNodeNumberSuperMix = pTopologyPin->pTopologyNode->ulSysaudioNodeNumber;
DPF1(100, "FindVolumeNode: found supermix node: %02x", pStartInfo->ulVolumeNodeNumberSuperMix);
return(STATUS_CONTINUE); }
if(IsEqualGUID( pTopologyPin->pTopologyNode->pguidType, &KSNODETYPE_VOLUME)) {
Assert(pStartInfo); if(pStartInfo->ulVolumeNodeNumberSuperMix != MAXULONG) {
// Found a volume node after a super mix
pStartInfo->ulVolumeNodeNumberPost = pTopologyPin->pTopologyNode->ulSysaudioNodeNumber;
DPF1(100, "FindVolumeNode: found post node: %02x", pStartInfo->ulVolumeNodeNumberPost);
return(STATUS_SUCCESS); }
if(pStartInfo->ulVolumeNodeNumberPre == MAXULONG) {
// Found first volume node
pStartInfo->ulVolumeNodeNumberPre = pTopologyPin->pTopologyNode->ulSysaudioNodeNumber;
DPF1(100, "FindVolumeNode: found pre node: %02x", pStartInfo->ulVolumeNodeNumberPre); } } return(STATUS_CONTINUE); }
ENUMFUNC CStartInfo::EnumStartInfo( ) { Assert(this);
DPF3(100, "EnumStartInfo: %08x %d %s", this, GetPinInfo()->PinId, GetPinInfo()->pFilterNode->DumpName());
EnumerateGraphTopology( this, (TOP_PFN)FindVolumeNode, this);
return(STATUS_CONTINUE); }
//---------------------------------------------------------------------------
#ifdef DEBUG
ENUMFUNC CStartInfo::Dump( ) { PCONNECT_INFO pConnectInfo;
Assert(this); // .sgv or .so
if(ulDebugFlags & (DEBUG_FLAGS_VERBOSE | DEBUG_FLAGS_OBJECT)) { dprintf("SI: %08x cRef %08x PI %08x #%d %s\n", this, cReference, GetPinInfo(), GetPinInfo()->PinId, GetPinInfo()->pFilterNode->DumpName());
dprintf(" ulTopConnecTableIndex: %08x ulVolumeNodeNumberPre %08x\n", ulTopologyConnectionTableIndex, ulVolumeNodeNumberPre);
dprintf(" ulVolumeNodeNumberSup: %08x ulVolumeNodeNumberPost %08x\n", ulVolumeNodeNumberSuperMix, ulVolumeNodeNumberPost);
pGraphPinInfo->Dump(); } // .sg
else { dprintf("SI: %08x PI %08x P%-2d C%-1d #%d %s\n", this, GetPinInfo(), GetPinInstances()->PossibleCount, GetPinInstances()->CurrentCount, GetPinInfo()->PinId, GetPinInfo()->pFilterNode->DumpName()); } if(ulDebugFlags & DEBUG_FLAGS_GRAPH) { for(pConnectInfo = GetFirstConnectInfo(); pConnectInfo != NULL; pConnectInfo = pConnectInfo->GetNextConnectInfo()) {
pConnectInfo->Dump(); } } return(STATUS_CONTINUE); }
#endif
|