minwave.cpp
来自「winddk src目录下的WDM源码压缩!」· C++ 代码 · 共 1,666 行 · 第 1/5 页
CPP
1,666 行
/********************************************************************************
** Copyright (c) 1998-2000 Microsoft Corporation. All Rights Reserved.
**
** Portions Copyright (c) 1998-1999 Intel Corporation
**
********************************************************************************/
// Every debug output has "Modulname text"
static char STR_MODULENAME[] = "ICH Wave: ";
#include "minwave.h"
#include "ichwave.h"
/*****************************************************************************
* PinDataRangesPCMStream
*****************************************************************************
* The next 3 arrays contain information about the data ranges of the pin for
* wave capture, wave render and mic capture.
* These arrays are filled dynamically by BuildDataRangeInformation().
*/
static KSDATARANGE_AUDIO PinDataRangesPCMStreamRender[WAVE_SAMPLERATES_TESTED];
static KSDATARANGE_AUDIO PinDataRangesPCMStreamCapture[WAVE_SAMPLERATES_TESTED];
static KSDATARANGE_AUDIO PinDataRangesMicStream[MIC_SAMPLERATES_TESTED];
static KSDATARANGE PinDataRangesAnalogBridge[] =
{
{
sizeof(KSDATARANGE),
0,
0,
0,
STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO),
STATICGUIDOF(KSDATAFORMAT_SUBTYPE_ANALOG),
STATICGUIDOF(KSDATAFORMAT_SPECIFIER_NONE)
}
};
/*****************************************************************************
* PinDataRangesPointersPCMStream
*****************************************************************************
* The next 3 arrays contain the pointers to the data range information of
* the pin for wave capture, wave render and mic capture.
* These arrays are filled dynamically by BuildDataRangeInformation().
*/
static PKSDATARANGE PinDataRangePointersPCMStreamRender[WAVE_SAMPLERATES_TESTED];
static PKSDATARANGE PinDataRangePointersPCMStreamCapture[WAVE_SAMPLERATES_TESTED];
static PKSDATARANGE PinDataRangePointersMicStream[MIC_SAMPLERATES_TESTED];
/*****************************************************************************
* PinDataRangePointerAnalogStream
*****************************************************************************
* This structure pointers to the data range structures for the wave pins.
*/
static PKSDATARANGE PinDataRangePointersAnalogBridge[] =
{
(PKSDATARANGE) PinDataRangesAnalogBridge
};
/*****************************************************************************
* Wave Miniport Topology
*========================
*
* +-----------+
* | |
* Capture (PIN_WAVEIN) <---|2 --ADC-- 3|<=== (PIN_WAVEIN_BRIDGE)
* | |
* Render (PIN_WAVEOUT) --->|0 --DAC-- 1|===> (PIN_WAVEOUT_BRIDGE)
* | |
* Mic (PIN_MICIN) <---|4 --ADC-- 5|<=== (PIN_MICIN_BRIDGE)
* +-----------+
*
* Note that the exposed pins (left side) have to be a multiple of 2
* since there are some dependencies in the stream object.
*/
/*****************************************************************************
* MiniportPins
*****************************************************************************
* This structure describes pin (stream) types provided by this miniport.
* The field that sets the number of data range entries (SIZEOF_ARRAY) is
* overwritten by BuildDataRangeInformation().
*/
static PCPIN_DESCRIPTOR MiniportPins[] =
{
// PIN_WAVEOUT
{
1,1,0, // InstanceCount
NULL, // AutomationTable
{ // KsPinDescriptor
0, // InterfacesCount
NULL, // Interfaces
0, // MediumsCount
NULL, // Mediums
SIZEOF_ARRAY(PinDataRangePointersPCMStreamRender), // DataRangesCount
PinDataRangePointersPCMStreamRender, // DataRanges
KSPIN_DATAFLOW_IN, // DataFlow
KSPIN_COMMUNICATION_SINK, // Communication
(GUID *) &KSCATEGORY_AUDIO, // Category
NULL, // Name
0 // Reserved
}
},
// PIN_WAVEOUT_BRIDGE
{
0,0,0, // InstanceCount
NULL, // AutomationTable
{ // KsPinDescriptor
0, // InterfacesCount
NULL, // Interfaces
0, // MediumsCount
NULL, // Mediums
SIZEOF_ARRAY(PinDataRangePointersAnalogBridge), // DataRangesCount
PinDataRangePointersAnalogBridge, // DataRanges
KSPIN_DATAFLOW_OUT, // DataFlow
KSPIN_COMMUNICATION_NONE, // Communication
(GUID *) &KSCATEGORY_AUDIO, // Category
NULL, // Name
0 // Reserved
}
},
// PIN_WAVEIN
{
1,1,0, // InstanceCount
NULL, // AutomationTable
{ // KsPinDescriptor
0, // InterfacesCount
NULL, // Interfaces
0, // MediumsCount
NULL, // Mediums
SIZEOF_ARRAY(PinDataRangePointersPCMStreamCapture), // DataRangesCount
PinDataRangePointersPCMStreamCapture, // DataRanges
KSPIN_DATAFLOW_OUT, // DataFlow
KSPIN_COMMUNICATION_SINK, // Communication
(GUID *) &PINNAME_CAPTURE, // Category
&KSAUDFNAME_RECORDING_CONTROL, // Name
0 // Reserved
}
},
// PIN_WAVEIN_BRIDGE
{
0,0,0, // InstanceCount
NULL, // AutomationTable
{ // KsPinDescriptor
0, // InterfacesCount
NULL, // Interfaces
0, // MediumsCount
NULL, // Mediums
SIZEOF_ARRAY(PinDataRangePointersAnalogBridge), // DataRangesCount
PinDataRangePointersAnalogBridge, // DataRanges
KSPIN_DATAFLOW_IN, // DataFlow
KSPIN_COMMUNICATION_NONE, // Communication
(GUID *) &KSCATEGORY_AUDIO, // Category
NULL, // Name
0 // Reserved
}
},
//
// The Microphone pins are not used if PINC_MICIN_PRESENT is not set.
// To remove them, Init() will reduce the "PinCount" in the
// MiniportFilterDescriptor.
//
// PIN_MICIN
{
1,1,0, // InstanceCount
NULL, // AutomationTable
{ // KsPinDescriptor
0, // InterfacesCount
NULL, // Interfaces
0, // MediumsCount
NULL, // Mediums
SIZEOF_ARRAY(PinDataRangePointersMicStream),// DataRangesCount
PinDataRangePointersMicStream, // DataRanges
KSPIN_DATAFLOW_OUT, // DataFlow
KSPIN_COMMUNICATION_SINK, // Communication
(GUID *) &KSCATEGORY_AUDIO, // Category
NULL, // Name
0 // Reserved
}
},
// PIN_MICIN_BRIDGE
{
0,0,0, // InstanceCount
NULL, // AutomationTable
{ // KsPinDescriptor
0, // InterfacesCount
NULL, // Interfaces
0, // MediumsCount
NULL, // Mediums
SIZEOF_ARRAY(PinDataRangePointersAnalogBridge), // DataRangesCount
PinDataRangePointersAnalogBridge, // DataRanges
KSPIN_DATAFLOW_IN, // DataFlow
KSPIN_COMMUNICATION_NONE, // Communication
(GUID *) &KSCATEGORY_AUDIO, // Category
NULL, // Name
0 // Reserved
}
}
};
/*****************************************************************************
* PropertiesDAC
*****************************************************************************
* Properties for the DAC node.
*/
static PCPROPERTY_ITEM PropertiesDAC[] =
{
{
&KSPROPSETID_Audio,
KSPROPERTY_AUDIO_CHANNEL_CONFIG,
KSPROPERTY_TYPE_SET,
CMiniportWaveICH::PropertyChannelConfig
}
};
/*****************************************************************************
* AutomationVolume
*****************************************************************************
* Automation table for volume controls.
*/
DEFINE_PCAUTOMATION_TABLE_PROP (AutomationDAC, PropertiesDAC);
/*****************************************************************************
* TopologyNodes
*****************************************************************************
* List of nodes.
*/
static PCNODE_DESCRIPTOR MiniportNodes[] =
{
// NODE_WAVEOUT_DAC
{
0, // Flags
&AutomationDAC, // AutomationTable
&KSNODETYPE_DAC, // Type
NULL // Name
},
// NODE_WAVEIN_ADC
{
0, // Flags
NULL, // AutomationTable
&KSNODETYPE_ADC, // Type
NULL // Name
},
//
// The Microphone node is not used if PINC_MICIN_PRESENT is not set.
// To remove them, Init() will reduce the "NodeCount" in the
// MiniportFilterDescriptor.
//
// NODE_MICIN_ADC
{
0, // Flags
NULL, // AutomationTable
&KSNODETYPE_ADC, // Type
NULL // Name
}
};
/*****************************************************************************
* MiniportConnections
*****************************************************************************
* This structure identifies the connections between filter pins and
* node pins.
*/
static PCCONNECTION_DESCRIPTOR MiniportConnections[] =
{
//from_node from_pin to_node to_pin
{ PCFILTER_NODE, PIN_WAVEOUT, NODE_WAVEOUT_DAC, 1},
{ NODE_WAVEOUT_DAC, 0, PCFILTER_NODE, PIN_WAVEOUT_BRIDGE},
{ PCFILTER_NODE, PIN_WAVEIN_BRIDGE, NODE_WAVEIN_ADC, 1},
{ NODE_WAVEIN_ADC, 0, PCFILTER_NODE, PIN_WAVEIN},
//
// The Microphone connection is not used if PINC_MICIN_PRESENT is not set.
// To remove them, Init() will reduce the "ConnectionCount" in the
// MiniportFilterDescriptor.
//
{ PCFILTER_NODE, PIN_MICIN_BRIDGE, NODE_MICIN_ADC, 1},
{ NODE_MICIN_ADC, 0, PCFILTER_NODE, PIN_MICIN}
};
/*****************************************************************************
* MiniportFilterDescriptor
*****************************************************************************
* Complete miniport description.
* Init() modifies the pin count, node count and connection count in absence
* of the MicIn recording line.
*/
static PCFILTER_DESCRIPTOR MiniportFilterDescriptor =
{
0, // Version
NULL, // AutomationTable
sizeof(PCPIN_DESCRIPTOR), // PinSize
SIZEOF_ARRAY(MiniportPins), // PinCount
MiniportPins, // Pins
sizeof(PCNODE_DESCRIPTOR), // NodeSize
SIZEOF_ARRAY(MiniportNodes), // NodeCount
MiniportNodes, // Nodes
SIZEOF_ARRAY(MiniportConnections), // ConnectionCount
MiniportConnections, // Connections
0, // CategoryCount
NULL // Categories: NULL->use defaults (audio, render, capture)
};
#pragma code_seg("PAGE")
/*****************************************************************************
* CMiniportWaveICH::PropertyChannelConfig
*****************************************************************************
* This is the property handler for KSPROPERTY_AUDIO_CHANNEL_CONFIG of the
* DAC node. It sets the channel configuration (how many channels, how user
* was setting up the speakers).
*/
NTSTATUS CMiniportWaveICH::PropertyChannelConfig
(
IN PPCPROPERTY_REQUEST PropertyRequest
)
{
PAGED_CODE ();
ASSERT (PropertyRequest);
DOUT (DBG_PRINT, ("[CMiniportWaveICH::PropertyChannelConfig]"));
NTSTATUS ntStatus = STATUS_INVALID_PARAMETER;
// The major target is the object pointer to the wave miniport.
CMiniportWaveICH *that =
(CMiniportWaveICH *) (PMINIPORTWAVEPCI)PropertyRequest->MajorTarget;
ASSERT (that);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?