//---------------------------------------------------------------------------
//
//  Module:   vsl.cpp
//
//  Description:
//
//	Virtual Source Line 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"

//---------------------------------------------------------------------------

PLIST_VIRTUAL_SOURCE_LINE gplstVirtualSourceLine = NULL;
ULONG gcVirtualSources = 0;

//---------------------------------------------------------------------------
//---------------------------------------------------------------------------

#pragma INIT_CODE
#pragma INIT_DATA

NTSTATUS
InitializeVirtualSourceLine(
)
{
    if(gplstVirtualSourceLine == NULL) {
	gplstVirtualSourceLine = new LIST_VIRTUAL_SOURCE_LINE;
	if(gplstVirtualSourceLine == NULL) {
	    return(STATUS_INSUFFICIENT_RESOURCES);
	}
    }
    return(STATUS_SUCCESS);
}

#pragma PAGEABLE_CODE
#pragma PAGEABLE_DATA

VOID
UninitializeVirtualSourceLine(
)
{
    delete gplstVirtualSourceLine;
    gplstVirtualSourceLine = NULL;
}

//---------------------------------------------------------------------------

CVirtualSourceLine::CVirtualSourceLine(
    PSYSAUDIO_CREATE_VIRTUAL_SOURCE pCreateVirtualSource
)
{
    ASSERT(gplstVirtualSourceLine != NULL);
    //
    // NOTE: Virtual pins must end up first before the hardware's
    //       pins so wdmaud mixer line parsing works correctly.
    //
    AddListEnd(gplstVirtualSourceLine);

    if(pCreateVirtualSource->Property.Id ==
      KSPROPERTY_SYSAUDIO_CREATE_VIRTUAL_SOURCE_ONLY) {
	ulFlags |= VSL_FLAGS_CREATE_ONLY;
    }

    RtlCopyMemory(
      &guidCategory,
      &pCreateVirtualSource->PinCategory,
      sizeof(GUID));

    RtlCopyMemory(
      &guidName,
      &pCreateVirtualSource->PinName,
      sizeof(GUID));

    iVirtualSource = gcVirtualSources++;
}

CVirtualSourceLine::~CVirtualSourceLine(
)
{
    RemoveList(gplstVirtualSourceLine);
    gcVirtualSources--;
}