📄 mintopo.cpp
字号:
if (AdapterCommon->GetPinConfig (PINC_AUX_PRESENT))
{
// add the NODE_VIRT_MASTER_INPUT_VOLUME4 node
INIT_NODE (NODE_VIRT_MASTER_INPUT_VOLUME4,
CurrentNode,
&KSNODETYPE_VOLUME,
&KSAUDFNAME_AUX_VOLUME,
&AutomationVolume,
Index);
}
if (AdapterCommon->GetPinConfig (PINC_LINEIN_PRESENT))
{
// add the NODE_VIRT_MASTER_INPUT_VOLUME5 node
INIT_NODE (NODE_VIRT_MASTER_INPUT_VOLUME5,
CurrentNode,
&KSNODETYPE_VOLUME,
&KSAUDFNAME_LINE_IN_VOLUME,
&AutomationVolume,
Index);
}
// add the NODE_VIRT_MASTER_INPUT_VOLUME6 node
INIT_NODE (NODE_VIRT_MASTER_INPUT_VOLUME6,
CurrentNode,
&KSNODETYPE_VOLUME,
&KSAUDFNAME_STEREO_MIX_VOLUME,
&AutomationVolume,
Index);
// add the NODE_VIRT_MASTER_INPUT_VOLUME7 node
INIT_NODE (NODE_VIRT_MASTER_INPUT_VOLUME7,
CurrentNode,
&KSNODETYPE_VOLUME,
&KSAUDFNAME_MONO_MIX_VOLUME,
&AutomationVolume,
Index);
if (AdapterCommon->GetPinConfig (PINC_PHONE_PRESENT))
{
// add the NODE_VIRT_MASTER_INPUT_VOLUME8 node
INIT_NODE (NODE_VIRT_MASTER_INPUT_VOLUME8,
CurrentNode,
&KSNODETYPE_VOLUME,
&ICHFNAME_MASTER_INPUT_VOLUME,
&AutomationVolume,
Index);
}
// add the MICIN nodes
if (AdapterCommon->GetPinConfig (PINC_MIC_PRESENT) &&
AdapterCommon->GetPinConfig (PINC_MICIN_PRESENT))
{
// add the NODE_MICIN_VOLUME node
INIT_NODE (NODE_MICIN_VOLUME,
CurrentNode,
&KSNODETYPE_VOLUME,
&ICHFNAME_MICIN_VOLUME,
&AutomationVolume,
Index);
// add the NODE_MICIN_MUTE node
INIT_NODE (NODE_MICIN_MUTE,
CurrentNode,
&KSNODETYPE_MUTE,
&ICHFNAME_MICIN_MUTE,
&AutomationMute,
Index);
}
// add the MONOOUT nodes
if (AdapterCommon->GetPinConfig (PINC_MONOOUT_PRESENT))
{
// add the NODE_MONOOUT_SELECT node
INIT_NODE (NODE_MONOOUT_SELECT,
CurrentNode,
&KSNODETYPE_MUX,
&ICHFNAME_MONOOUT_SELECT,
&AutomationMux,
Index);
// add the NODE_VIRT_MONOOUT_VOLUME1 node
INIT_NODE (NODE_VIRT_MONOOUT_VOLUME1,
CurrentNode,
&KSNODETYPE_VOLUME,
&KSAUDFNAME_MONO_MIX_VOLUME,
&AutomationVolume,
Index);
// add the NODE_VIRT_MONOOUT_VOLUME2 node
INIT_NODE (NODE_VIRT_MONOOUT_VOLUME2,
CurrentNode,
&KSNODETYPE_VOLUME,
&KSAUDFNAME_MIC_VOLUME,
&AutomationVolume,
Index);
}
// add the nodes to the filter descriptor
FilterDescriptor->NodeCount = Index;
FilterDescriptor->NodeSize = sizeof(PCNODE_DESCRIPTOR);
FilterDescriptor->Nodes = NodeDescriptors;
}
else
{
ntStatus = STATUS_INSUFFICIENT_RESOURCES;
}
return ntStatus;
#undef INIT_NODE
}
/*****************************************************************************
* CMiniportTopologyICH::BuildConnectionDescriptors
*****************************************************************************
* Builds the topology connection descriptors.
*/
NTSTATUS CMiniportTopologyICH::BuildConnectionDescriptors (void)
{
// Improvement would be to not use a Macro, use (inline) function instead.
// for node to node connections
#define INIT_NN_CONN( cptr, fnode, fpin, tnode, tpin ) \
cptr->FromNode = TransNodeDefToNodeNr (fnode); \
cptr->FromNodePin = fpin; \
cptr->ToNode = TransNodeDefToNodeNr (tnode); \
cptr->ToNodePin = tpin; \
cptr++,ConnectionCount++
// for filter pin to node connections
#define INIT_FN_CONN( cptr, fpin, tnode, tpin ) \
cptr->FromNode = KSFILTER_NODE; \
cptr->FromNodePin = TransPinDefToPinNr (fpin); \
cptr->ToNode = TransNodeDefToNodeNr (tnode); \
cptr->ToNodePin = tpin; \
cptr++,ConnectionCount++
// for node to filter pin connections
#define INIT_NF_CONN( cptr, fnode, fpin, tpin ) \
cptr->FromNode = TransNodeDefToNodeNr (fnode); \
cptr->FromNodePin = fpin; \
cptr->ToNode = KSFILTER_NODE; \
cptr->ToNodePin = TransPinDefToPinNr (tpin); \
cptr++,ConnectionCount++
PAGED_CODE ();
NTSTATUS ntStatus = STATUS_SUCCESS;
ULONG ConnectionCount = 0;
DOUT (DBG_PRINT, ("[CMiniportTopologyICH::BuildConnectionDescriptors]"));
// allocate our descriptor memory
ConnectionDescriptors = PPCCONNECTION_DESCRIPTOR (ExAllocatePool (PagedPool,
TOPO_MAX_CONNECTIONS * sizeof(PCCONNECTION_DESCRIPTOR)));
if (ConnectionDescriptors)
{
PPCCONNECTION_DESCRIPTOR CurrentConnection = ConnectionDescriptors;
// build the wave out (coming in) path
// PIN_WAVEOUT_SOURCE -> NODE_WAVEOUT_VOLUME
INIT_FN_CONN (CurrentConnection, PIN_WAVEOUT_SOURCE, NODE_WAVEOUT_VOLUME, 1);
// NODE_WAVEOUT_VOLUME -> NODE_WAVEOUT_MUTE
INIT_NN_CONN (CurrentConnection, NODE_WAVEOUT_VOLUME, 0, NODE_WAVEOUT_MUTE, 1);
// NODE_WAVEOUT_MUTE -> NODE_MAIN_MIX
INIT_NN_CONN (CurrentConnection, NODE_WAVEOUT_MUTE, 0, NODE_MAIN_MIX, 1);
// build the PC beeper path
if (AdapterCommon->GetPinConfig (PINC_PCBEEP_PRESENT))
{
// PIN_PCBEEP_SOURCE -> NODE_PCBEEP_VOLUME
INIT_FN_CONN (CurrentConnection, PIN_PCBEEP_SOURCE, NODE_PCBEEP_VOLUME, 1);
// NODE_PCBEEP_VOLUME -> NODE_PCBEEP_MUTE
INIT_NN_CONN (CurrentConnection, NODE_PCBEEP_VOLUME, 0, NODE_PCBEEP_MUTE, 1);
// NODE_PCBEEP_MUTE -> NODE_BEEP_MIX
INIT_NN_CONN (CurrentConnection, NODE_PCBEEP_MUTE, 0, NODE_BEEP_MIX, 2);
}
// build the phone path
if (AdapterCommon->GetPinConfig (PINC_PHONE_PRESENT))
{
// PIN_PHONE_SOURCE -> NODE_PHONE_VOLUME
INIT_FN_CONN (CurrentConnection, PIN_PHONE_SOURCE, NODE_PHONE_VOLUME, 1);
// NODE_PHONE_VOLUME -> NODE_PHONE_MUTE
INIT_NN_CONN (CurrentConnection, NODE_PHONE_VOLUME, 0, NODE_PHONE_MUTE, 1);
// NODE_PHONE_MUTE -> LINEOUT_BEEP_MIX
INIT_NN_CONN (CurrentConnection, NODE_PHONE_MUTE, 0, NODE_BEEP_MIX, 3);
// PIN_PHONE_SOURCE pin -> NODE_VIRT_MASTER_INPUT_VOLUME8
INIT_FN_CONN (CurrentConnection, PIN_PHONE_SOURCE, NODE_VIRT_MASTER_INPUT_VOLUME8, 1);
// NODE_VIRT_MASTER_INPUT_VOLUME8 -> NODE_WAVEIN_SELECT
INIT_NN_CONN (CurrentConnection, NODE_VIRT_MASTER_INPUT_VOLUME8, 0, NODE_WAVEIN_SELECT, 8);
}
// build MIC path
if (AdapterCommon->GetPinConfig (PINC_MIC_PRESENT))
{
// build the MIC selector in case we have 2 MICs
if (AdapterCommon->GetPinConfig (PINC_MIC2_PRESENT))
{
// PIN_MIC_SOURCE pin -> NODE_MIC_SELECT
INIT_FN_CONN (CurrentConnection, PIN_MIC_SOURCE, NODE_MIC_SELECT, 1);
// NODE_MIC_SELECT -> NODE_MIC_BOOST
INIT_NN_CONN (CurrentConnection, NODE_MIC_SELECT, 0, NODE_MIC_BOOST, 1);
}
else
{
// PIN_MIC_SOURCE pin -> NODE_MIC_SELECT
INIT_FN_CONN (CurrentConnection, PIN_MIC_SOURCE, NODE_MIC_BOOST, 1);
}
// NODE_MIC_BOOST -> NODE_MIC_VOLUME
INIT_NN_CONN (CurrentConnection, NODE_MIC_BOOST, 0, NODE_MIC_VOLUME, 1);
// NODE_MIC_VOLUME -> NODE_MIC_MUTE
INIT_NN_CONN (CurrentConnection, NODE_MIC_VOLUME, 0, NODE_MIC_MUTE, 1);
// NODE_MIC_MUTE -> NODE_MAIN_MIX
INIT_NN_CONN (CurrentConnection, NODE_MIC_MUTE, 0, NODE_MAIN_MIX, 2);
// NODE_MIC_BOOST -> NODE_VIRT_MASTER_INPUT_VOLUME1
INIT_NN_CONN (CurrentConnection, NODE_MIC_BOOST, 0, NODE_VIRT_MASTER_INPUT_VOLUME1, 1);
// NODE_VIRT_MASTER_INPUT_VOLUME1 -> NODE_WAVEIN_SELECT
INIT_NN_CONN (CurrentConnection, NODE_VIRT_MASTER_INPUT_VOLUME1, 0, NODE_WAVEIN_SELECT, 1);
}
// build the line in path
if (AdapterCommon->GetPinConfig (PINC_LINEIN_PRESENT))
{
// PIN_LINEIN_SOURCE -> NODE_LINEIN_VOLUME
INIT_FN_CONN (CurrentConnection, PIN_LINEIN_SOURCE, NODE_LINEIN_VOLUME, 1);
// NODE_LINEIN_VOLUME -> NODE_LINEIN_MUTE
INIT_NN_CONN (CurrentConnection, NODE_LINEIN_VOLUME, 0, NODE_LINEIN_MUTE, 1);
// NODE_LINEIN_MUTE -> NODE_MAIN_MIX
INIT_NN_CONN (CurrentConnection, NODE_LINEIN_MUTE, 0, NODE_MAIN_MIX, 3);
// PIN_LINEIN_SOURCE pin -> NODE_VIRT_MASTER_INPUT_VOLUME5
INIT_FN_CONN (CurrentConnection, PIN_LINEIN_SOURCE, NODE_VIRT_MASTER_INPUT_VOLUME5, 1);
// NODE_VIRT_MASTER_INPUT_VOLUME5 -> NODE_WAVEIN_SELECT
INIT_NN_CONN (CurrentConnection, NODE_VIRT_MASTER_INPUT_VOLUME5, 0, NODE_WAVEIN_SELECT, 5);
}
// build the CD path
if (AdapterCommon->GetPinConfig (PINC_CD_PRESENT))
{
// PIN_CD_SOURCE -> NODE_CD_VOLUME
INIT_FN_CONN (CurrentConnection, PIN_CD_SOURCE, NODE_CD_VOLUME, 1);
// NODE_CD_VOLUME -> NODE_CD_MUTE
INIT_NN_CONN (CurrentConnection, NODE_CD_VOLUME, 0, NODE_CD_MUTE, 1);
// NODE_CD_MUTE -> NODE_MAIN_MIX
INIT_NN_CONN (CurrentConnection, NODE_CD_MUTE, 0, NODE_MAIN_MIX, 4);
// PIN_CD_SOURCE pin -> NODE_VIRT_MASTER_INPUT_VOLUME2
INIT_FN_CONN (CurrentConnection, PIN_CD_SOURCE, NODE_VIRT_MASTER_INPUT_VOLUME2, 1);
// NODE_VIRT_MASTER_INPUT_VOLUME2 -> NODE_WAVEIN_SELECT
INIT_NN_CONN (CurrentConnection, NODE_VIRT_MASTER_INPUT_VOLUME2, 0, NODE_WAVEIN_SELECT, 2);
}
// build the video path
if (AdapterCommon->GetPinConfig (PINC_VIDEO_PRESENT))
{
// PIN_VIDEO_SOURCE -> NODE_VIDEO_VOLUME
INIT_FN_CONN (CurrentConnection, PIN_VIDEO_SOURCE, NODE_VIDEO_VOLUME, 1);
// NODE_VIDEO_VOLUME -> NODE_VIDEO_MUTE
INIT_NN_CONN (CurrentConnection, NODE_VIDEO_VOLUME, 0, NODE_VIDEO_MUTE, 1);
// NODE_VIDEO_MUTE -> NODE_MAIN_MIX
INIT_NN_CONN (CurrentConnection, NODE_VIDEO_MUTE, 0, NODE_MAIN_MIX, 5);
// PIN_VIDEO_SOURCE pin -> NODE_VIRT_MASTER_INPUT_VOLUME3
INIT_FN_CONN (CurrentConnection, PIN_VIDEO_SOURCE, NODE_VIRT_MASTER_INPUT_VOLUME3, 1);
// NODE_VIRT_MASTER_INPUT_VOLUME3 -> NODE_WAVEIN_SELECT
INIT_NN_CONN (CurrentConnection, NODE_VIRT_MASTER_INPUT_VOLUME3, 0, NODE_WAVEIN_SELECT, 3);
}
// build the AUX path
if (AdapterCommon->GetPinConfig (PINC_AUX_PRESENT))
{
// PIN_AUX_SOURCE pin -> NODE_AUX_VOLUME
INIT_FN_CONN (CurrentConnection, PIN_AUX_SOURCE, NODE_AUX_VOLUME, 1);
// NODE_AUX_VOLUME -> NODE_AUX_MUTE
INIT_NN_CONN (CurrentConnection, NODE_AUX_VOLUME, 0, NODE_AUX_MUTE, 1);
// NODE_AUX_MUTE -> NODE_MAIN_MIX
INIT_NN_CONN (CurrentConnection, NODE_AUX_MUTE, 0, NODE_MAIN_MIX, 6);
// PIN_AUX_SOURCE pin -> NODE_VIRT_MASTER_INPUT_VOLUME4
INIT_FN_CONN (CurrentConnection, PIN_AUX_SOURCE, NODE_VIRT_MASTER_INPUT_VOLUME4, 1);
// NODE_VIRT_MASTER_INPUT_VOLUME4 -> NODE_WAVEIN_SELECT
INIT_NN_CONN (CurrentConnection, NODE_VIRT_MASTER_INPUT_VOLUME4, 0, NODE_WAVEIN_SELECT, 4);
}
// and build the head phone output.
// we connect the headphones like an input so that it's in the playback panel.
if (AdapterCommon->GetPinConfig (PINC_HPOUT_PRESENT))
{
// from whatever -> NODE_HPOUT_VOLUME
INIT_FN_CONN (CurrentConnection, PIN_HPOUT_SOURCE, NODE_HPOUT_VOLUME, 1);
// NODE_HPOUT_VOLUME -> NODE_HPOUT_MUTE
INIT_NN_CONN (CurrentConnection, NODE_HPOUT_VOLUME, 0, NODE_HPOUT_MUTE, 1);
// NODE_HPOUT_MUTE -> PIN_HPOUT_DEST pin
INIT_NN_CONN( CurrentConnection, NODE_HPOUT_MUTE, 0, NODE_MAIN_MIX, 9);
}
// build the 3D path
if (AdapterCommon->GetNodeConfig (NODEC_3D_PRESENT))
{
// Figure out what the main 3D line is.
if (AdapterCommon->GetNodeConfig (NODEC_3D_CENTER_ADJUSTABLE))
{
if (AdapterCommon->GetNodeConfig (NODEC_3D_DEPTH_ADJUSTABLE))
{
// PIN_VIRT_3D_DEPTH_SOURCE -> NODE_VIRT_3D_ENABLE
INIT_FN_CONN (CurrentConnection, PIN_VIRT_3D_DEPTH_SOURCE, NODE_VIRT_3D_ENABLE, 1);
// NODE_VIRT_3D_ENABLE -> NODE_VIRT_WAVEOUT_3D_BYPASS
INIT_NN_CONN (CurrentConnection, NODE_VIRT_3D_ENABLE, 0, NODE_VIRT_WAVEOUT_3D_BYPASS, 1);
// NODE_VIRT_WAVEOUT_3D_BYPASS -> NODE_VIRT_3D_DEPTH
INIT_NN_CONN (CurrentConnection, NODE_VIRT_WAVEOUT_3D_BYPASS, 0, NODE_VIRT_3D_DEPTH, 1);
// NODE_VIRT_3D_DEPTH -> NODE_MAIN_MIX
INIT_NN_CONN (CurrentConnection, NODE_VIRT_3D_DEPTH, 0, NODE_MAIN_MIX, 7);
// PIN_VIRT_3D_CENTER_SOURCE -> NODE_VIRT_3D_CENTER
INIT_FN_CONN (CurrentConnection, PIN_VIRT_3D_CENTER_SOURCE, NODE_VIRT_3D_CENTER, 1);
// NODE_VIRT_3D_CENTER -> NODE_MAIN_MIX
INIT_NN_CONN (CurrentConnection, NODE_VIRT_3D_CENTER, 0, NODE_MAIN_MIX, 8);
}
else
{
// PIN_VIRT_3D_CENTER
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -