windows-nt/Source/XPSP1/NT/drivers/ddk/wdmaudio/ac97/driver/shared.h
2020-09-26 16:20:57 +08:00

473 lines
13 KiB
C++

/********************************************************************************
** Copyright (c) 1998-2000 Microsoft Corporation. All Rights Reserved.
**
** Portions Copyright (c) 1998-1999 Intel Corporation
**
********************************************************************************/
#ifndef _SHARED_H_
#define _SHARED_H_
#define PC_IMPLEMENTATION 1
#include <portcls.h>
#include <stdunk.h>
#include "ichreg.h"
#include "ac97reg.h"
#include "debug.h"
/*****************************************************************************
* Structures and Typedefs
*/
// This enum defines all the possible pin configurations. It is pretty easy,
// cause a pin can be there or not, depending if the CoDec supports it (like
// Headphone output (PINC_HPOUT_PRESENT)) or if the OEM disabled the feature
// with a private inf file.
// Look at common.h file for the registry string names.
// ATTN: Don't change without changing the static struct in common.cpp too.
enum TopoPinConfig
{
PINC_PCBEEP_PRESENT = 0,
PINC_PHONE_PRESENT,
PINC_MIC2_PRESENT,
PINC_VIDEO_PRESENT,
PINC_AUX_PRESENT,
PINC_HPOUT_PRESENT,
PINC_MONOOUT_PRESENT,
PINC_MICIN_PRESENT,
PINC_MIC_PRESENT,
PINC_LINEIN_PRESENT,
PINC_CD_PRESENT,
PINC_SURROUND_PRESENT,
PINC_CENTER_LFE_PRESENT,
PINC_TOP_ELEMENT // number of PINC's
};
// This enum defines the functional configuration, called nodes. Nodes are
// black boxes that implement a functionality like 3d (NODEC_3D_PRESENT).
// At startup, we probe the Codec for features (like the pins above) and
// initialize an array which holds the configuration.
enum TopoNodeConfig
{
NODEC_3D_PRESENT = 0,
NODEC_TONE_PRESENT,
NODEC_LOUDNESS_PRESENT,
NODEC_SIMUL_STEREO_PRESENT,
NODEC_6BIT_MASTER_VOLUME,
NODEC_6BIT_HPOUT_VOLUME,
NODEC_6BIT_MONOOUT_VOLUME,
NODEC_6BIT_SURROUND_VOLUME,
NODEC_6BIT_CENTER_LFE_VOLUME,
NODEC_3D_CENTER_ADJUSTABLE,
NODEC_3D_DEPTH_ADJUSTABLE,
NODEC_PCM_VARIABLERATE_SUPPORTED,
NODEC_PCM_VSR_INDEPENDENT_RATES,
NODEC_PCM_DOUBLERATE_SUPPORTED,
NODEC_MIC_VARIABLERATE_SUPPORTED,
NODEC_CENTER_DAC_PRESENT,
NODEC_SURROUND_DAC_PRESENT,
NODEC_LFE_DAC_PRESENT,
NODEC_TOP_ELEMENT // number of NODES's
};
//
// Pin Defininition goes here
// We define all the possible pins in the AC97 CoDec and some "virtual" pins
// that are used for the topology to connect special functionality like 3D.
//
enum TopoPins
{
// Source is something that goes into the AC97, dest goes out.
PIN_WAVEOUT_SOURCE = 0,
PIN_PCBEEP_SOURCE,
PIN_PHONE_SOURCE,
PIN_MIC_SOURCE,
PIN_LINEIN_SOURCE,
PIN_CD_SOURCE,
PIN_VIDEO_SOURCE,
PIN_AUX_SOURCE,
PIN_VIRT_3D_CENTER_SOURCE,
PIN_VIRT_3D_DEPTH_SOURCE,
PIN_VIRT_3D_MIX_MONO_SOURCE,
PIN_VIRT_TONE_MIX_SOURCE,
PIN_VIRT_TONE_MIX_MONO_SOURCE,
PIN_VIRT_SURROUND_SOURCE,
PIN_VIRT_CENTER_SOURCE,
PIN_VIRT_LFE_SOURCE,
PIN_VIRT_FRONT_SOURCE,
PIN_MASTEROUT_DEST,
PIN_HPOUT_SOURCE,
PIN_MONOOUT_DEST,
PIN_WAVEIN_DEST,
PIN_MICIN_DEST,
PIN_TOP_ELEMENT, // number of pins
PIN_INVALID
};
#if (DBG)
// In case we print some debug information about the pins, we use the names
// defined here.
const PCHAR TopoPinStrings[] =
{
"PIN_WAVEOUT_SOURCE",
"PIN_PCBEEP_SOURCE",
"PIN_PHONE_SOURCE",
"PIN_MIC_SOURCE",
"PIN_LINEIN_SOURCE",
"PIN_CD_SOURCE",
"PIN_VIDEO_SOURCE",
"PIN_AUX_SOURCE",
"PIN_VIRT_3D_CENTER_SOURCE",
"PIN_VIRT_3D_DEPTH_SOURCE",
"PIN_VIRT_3D_MIX_MONO_SOURCE",
"PIN_VIRT_TONE_MIX_SOURCE",
"PIN_VIRT_TONE_MIX_MONO_SOURCE",
"PIN_VIRT_SURROUND_SOURCE",
"PIN_VIRT_CENTER_SOURCE",
"PIN_VIRT_LFE_SOURCE",
"PIN_VIRT_FRONT_SOURCE",
"PIN_MASTEROUT_DEST",
"PIN_HPOUT_SOURCE",
"PIN_MONOOUT_DEST",
"PIN_WAVEIN_DEST",
"PIN_MICIN_DEST",
"TOP_ELEMENT", // should never dump this
"INVALID" // or this either
};
#endif
//
// Node Definition goes here.
// We define all the possible nodes here (nodes are black boxes that represent
// a functional block like bass volume) and some virtual nodes, mainly volume
// controls, that are used to represent special functionality in the topology
// like 3D controls (exposed as volumes) or to give the user volume controls
// for each possible record line. In that case, the volume is placed in front
// of the record selector (mux). The topology is not parsed correctly if there
// are no volume controls between the pins and a muxer. Also, these virtual
// controls only represent volumes and no mutes, cause mutes wouldn't be dis-
// played by sndvol32.
// ATTN: DON'T change without first looking at the table in ac97reg.h!!!
enum TopoNodes
{
NODE_WAVEOUT_VOLUME = 0,
NODE_WAVEOUT_MUTE,
NODE_VIRT_WAVEOUT_3D_BYPASS, // exposed as AGC control
NODE_PCBEEP_VOLUME,
NODE_PCBEEP_MUTE,
NODE_PHONE_VOLUME,
NODE_PHONE_MUTE,
NODE_MIC_SELECT,
NODE_MIC_BOOST,
NODE_MIC_VOLUME,
NODE_MIC_MUTE,
NODE_LINEIN_VOLUME,
NODE_LINEIN_MUTE,
NODE_CD_VOLUME,
NODE_CD_MUTE,
NODE_VIDEO_VOLUME,
NODE_VIDEO_MUTE,
NODE_AUX_VOLUME,
NODE_AUX_MUTE,
NODE_MAIN_MIX,
NODE_VIRT_3D_CENTER, // we have no 3D control type, so we
NODE_VIRT_3D_DEPTH, // expose 2 volume controls and 2 mute
NODE_VIRT_3D_ENABLE, // checkboxs (the other is bypass).
NODE_BEEP_MIX,
NODE_BASS,
NODE_TREBLE,
NODE_LOUDNESS,
NODE_SIMUL_STEREO,
NODE_MASTEROUT_VOLUME,
NODE_MASTEROUT_MUTE,
NODE_HPOUT_VOLUME,
NODE_HPOUT_MUTE,
NODE_MONOOUT_SELECT,
NODE_VIRT_MONOOUT_VOLUME1, // each mono out must have volume
NODE_VIRT_MONOOUT_VOLUME2,
NODE_WAVEIN_SELECT,
NODE_VIRT_MASTER_INPUT_VOLUME1, // boy, each master input must have a
NODE_VIRT_MASTER_INPUT_VOLUME2, // volume
NODE_VIRT_MASTER_INPUT_VOLUME3,
NODE_VIRT_MASTER_INPUT_VOLUME4,
NODE_VIRT_MASTER_INPUT_VOLUME5,
NODE_VIRT_MASTER_INPUT_VOLUME6,
NODE_VIRT_MASTER_INPUT_VOLUME7,
NODE_VIRT_MASTER_INPUT_VOLUME8,
NODE_MICIN_VOLUME,
NODE_MICIN_MUTE,
NODE_SURROUND_VOLUME,
NODE_SURROUND_MUTE,
NODE_CENTER_VOLUME,
NODE_CENTER_MUTE,
NODE_LFE_VOLUME,
NODE_LFE_MUTE,
NODE_FRONT_VOLUME,
NODE_FRONT_MUTE,
NODE_VIRT_MASTERMONO_VOLUME, // used for multichannel or headphone
NODE_VIRT_MASTERMONO_MUTE,
NODE_TOP_ELEMENT, // number of nodes
NODE_INVALID
};
#if (DBG)
// In case we print some debug information about the nodes, we use names
// defined here.
const PCHAR NodeStrings[] =
{
"WAVEOUT_VOLUME",
"WAVEOUT_MUTE",
"WAVEOUT_3D_BYPASS",
"PCBEEP_VOLUME",
"PCBEEP_MUTE",
"PHONE_VOLUME",
"PHONE_MUTE",
"MIC_SELECT",
"MIC_BOOST",
"MIC_VOLUME",
"MIC_MUTE",
"LINEIN_VOLUME",
"LINEIN_MUTE",
"CD_VOLUME",
"CD_MUTE",
"VIDEO_VOLUME",
"VIDEO_MUTE",
"AUX_VOLUME",
"AUX_MUTE",
"MAIN_MIX",
"3D_CENTER",
"3D_DEPTH",
"3D_ENABLE",
"BEEP_MIX",
"BASS",
"TREBLE",
"LOUDNESS",
"SIMUL_STEREO",
"MASTER_VOLUME",
"MASTER_MUTE",
"HPOUT_VOLUME",
"HPOUT_MUTE",
"MONOOUT_SELECT",
"MONOOUT_VOLUME_3D_MIX",
"MONOOUT_VOLUME_MIC",
"WAVEIN_SELECT",
"MASTER_INPUT_VOLUME_MIC",
"MASTER_INPUT_VOLUME_CD",
"MASTER_INPUT_VOLUME_VIDEO",
"MASTER_INPUT_VOLUME_AUX",
"MASTER_INPUT_VOLUME_LINEIN",
"MASTER_INPUT_VOLUME_TONE_MIX",
"MASTER_INPUT_VOLUME_TONE_MIX_MONO",
"MASTER_INPUT_VOLUME_PHONE",
"MICIN_VOLUME",
"MICIN_MUTE",
"SURROUND_VOLUME",
"SURROUND_MUTE",
"CENTER_VOLUME",
"CENTER_MUTE",
"LFE_VOLUME",
"LFE_MUTE",
"FRONT_VOLUME",
"FRONT_MUTE",
"VIRT_MASTERMONO_VOLUME",
"VIRT_MASTERMONO_MUTE",
"TOP_ELEMENT", // should never dump this
"INVALID" // or this
};
#endif
//
// The pins used for the wave miniport connection.
//
enum WavePins
{
PIN_WAVEOUT = 0,
PIN_WAVEOUT_BRIDGE,
PIN_WAVEIN,
PIN_WAVEIN_BRIDGE,
PIN_MICIN,
PIN_MICIN_BRIDGE
};
//
// The nodes used for the wave miniport connection.
//
enum WaveNodes
{
NODE_WAVEOUT_DAC,
NODE_WAVEIN_ADC,
NODE_MICIN_ADC
};
/*****************************************************************************
* Function prototypes
*/
class CMiniportWaveICH;
/*****************************************************************************
* NewAdapterCommon()
*****************************************************************************
* Create a new adapter common object.
*/
NTSTATUS NewAdapterCommon
(
OUT PUNKNOWN * Unknown,
IN REFCLSID,
IN PUNKNOWN UnknownOuter OPTIONAL,
IN POOL_TYPE PoolType
);
/*****************************************************************************
* Class definitions
*/
/*****************************************************************************
* IMiniportTopologyICH
*****************************************************************************
* Interface for topology miniport.
*/
DECLARE_INTERFACE_(IMiniportTopologyICH,IMiniportTopology)
{
STDMETHOD_(NTSTATUS,GetPhysicalConnectionPins)
( THIS_
OUT PULONG WaveOutSource,
OUT PULONG WaveInDest,
OUT PULONG MicInDest
) PURE;
// Used for DRM:
STDMETHOD_(void, SetCopyProtectFlag)
( THIS_
IN BOOL
) PURE;
};
typedef IMiniportTopologyICH *PMINIPORTTOPOLOGYICH;
/*****************************************************************************
* IAdapterCommon
*****************************************************************************
* Interface for adapter common object.
*/
DECLARE_INTERFACE_(IAdapterCommon,IUnknown)
{
STDMETHOD_(NTSTATUS,Init)
( THIS_
IN PRESOURCELIST ResourceList,
IN PDEVICE_OBJECT DeviceObject
) PURE;
STDMETHOD_(BOOL,GetPinConfig)
( THIS_
IN TopoPinConfig
) PURE;
STDMETHOD_(void,SetPinConfig)
( THIS_
IN TopoPinConfig,
IN BOOL
) PURE;
STDMETHOD_(BOOL,GetNodeConfig)
( THIS_
IN TopoNodeConfig
) PURE;
STDMETHOD_(void,SetNodeConfig)
( THIS_
IN TopoNodeConfig,
IN BOOL
) PURE;
STDMETHOD_(AC97Register,GetNodeReg)
( THIS_
IN TopoNodes
) PURE;
STDMETHOD_(WORD,GetNodeMask)
( THIS_
IN TopoNodes
) PURE;
STDMETHOD_(NTSTATUS,ReadCodecRegister)
( THIS_
IN AC97Register Register,
OUT PWORD wData
) PURE;
STDMETHOD_(NTSTATUS,WriteCodecRegister)
( THIS_
IN AC97Register Register,
IN WORD wData,
IN WORD wMask
) PURE;
STDMETHOD_(UCHAR,ReadBMControlRegister8)
( THIS_
IN ULONG Offset
) PURE;
STDMETHOD_(USHORT,ReadBMControlRegister16)
( THIS_
IN ULONG Offset
) PURE;
STDMETHOD_(ULONG,ReadBMControlRegister32)
( THIS_
IN ULONG Offset
) PURE;
STDMETHOD_(void,WriteBMControlRegister)
( THIS_
IN ULONG Offset,
IN UCHAR Value
) PURE;
STDMETHOD_(void,WriteBMControlRegister)
( THIS_
IN ULONG Offset,
IN USHORT Value
) PURE;
STDMETHOD_(void,WriteBMControlRegister)
( THIS_
IN ULONG Offset,
IN ULONG Value
) PURE;
STDMETHOD_(NTSTATUS, RestoreCodecRegisters)
( THIS_
void
) PURE;
STDMETHOD_(NTSTATUS, ProgramSampleRate)
( THIS_
IN AC97Register Register,
IN DWORD dwSampleRate
) PURE;
// Used for DRM:
STDMETHOD_(void, SetMiniportTopology)
( THIS_
IN PMINIPORTTOPOLOGYICH
) PURE;
STDMETHOD_(PMINIPORTTOPOLOGYICH, GetMiniportTopology)
( THIS_
void
) PURE;
// These are used by the wave miniport.
STDMETHOD_(void, ReadChannelConfigDefault)
( THIS_
PDWORD pwChannelConfig,
PWORD pwChannels
) PURE;
STDMETHOD_(void, WriteChannelConfigDefault)
( THIS_
DWORD dwChannelConfig
) PURE;
};
typedef IAdapterCommon *PADAPTERCOMMON;
/*****************************************************************************
* Guids for the Interfaces
*****************************************************************************
*/
// {77481FA0-1EF2-11d2-883A-0080C765647D}
DEFINE_GUID(IID_IAdapterCommon,
0x77481fa0, 0x1ef2, 0x11d2, 0x88, 0x3a, 0x0, 0x80, 0xc7, 0x65, 0x64, 0x7d);
// {245AE964-49C8-11d2-95D7-00C04FB925D3}
DEFINE_GUID(IID_IMiniportTopologyICH,
0x245ae964, 0x49c8, 0x11d2, 0x95, 0xd7, 0x0, 0xc0, 0x4f, 0xb9, 0x25, 0xd3);
#endif //_SHARED_H_