windows-nt/Source/XPSP1/NT/drivers/ddk/wdmaudio/msvad/simple/mintopo.cpp
2020-09-26 16:20:57 +08:00

353 lines
8 KiB
C++

/*++
Copyright (c) 1997-2000 Microsoft Corporation All Rights Reserved
Module Name:
mintopo.cpp
Abstract:
Implementation of topology miniport.
--*/
#include <msvad.h>
#include <common.h>
#include "simple.h"
#include "minwave.h"
#include "mintopo.h"
#include "toptable.h"
/*********************************************************************
* Topology/Wave bridge connection *
* *
* +------+ +------+ *
* | Wave | | Topo | *
* | | | | *
* Capture <---|0 1|<===|4 1|<--- Synth *
* | | | | *
* Render --->|2 3|===>|0 | *
* +------+ | | *
* | 2|<--- Mic *
* | | *
* | 3|---> Line Out *
* +------+ *
*********************************************************************/
PHYSICALCONNECTIONTABLE TopologyPhysicalConnections =
{
KSPIN_TOPO_WAVEOUT_SOURCE, // TopologyIn
KSPIN_TOPO_WAVEIN_DEST, // TopologyOut
KSPIN_WAVE_CAPTURE_SOURCE, // WaveIn
KSPIN_WAVE_RENDER_SOURCE // WaveOut
};
#pragma code_seg("PAGE")
//=============================================================================
NTSTATUS
CreateMiniportTopologyMSVAD
(
OUT PUNKNOWN * Unknown,
IN REFCLSID,
IN PUNKNOWN UnknownOuter OPTIONAL,
IN POOL_TYPE PoolType
)
/*++
Routine Description:
Creates a new topology miniport.
Arguments:
Unknown -
RefclsId -
UnknownOuter -
PoolType -
Return Value:
NT status code.
--*/
{
PAGED_CODE();
ASSERT(Unknown);
STD_CREATE_BODY(CMiniportTopology, Unknown, UnknownOuter, PoolType);
} // CreateMiniportTopologyMSVAD
//=============================================================================
CMiniportTopology::~CMiniportTopology
(
void
)
/*++
Routine Description:
Topology miniport destructor
Arguments:
Return Value:
NT status code.
--*/
{
PAGED_CODE();
DPF_ENTER(("[CMiniportTopology::~CMiniportTopology]"));
} // ~CMiniportTopology
//=============================================================================
NTSTATUS
CMiniportTopology::DataRangeIntersection
(
IN ULONG PinId,
IN PKSDATARANGE ClientDataRange,
IN PKSDATARANGE MyDataRange,
IN ULONG OutputBufferLength,
OUT PVOID ResultantFormat OPTIONAL,
OUT PULONG ResultantFormatLength
)
/*++
Routine Description:
The DataRangeIntersection function determines the highest quality
intersection of two data ranges.
Arguments:
PinId - Pin for which data intersection is being determined.
ClientDataRange - Pointer to KSDATARANGE structure which contains the data range
submitted by client in the data range intersection property
request.
MyDataRange - Pin's data range to be compared with client's data range.
OutputBufferLength - Size of the buffer pointed to by the resultant format
parameter.
ResultantFormat - Pointer to value where the resultant format should be
returned.
ResultantFormatLength - Actual length of the resultant format that is placed
at ResultantFormat. This should be less than or equal
to OutputBufferLength.
Return Value:
NT status code.
--*/
{
PAGED_CODE();
return
CMiniportTopologyMSVAD::DataRangeIntersection
(
PinId,
ClientDataRange,
MyDataRange,
OutputBufferLength,
ResultantFormat,
ResultantFormatLength
);
} // DataRangeIntersection
//=============================================================================
STDMETHODIMP
CMiniportTopology::GetDescription
(
OUT PPCFILTER_DESCRIPTOR * OutFilterDescriptor
)
/*++
Routine Description:
The GetDescription function gets a pointer to a filter description.
It provides a location to deposit a pointer in miniport's description
structure. This is the placeholder for the FromNode or ToNode fields in
connections which describe connections to the filter's pins.
Arguments:
OutFilterDescriptor - Pointer to the filter description.
Return Value:
NT status code.
--*/
{
PAGED_CODE();
return
CMiniportTopologyMSVAD::GetDescription(OutFilterDescriptor);
} // GetDescription
//=============================================================================
STDMETHODIMP
CMiniportTopology::Init
(
IN PUNKNOWN UnknownAdapter,
IN PRESOURCELIST ResourceList,
IN PPORTTOPOLOGY Port_
)
/*++
Routine Description:
The Init function initializes the miniport. Callers of this function
should run at IRQL PASSIVE_LEVEL
Arguments:
UnknownAdapter - A pointer to the Iuknown interface of the adapter object.
ResourceList - Pointer to the resource list to be supplied to the miniport
during initialization. The port driver is free to examine the
contents of the ResourceList. The port driver will not be
modify the ResourceList contents.
Port - Pointer to the topology port object that is linked with this miniport.
Return Value:
NT status code.
--*/
{
PAGED_CODE();
ASSERT(UnknownAdapter);
ASSERT(Port_);
DPF_ENTER(("[CMiniportTopology::Init]"));
NTSTATUS ntStatus;
ntStatus =
CMiniportTopologyMSVAD::Init
(
UnknownAdapter,
Port_
);
if (NT_SUCCESS(ntStatus))
{
m_FilterDescriptor = &MiniportFilterDescriptor;
m_AdapterCommon->MixerMuxWrite(KSPIN_TOPO_MIC_SOURCE);
}
return ntStatus;
} // Init
//=============================================================================
STDMETHODIMP
CMiniportTopology::NonDelegatingQueryInterface
(
IN REFIID Interface,
OUT PVOID * Object
)
/*++
Routine Description:
QueryInterface for MiniportTopology
Arguments:
Interface - GUID of the interface
Object - interface object to be returned.
Return Value:
NT status code.
--*/
{
PAGED_CODE();
ASSERT(Object);
if (IsEqualGUIDAligned(Interface, IID_IUnknown))
{
*Object = PVOID(PUNKNOWN(this));
}
else if (IsEqualGUIDAligned(Interface, IID_IMiniport))
{
*Object = PVOID(PMINIPORT(this));
}
else if (IsEqualGUIDAligned(Interface, IID_IMiniportTopology))
{
*Object = PVOID(PMINIPORTTOPOLOGY(this));
}
else
{
*Object = NULL;
}
if (*Object)
{
// We reference the interface for the caller.
PUNKNOWN(*Object)->AddRef();
return(STATUS_SUCCESS);
}
return(STATUS_INVALID_PARAMETER);
} // NonDelegatingQueryInterface
//=============================================================================
NTSTATUS
PropertyHandler_Topology
(
IN PPCPROPERTY_REQUEST PropertyRequest
)
/*++
Routine Description:
Redirects property request to miniport object
Arguments:
PropertyRequest -
Return Value:
NT status code.
--*/
{
PAGED_CODE();
ASSERT(PropertyRequest);
DPF_ENTER(("[PropertyHandler_Topology]"));
// PropertryRequest structure is filled by portcls.
// MajorTarget is a pointer to miniport object for miniports.
//
return
((PCMiniportTopology)
(PropertyRequest->MajorTarget))->PropertyHandlerGeneric
(
PropertyRequest
);
} // PropertyHandler_Topology
#pragma code_seg()