⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tables.h

📁 winddk src目录下的WDM源码压缩!
💻 H
📖 第 1 页 / 共 2 页
字号:
 * 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 + -