📄 tables.h
字号:
* The Event for the Master Volume (or other nodes)
*****************************************************************************
* Generic event for nodes.
*/
static PCEVENT_ITEM NodeEvent[] =
{
// This is a generic event for nearly every node property.
{
&KSEVENTSETID_AudioControlChange, // Something changed!
KSEVENT_CONTROL_CHANGE, // The only event-property defined.
KSEVENT_TYPE_ENABLE | KSEVENT_TYPE_BASICSUPPORT,
CMiniportTopologySB16::EventHandler
}
};
/*****************************************************************************
* AutomationVolumeWithEvent
*****************************************************************************
* This is the automation table for Volume events.
* You can create Automation tables with event support for any type of nodes
* (e.g. mutes) with just adding the generic event above. The automation table
* then gets added to every node that should have event support.
*/
DEFINE_PCAUTOMATION_TABLE_PROP_EVENT (AutomationVolumeWithEvent, PropertiesVolume, NodeEvent);
#endif
/*****************************************************************************
* TopologyNodes
*****************************************************************************
* List of node identifiers.
*/
static
PCNODE_DESCRIPTOR TopologyNodes[] =
{
// WAVEOUT_VOLUME
{
0, // Flags
&AutomationVolume, // AutomationTable
&KSNODETYPE_VOLUME, // Type
&KSAUDFNAME_WAVE_VOLUME // Name
},
// SYNTH_VOLUME
{
0, // Flags
&AutomationVolume, // AutomationTable
&KSNODETYPE_VOLUME, // Type
&KSAUDFNAME_MIDI_VOLUME // Name
},
// SYNTH_WAVEIN_SUPERMIX
{
0, // Flags
&AutomationSupermix, // AutomationTable
&KSNODETYPE_SUPERMIX, // Type
&KSAUDFNAME_MIDI_MUTE // Name
},
// CD_VOLUME
{
0, // Flags
&AutomationVolume, // AutomationTable
&KSNODETYPE_VOLUME, // Type
&KSAUDFNAME_CD_VOLUME // Name
},
// CD_LINEOUT_SUPERMIX
{
0, // Flags
&AutomationSupermix, // AutomationTable
&KSNODETYPE_SUPERMIX, // Type
&KSAUDFNAME_CD_MUTE // Name
},
// CD_WAVEIN_SUPERMIX
{
0, // Flags
&AutomationSupermix, // AutomationTable
&KSNODETYPE_SUPERMIX, // Type
&KSAUDFNAME_CD_MUTE // Name
},
// LINEIN_VOLUME
{
0, // Flags
&AutomationVolume, // AutomationTable
&KSNODETYPE_VOLUME, // Type
&KSAUDFNAME_LINE_VOLUME // Name
},
// LINEIN_LINEOUT_SUPERMIX
{
0, // Flags
&AutomationSupermix, // AutomationTable
&KSNODETYPE_SUPERMIX, // Type
&KSAUDFNAME_LINE_MUTE // Name
},
// LINEIN_WAVEIN_SUPERMIX
{
0, // Flags
&AutomationSupermix, // AutomationTable
&KSNODETYPE_SUPERMIX, // Type
&KSAUDFNAME_LINE_MUTE // Name
},
// MIC_AGC
{
0, // Flags
&AutomationAgc, // AutomationTable
&KSNODETYPE_AGC, // Type
NULL // Name
},
// MIC_VOLUME
{
0, // Flags
&AutomationVolume, // AutomationTable
&KSNODETYPE_VOLUME, // Type
&KSAUDFNAME_MIC_VOLUME // Name
},
// MIC_LINEOUT_MUTE
{
0, // Flags
&AutomationMute, // AutomationTable
&KSNODETYPE_MUTE, // Type
&KSAUDFNAME_MIC_MUTE // Name
},
// MIC_WAVEIN_SUPERMIX
{
0, // Flags
&AutomationSupermix, // AutomationTable
&KSNODETYPE_SUPERMIX, // Type
&KSAUDFNAME_MIC_MUTE // Name
},
// LINEOUT_MIX
{
0, // Flags
NULL, // AutomationTable
&KSNODETYPE_SUM, // Type
NULL // Name
},
// LINEOUT_VOL
{
0, // Flags
#ifdef EVENT_SUPPORT
&AutomationVolumeWithEvent, // AutomationTable with event support
#else
&AutomationVolume, // AutomationTable
#endif
&KSNODETYPE_VOLUME, // Type
&KSAUDFNAME_MASTER_VOLUME // Name
},
// LINEOUT_BASS
{
0, // Flags
&AutomationTone, // AutomationTable
&KSNODETYPE_TONE, // Type
&KSAUDFNAME_BASS // Name
},
// LINEOUT_TREBLE
{
0, // Flags
&AutomationTone, // AutomationTable
&KSNODETYPE_TONE, // Type
&KSAUDFNAME_TREBLE // Name
},
// LINEOUT_GAIN
{
0, // Flags
&AutomationVolume, // AutomationTable
&KSNODETYPE_VOLUME, // Type
NULL // Name
},
// WAVEIN_MIX
{
0, // Flags
NULL, // AutomationTable
&KSNODETYPE_SUM, // Type
&KSAUDFNAME_RECORDING_SOURCE // Name
},
// WAVEIN_GAIN
{
0, // Flags
&AutomationVolume, // AutomationTable
&KSNODETYPE_VOLUME, // Type
&KSAUDFNAME_WAVE_IN_VOLUME // Name
}
};
/*****************************************************************************
* ControlValueCache
*****************************************************************************
*/
static
LONG ControlValueCache[] =
{ // Left // Right
0xFFF9F203, 0xFFF9F203, // WAVEOUT_VOLUME
0xFFF9F203, 0xFFF9F203, // SYNTH_VOLUME
0xFFF9F203, 0xFFF9F203, // CD_VOLUME
0xFFF9F203, 0xFFF9F203, // LINEIN_VOLUME
0xFFF9F203, 0, // MIC_VOLUME
0xFFF9F203, 0xFFF9F203, // LINEOUT_VOL
0x000242A0, 0x000242A0, // LINEOUT_BASS
0x000242A0, 0x000242A0, // LINEOUT_TREBLE
0x000C0000, 0x000C0000, // LINEOUT_GAIN
0x00000000, 0x00000000 // WAVEIN_GAIN
};
typedef struct
{
BYTE BaseRegister; // H/W access parameter
ULONG CacheOffset; // ControlValueCache offset
} ACCESS_PARM,*PACCESS_PARM;
/*****************************************************************************
* AccessParams
*****************************************************************************
* Table of H/W access parameters
*/
static
ACCESS_PARM AccessParams[] =
{
{ DSP_MIX_VOICEVOLIDX_L, 0 }, // WAVEOUT_VOLUME
{ DSP_MIX_FMVOLIDX_L, 2 }, // SYNTH_VOLUME
{ MIXBIT_SYNTH_WAVEIN_R, ULONG(-1) }, // SYNTH_WAVEIN_SUPERMIX
{ DSP_MIX_CDVOLIDX_L, 4 }, // CD_VOLUME
{ MIXBIT_CD_LINEOUT_R, ULONG(-1) }, // CD_LINEOUT_SUPERMIX
{ MIXBIT_CD_WAVEIN_R, ULONG(-1) }, // CD_WAVEIN_SUPERMIX
{ DSP_MIX_LINEVOLIDX_L, 6 }, // LINEIN_VOLUME
{ MIXBIT_LINEIN_LINEOUT_R, ULONG(-1) }, // LINEIN_LINEOUT_SUPERMIX
{ MIXBIT_LINEIN_WAVEIN_R, ULONG(-1) }, // LINEIN_WAVEIN_SUPERMIX
{ 0, ULONG(-1) }, // MIC_AGC
{ DSP_MIX_MICVOLIDX, 8 }, // MIC_VOLUME
{ 0, ULONG(-1) }, // MIC_LINEOUT_MUTE
{ 0, ULONG(-1) }, // MIC_WAVEIN_SUPERMIX
{ 0, ULONG(-1) }, // LINEOUT_MIX
{ DSP_MIX_MASTERVOLIDX_L, 10 }, // LINEOUT_VOL
{ DSP_MIX_BASSIDX_L, 12 }, // LINEOUT_BASS
{ DSP_MIX_TREBLEIDX_L, 14 }, // LINEOUT_TREBLE
{ DSP_MIX_OUTGAINIDX_L, 16 }, // LINEOUT_GAIN
{ 0, ULONG(-1) }, // WAVEIN_MIX
{ DSP_MIX_INGAINIDX_L, 18 } // WAVEIN_GAIN
};
enum
{
WAVEOUT_VOLUME = 0,
SYNTH_VOLUME,
SYNTH_WAVEIN_SUPERMIX,
CD_VOLUME,
CD_LINEOUT_SUPERMIX,
CD_WAVEIN_SUPERMIX,
LINEIN_VOLUME,
LINEIN_LINEOUT_SUPERMIX,
LINEIN_WAVEIN_SUPERMIX,
MIC_AGC,
MIC_VOLUME,
MIC_LINEOUT_MUTE,
MIC_WAVEIN_SUPERMIX,
LINEOUT_MIX,
LINEOUT_VOL,
LINEOUT_BASS,
LINEOUT_TREBLE,
LINEOUT_GAIN,
WAVEIN_MIX,
WAVEIN_GAIN
};
/*****************************************************************************
* ConnectionTable
*****************************************************************************
* Table of topology unit connections.
*
* Pin numbering is technically arbitrary, but the convention established here
* is to number a solitary output pin 0 (looks like an 'o') and a solitary
* input pin 1 (looks like an 'i'). Even destinations, which have no output,
* have an input pin numbered 1 and no pin 0.
*
* Nodes are more likely to have multiple ins than multiple outs, so the more
* general rule would be that inputs are numbered >=1. If a node has multiple
* outs, none of these conventions apply.
*
* Nodes have at most one control value. Mixers are therefore simple summing
* nodes with no per-pin levels. Rather than assigning a unique pin to each
* input to a mixer, all inputs are connected to pin 1. This is acceptable
* because there is no functional distinction between the inputs.
*
* There are no multiplexers in this topology, so there is no opportunity to
* give an example of a multiplexer. A multiplexer should have a single
* output pin (0) and multiple input pins (1..n). Its control value is an
* integer in the range 1..n indicating which input is connected to the
* output.
*
* In the case of connections to pins, as opposed to connections to nodes, the
* node is identified as PCFILTER_NODE and the pin number identifies the
* particular filter pin.
*/
static
PCCONNECTION_DESCRIPTOR MiniportConnections[] =
{ // FromNode, FromPin, ToNode, ToPin
{ PCFILTER_NODE, WAVEOUT_SOURCE, WAVEOUT_VOLUME, 1 },
{ WAVEOUT_VOLUME, 0, LINEOUT_MIX, 1 },
{ PCFILTER_NODE, SYNTH_SOURCE, SYNTH_VOLUME, 1 },
{ SYNTH_VOLUME, 0, LINEOUT_MIX, 2 },
{ SYNTH_VOLUME, 0, SYNTH_WAVEIN_SUPERMIX, 1 },
{ SYNTH_WAVEIN_SUPERMIX, 0, WAVEIN_MIX, 1 },
{ PCFILTER_NODE, CD_SOURCE, CD_VOLUME, 1 },
{ CD_VOLUME, 0, CD_LINEOUT_SUPERMIX, 1 },
{ CD_LINEOUT_SUPERMIX, 0, LINEOUT_MIX, 3 },
{ CD_VOLUME, 0, CD_WAVEIN_SUPERMIX, 1 },
{ CD_WAVEIN_SUPERMIX, 0, WAVEIN_MIX, 2 },
{ PCFILTER_NODE, LINEIN_SOURCE, LINEIN_VOLUME, 1 },
{ LINEIN_VOLUME, 0, LINEIN_LINEOUT_SUPERMIX,1 },
{ LINEIN_LINEOUT_SUPERMIX,0, LINEOUT_MIX, 4 },
{ LINEIN_VOLUME, 0, LINEIN_WAVEIN_SUPERMIX, 1 },
{ LINEIN_WAVEIN_SUPERMIX, 0, WAVEIN_MIX, 3 },
{ PCFILTER_NODE, MIC_SOURCE, MIC_AGC, 1 },
{ MIC_AGC, 0, MIC_VOLUME, 1 },
{ MIC_VOLUME, 0, MIC_LINEOUT_MUTE, 1 },
{ MIC_LINEOUT_MUTE, 0, LINEOUT_MIX, 5 },
{ MIC_VOLUME, 0, MIC_WAVEIN_SUPERMIX, 1 },
{ MIC_WAVEIN_SUPERMIX, 0, WAVEIN_MIX, 4 },
{ LINEOUT_MIX, 0, LINEOUT_VOL, 1 },
{ LINEOUT_VOL, 0, LINEOUT_BASS, 1 },
{ LINEOUT_BASS, 0, LINEOUT_TREBLE, 1 },
{ LINEOUT_TREBLE, 0, LINEOUT_GAIN, 1 },
{ LINEOUT_GAIN, 0, PCFILTER_NODE, LINEOUT_DEST },
{ WAVEIN_MIX, 0, WAVEIN_GAIN, 1 },
{ WAVEIN_GAIN, 0, PCFILTER_NODE, WAVEIN_DEST }
};
/*****************************************************************************
* MiniportFilterDescription
*****************************************************************************
* Complete miniport description.
*/
static
PCFILTER_DESCRIPTOR MiniportFilterDescriptor =
{
0, // Version
&AutomationFilter, // AutomationTable
sizeof(PCPIN_DESCRIPTOR), // PinSize
SIZEOF_ARRAY(MiniportPins), // PinCount
MiniportPins, // Pins
sizeof(PCNODE_DESCRIPTOR), // NodeSize
SIZEOF_ARRAY(TopologyNodes), // NodeCount
TopologyNodes, // Nodes
SIZEOF_ARRAY(MiniportConnections), // ConnectionCount
MiniportConnections, // Connections
0, // CategoryCount
NULL // Categories: NULL->use default (audio, render, capture)
};
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -