www.pudn.com > CMIDriver-1.1.1-src.zip > interfaces.hpp


/* 
Copyright (c) 2006-2007 dogbert  
All rights reserved. 
 
Redistribution and use in source and binary forms, with or without 
modification, are permitted provided that the following conditions 
are met: 
1. Redistributions of source code must retain the above copyright 
   notice, this list of conditions and the following disclaimer. 
2. Redistributions in binary form must reproduce the above copyright 
   notice, this list of conditions and the following disclaimer in the 
   documentation and/or other materials provided with the distribution. 
3. The name of the author may not be used to endorse or promote products 
   derived from this software without specific prior written permission. 
 
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
*/ 
 
#ifndef _INTERFACES_HPP_ 
#define _INTERFACES_HPP_ 
 
#include  
#include  
 
#define MAXLEN_DMA_BUFFER		0x18000 
#define MAX_OUTPUT_STREAMS		1 
#define MAX_INPUT_STREAMS		1 
#define MAX_AC3_INPUT_STREAMS	1 
 
// PCM Info 
#define MIN_CHANNELS			2 
#define MAX_CHANNELS_PCM		8 
#define MIN_BITS_PER_SAMPLE_PCM	16 
#define MAX_BITS_PER_SAMPLE_PCM	32 
#define MIN_SAMPLE_RATE			44100 
#define MAX_SAMPLE_RATE			96000 
#define MAX_SAMPLE_RATE_MULTI   48000 
 
// AC3 Info 
#define MAX_CHANNELS_AC3		2 
#define MIN_BITS_PER_SAMPLE_AC3	16 
#define MAX_BITS_PER_SAMPLE_AC3	16 
#define MIN_SAMPLE_RATE_AC3		48000 
#define MAX_SAMPLE_RATE_AC3		48000 
 
 
#define PCM_OUT_STREAM 0 
#define PCM_IN_STREAM  1 
#define AC3_OUT_STREAM 2 
 
#define CHAN_LEFT	0 
#define CHAN_RIGHT	1 
#define CHAN_MASTER	(-1) 
 
#define IN_CHANNEL  0 
#define OUT_CHANNEL 1 
 
#define UInt32	ULONG 
#define UInt16	USHORT 
#define UInt8	BYTE 
#define Int32   LONG 
 
#define KSSTATE_STOP_AC3  (KSSTATE)5 
#define KSSTATE_RUN_AC3   (KSSTATE)6 
 
// Interface ICMITopology 
DECLARE_INTERFACE_(ICMITopology,IMiniportTopology) 
{ 
	STDMETHOD_(NTSTATUS,GetDescription) 
	(	THIS_ 
		PPCFILTER_DESCRIPTOR*  OutFilterDescriptor 
	)	PURE; 
	STDMETHOD_(NTSTATUS,DataRangeIntersection) 
	(	THIS_ 
		ULONG			PinId, 
		PKSDATARANGE	DataRange, 
		PKSDATARANGE	MatchingDataRange, 
		ULONG			OutputBufferLength, 
		PVOID			ResultantFormat, 
		PULONG			ResultantFormatLength 
	)	PURE; 
	STDMETHOD_(NTSTATUS,Init) 
	(	THIS_ 
		PUNKNOWN		UnknownAdapter, 
		PRESOURCELIST	ResourceList, 
		PPORTTOPOLOGY	Port 
	)	PURE; 
}; 
typedef ICMITopology *PCMITOPOLOGY; 
 
// Interface IMiniportWaveCMI 
DECLARE_INTERFACE_(IMiniportWaveCMI,IUnknown) 
{ 
	STDMETHOD_(void,ServiceWaveISR) 
	(	THIS_ 
		ULONG	channel 
	)	PURE; 
 
}; 
typedef IMiniportWaveCMI *PCMIWAVE; 
 
// structure to avoid the fucking COM crapola 
typedef struct CMI8738Info { 
	int				chipVersion; 
	int				maxChannels; 
	bool			canAC3HW, canAC3SW; 
	bool			canMultiChannel; 
	bool			doAC3SW; 
	bool			hasDualDAC; 
	UInt32*			IOBase; 
	UInt32*			MPUBase; 
	PCMIWAVE		WaveMiniport; 
	bool            enableSPDIFOut; 
	bool            enableSPDIFIn; 
	UInt32          formatMask; 
	UInt32          regFUNCTRL0; 
} CMI8738Info; 
typedef CMI8738Info* PCMI8738Info; 
 
typedef struct VolumeTable { 
	UInt32          node; 
	UInt8			reg; 
	UInt8           mask; 
	UInt8           shift; 
	Int32			max; 
	Int32           min; 
	Int32			step; 
	Int32           dbshift; 
} VolumeTable; 
 
// Interface ICMIAdapter 
DECLARE_INTERFACE_(ICMIAdapter,IUnknown) 
{ 
	STDMETHOD_(NTSTATUS,init) 
	(	THIS_ 
		PRESOURCELIST	ResourceList, 
		PDEVICE_OBJECT	DeviceObject 
	)	PURE; 
	STDMETHOD_(PINTERRUPTSYNC,getInterruptSync) 
	(	THIS_ 
		void 
	)	PURE; 
	STDMETHOD_(PDEVICE_OBJECT,getDeviceObject) 
	(	THIS_ 
		void 
	)	PURE; 
	STDMETHOD_(PCMI8738Info,getCMI8738Info) 
	(	THIS_ 
		void 
	)	PURE; 
	STDMETHOD_(void,ReadChannelConfigDefault) 
	(	THIS_ 
		PDWORD	pdwChannelConfig, 
		PWORD	pwChannels 
	)	PURE; 
	STDMETHOD_(void,WriteChannelConfigDefault) 
	(	THIS_ 
		DWORD	dwChannelConfig 
	)	PURE; 
 
    STDMETHOD_(UInt8, readUInt8) 
    (   THIS_ 
        UInt8 reg 
    )   PURE; 
    STDMETHOD_(void, writeUInt8) 
    (   THIS_ 
        UInt8 reg, 
        UInt8 value 
    )   PURE; 
    STDMETHOD_(void, setUInt8Bit) 
    (   THIS_ 
        UInt8 reg, 
        UInt8 flag 
    )   PURE; 
    STDMETHOD_(void, clearUInt8Bit) 
    (   THIS_ 
        UInt8 reg, 
        UInt8 flag 
    )   PURE; 
    STDMETHOD_(UInt16, readUInt16) 
    (   THIS_ 
        UInt8 reg 
    )   PURE; 
    STDMETHOD_(void, writeUInt16) 
    (   THIS_ 
        UInt8 reg, 
        UInt16 value 
    )   PURE; 
    STDMETHOD_(UInt32, readUInt32) 
    (   THIS_ 
        UInt8 reg 
    )   PURE; 
    STDMETHOD_(void, writeUInt32) 
    (   THIS_ 
        UInt8 reg, 
        UInt32 value 
    )   PURE; 
    STDMETHOD_(void, setUInt32Bit) 
    (   THIS_ 
        UInt8 reg, 
        UInt32 flag 
    )   PURE; 
    STDMETHOD_(void, clearUInt32Bit) 
    (   THIS_ 
        UInt8 reg, 
        UInt32 flag 
    )   PURE; 
    STDMETHOD_(UInt8, readMixer) 
    (   THIS_ 
        UInt8 index 
    )   PURE; 
    STDMETHOD_(void, writeMixer) 
    (   THIS_ 
        UInt8 index, 
        UInt8 value 
    )   PURE; 
    STDMETHOD_(void, setMixerBit) 
    (   THIS_ 
        UInt8 index, 
        UInt8 flag 
    )   PURE; 
    STDMETHOD_(void, clearMixerBit) 
    (   THIS_ 
        UInt8 index, 
        UInt8 flag 
    )   PURE; 
	STDMETHOD_(void,resetMixer) 
	(   THIS_ 
	)   PURE; 
	STDMETHOD_(NTSTATUS,activateMPU) 
	(   THIS_ 
	    ULONG*          MPUBase 
	)   PURE; 
}; 
typedef ICMIAdapter *PCMIADAPTER; 
 
// GUIDs 
 
// {34B338A2-BB40-4ecd-B97A-AEB03F325825} 
DEFINE_GUID(IID_ICMIAdapter, 0x34b338a2, 0xbb40, 0x4ecd, 0xb9, 0x7a, 0xae, 0xb0, 0x3f, 0x32, 0x58, 0x25); 
// {60BB55CF-C960-4ddf-B7A4-243978B2FE7B} 
DEFINE_GUID(IID_ICMITopolgy, 0x60bb55cf, 0xc960, 0x4ddf, 0xb7, 0xa4, 0x24, 0x39, 0x78, 0xb2, 0xfe, 0x7b); 
// {E8698236-D854-4da7-BF31-8332C614CE91} 
DEFINE_GUID(IID_IMiniportWaveCMI, 0xe8698236, 0xd854, 0x4da7, 0xbf, 0x31, 0x83, 0x32, 0xc6, 0x14, 0xce, 0x91); 
 
 
// {9DB14E9A-7BE7-480d-A2FA-32932489DE9C} 
#define STATIC_PRODUCT_CM8738 \ 
	0x9db14e9a, 0x7be7, 0x480d, 0xa2, 0xfa, 0x32, 0x93, 0x24, 0x89, 0xde, 0x9c 
DEFINE_GUIDSTRUCT("9DB14E9A-7BE7-480d-A2FA-32932489DE9C", PRODUCT_CM8738); 
#define PRODUCT_CM8738 DEFINE_GUIDNAMED(PRODUCT_CM8738) 
 
// {9DB14E9A-7BE7-480d-A2FA-32932489DE9D} 
#define STATIC_COMPONENT_CM8738 \ 
	0x9db14e9a, 0x7be7, 0x480d, 0xa2, 0xfa, 0x32, 0x93, 0x24, 0x89, 0xde, 0x9d 
DEFINE_GUIDSTRUCT("9DB14E9A-7BE7-480d-A2FA-32932489DE9D", COMPONENT_CM8738); 
#define COMPONENT_CM8738 DEFINE_GUIDNAMED(COMPONENT_CM8738) 
 
// {9DB14E9A-7BE7-480d-A2FA-32932489DE9E} 
#define STATIC_MANUFACTURER_CM8738 \ 
	0x9db14e9a, 0x7be7, 0x480d, 0xa2, 0xfa, 0x32, 0x93, 0x24, 0x89, 0xde, 0x9e 
DEFINE_GUIDSTRUCT("9DB14E9A-7BE7-480d-A2FA-32932489DE9E", MANUFACTURER_CM8738); 
#define MANUFACTURER_CM8738 DEFINE_GUIDNAMED(MANUFACTURER_CM8738) 
 
 
#define CMIPCI_VERSION   0x00 
 
// topology node names (refer to .inf file) 
// {2B81CDBB-EE6C-4ECC-8AA5-9A188B023DF0} 
#define STATIC_CMINAME_IEC_5V \ 
    0x2B81CDBB, 0xEE6C, 0x4ECC, 0x8A, 0xA5, 0x9A, 0x18, 0x8B, 0x02, 0x3D, 0xF0 
DEFINE_GUIDSTRUCT("2B81CDBB-EE6C-4ECC-8AA5-9A188B023DF0", _STATIC_CMINAME_IEC_5V); 
#define CMINAME_IEC_5V DEFINE_GUIDNAMED(_STATIC_CMINAME_IEC_5V) 
 
// {2B81CDBB-EE6C-4ECC-8AA5-9A188B023DF1} 
#define STATIC_CMINAME_IEC_OUT \ 
    0x2B81CDBB, 0xEE6C, 0x4ECC, 0x8A, 0xA5, 0x9A, 0x18, 0x8B, 0x02, 0x3D, 0xF1 
DEFINE_GUIDSTRUCT("2B81CDBB-EE6C-4ECC-8AA5-9A188B023DF1", _STATIC_CMINAME_IEC_OUT); 
#define CMINAME_IEC_OUT DEFINE_GUIDNAMED(_STATIC_CMINAME_IEC_OUT) 
 
// {2B81CDBB-EE6C-4ECC-8AA5-9A188B023DF2} 
#define STATIC_CMINAME_IEC_INVERSE \ 
    0x2B81CDBB, 0xEE6C, 0x4ECC, 0x8A, 0xA5, 0x9A, 0x18, 0x8B, 0x02, 0x3D, 0xF2 
DEFINE_GUIDSTRUCT("2B81CDBB-EE6C-4ECC-8AA5-9A188B023DF2", _STATIC_CMINAME_IEC_INVERSE); 
#define CMINAME_IEC_INVERSE DEFINE_GUIDNAMED(_STATIC_CMINAME_IEC_INVERSE) 
 
// {2B81CDBB-EE6C-4ECC-8AA5-9A188B023DF3} 
#define STATIC_CMINAME_IEC_MONITOR \ 
    0x2B81CDBB, 0xEE6C, 0x4ECC, 0x8A, 0xA5, 0x9A, 0x18, 0x8B, 0x02, 0x3D, 0xF3 
DEFINE_GUIDSTRUCT("2B81CDBB-EE6C-4ECC-8AA5-9A188B023DF3", _STATIC_CMINAME_IEC_MONITOR); 
#define CMINAME_IEC_MONITOR DEFINE_GUIDNAMED(_STATIC_CMINAME_IEC_MONITOR) 
 
// {2B81CDBB-EE6C-4ECC-8AA5-9A188B023DF4} 
#define STATIC_CMINAME_DAC \ 
    0x2B81CDBB, 0xEE6C, 0x4ECC, 0x8A, 0xA5, 0x9A, 0x18, 0x8B, 0x02, 0x3D, 0xF4 
DEFINE_GUIDSTRUCT("2B81CDBB-EE6C-4ECC-8AA5-9A188B023DF4", _STATIC_CMINAME_DAC); 
#define CMINAME_DAC DEFINE_GUIDNAMED(_STATIC_CMINAME_DAC) 
 
// {2B81CDBB-EE6C-4ECC-8AA5-9A188B023DF5} 
#define STATIC_CMINAME_IEC_SELECT \ 
    0x2B81CDBB, 0xEE6C, 0x4ECC, 0x8A, 0xA5, 0x9A, 0x18, 0x8B, 0x02, 0x3D, 0xF5 
DEFINE_GUIDSTRUCT("2B81CDBB-EE6C-4ECC-8AA5-9A188B023DF5", _STATIC_CMINAME_IEC_SELECT); 
#define CMINAME_IEC_SELECT DEFINE_GUIDNAMED(_STATIC_CMINAME_IEC_SELECT) 
 
// {2B81CDBB-EE6C-4ECC-8AA5-9A188B023DF6} 
#define STATIC_CMINAME_XCHG_FB \ 
    0x2B81CDBB, 0xEE6C, 0x4ECC, 0x8A, 0xA5, 0x9A, 0x18, 0x8B, 0x02, 0x3D, 0xF6 
DEFINE_GUIDSTRUCT("2B81CDBB-EE6C-4ECC-8AA5-9A188B023DF6", _STATIC_CMINAME_XCHG_FB); 
#define CMINAME_XCHG_FB DEFINE_GUIDNAMED(_STATIC_CMINAME_XCHG_FB) 
 
// {2B81CDBB-EE6C-4ECC-8AA5-9A188B023DF7} 
#define STATIC_CMINAME_BASS2LINE \ 
    0x2B81CDBB, 0xEE6C, 0x4ECC, 0x8A, 0xA5, 0x9A, 0x18, 0x8B, 0x02, 0x3D, 0xF7 
DEFINE_GUIDSTRUCT("2B81CDBB-EE6C-4ECC-8AA5-9A188B023DF7", _STATIC_CMINAME_BASS2LINE); 
#define CMINAME_BASS2LINE DEFINE_GUIDNAMED(_STATIC_CMINAME_BASS2LINE) 
 
// {2B81CDBB-EE6C-4ECC-8AA5-9A188B023DF8} 
#define STATIC_CMINAME_CENTER2LINE \ 
    0x2B81CDBB, 0xEE6C, 0x4ECC, 0x8A, 0xA5, 0x9A, 0x18, 0x8B, 0x02, 0x3D, 0xF8 
DEFINE_GUIDSTRUCT("2B81CDBB-EE6C-4ECC-8AA5-9A188B023DF8", _STATIC_CMINAME_CENTER2LINE); 
#define CMINAME_CENTER2LINE DEFINE_GUIDNAMED(_STATIC_CMINAME_CENTER2LINE) 
 
// {2B81CDBB-EE6C-4ECC-8AA5-9A188B023DF9} 
#define STATIC_CMINAME_IEC_COPYRIGHT \ 
    0x2B81CDBB, 0xEE6C, 0x4ECC, 0x8A, 0xA5, 0x9A, 0x18, 0x8B, 0x02, 0x3D, 0xF9 
DEFINE_GUIDSTRUCT("2B81CDBB-EE6C-4ECC-8AA5-9A188B023DF9", _STATIC_CMINAME_IEC_COPYRIGHT); 
#define CMINAME_IEC_COPYRIGHT DEFINE_GUIDNAMED(_STATIC_CMINAME_IEC_COPYRIGHT) 
 
// {2B81CDBB-EE6C-4ECC-8AA5-9A188B023DFA} 
#define STATIC_CMINAME_IEC_POLVALID \ 
    0x2B81CDBB, 0xEE6C, 0x4ECC, 0x8A, 0xA5, 0x9A, 0x18, 0x8B, 0x02, 0x3D, 0xFA 
DEFINE_GUIDSTRUCT("2B81CDBB-EE6C-4ECC-8AA5-9A188B023DFA", _STATIC_CMINAME_IEC_POLVALID); 
#define CMINAME_IEC_POLVALID DEFINE_GUIDNAMED(_STATIC_CMINAME_IEC_POLVALID) 
 
// {2B81CDBB-EE6C-4ECC-8AA5-9A188B023DFB} 
#define STATIC_CMINAME_IEC_LOOP \ 
    0x2B81CDBB, 0xEE6C, 0x4ECC, 0x8A, 0xA5, 0x9A, 0x18, 0x8B, 0x02, 0x3D, 0xFB 
DEFINE_GUIDSTRUCT("2B81CDBB-EE6C-4ECC-8AA5-9A188B023DFB", _STATIC_CMINAME_IEC_LOOP); 
#define CMINAME_IEC_LOOP DEFINE_GUIDNAMED(_STATIC_CMINAME_IEC_LOOP) 
 
// {2B81CDBB-EE6C-4ECC-8AA5-9A188B023DFC} 
#define STATIC_CMINAME_REAR2LINE \ 
    0x2B81CDBB, 0xEE6C, 0x4ECC, 0x8A, 0xA5, 0x9A, 0x18, 0x8B, 0x02, 0x3D, 0xFC 
DEFINE_GUIDSTRUCT("2B81CDBB-EE6C-4ECC-8AA5-9A188B023DFC", _STATIC_CMINAME_REAR2LINE); 
#define CMINAME_REAR2LINE DEFINE_GUIDNAMED(_STATIC_CMINAME_REAR2LINE) 
 
// {2B81CDBB-EE6C-4ECC-8AA5-9A188B023DFD} 
#define STATIC_CMINAME_CENTER2MIC \ 
    0x2B81CDBB, 0xEE6C, 0x4ECC, 0x8A, 0xA5, 0x9A, 0x18, 0x8B, 0x02, 0x3D, 0xFD 
DEFINE_GUIDSTRUCT("2B81CDBB-EE6C-4ECC-8AA5-9A188B023DFD", _STATIC_CMINAME_CENTER2MIC); 
#define CMINAME_CENTER2MIC DEFINE_GUIDNAMED(_STATIC_CMINAME_CENTER2MIC) 
 
//topology pins 
enum 
{ 
	PIN_WAVEOUT_SOURCE = 0, 
	PIN_SPDIFIN_SOURCE, 
	PIN_MIC_SOURCE, 
	PIN_CD_SOURCE, 
	PIN_LINEIN_SOURCE, 
	PIN_AUX_SOURCE, 
	PIN_DAC_SOURCE, 
	PIN_LINEOUT_DEST, 
	PIN_WAVEIN_DEST, 
	PIN_SPDIF_AC3_SOURCE, 
	PIN_SPDIF_AC3_DEST, 
 
	PIN_INVALID 
}; 
 
//topology nodes 
enum 
{ 
	KSNODE_TOPO_WAVEOUT_VOLUME = 0, 
	KSNODE_TOPO_WAVEOUT_MUTE, 
	KSNODE_TOPO_MICOUT_VOLUME, 
	KSNODE_TOPO_LINEOUT_MIX, 
	KSNODE_TOPO_LINEOUT_VOLUME, 
	KSNODE_TOPO_WAVEIN_SUM, 
	KSNODE_TOPO_CD_VOLUME, 
	KSNODE_TOPO_LINEIN_VOLUME, 
	KSNODE_TOPO_AUX_VOLUME, 
	KSNODE_TOPO_MICIN_VOLUME, 
	KSNODE_TOPO_MICIN_LOUDNESS, 
	KSNODE_TOPO_MICOUT_LOUDNESS, 
	KSNODE_TOPO_CD_MUTE, 
	KSNODE_TOPO_LINEIN_MUTE, 
	KSNODE_TOPO_MICOUT_MUTE, 
	KSNODE_TOPO_AUX_MUTE, 
	KSNODE_TOPO_LINEIN_MUTE_IN, 
	KSNODE_TOPO_MIC_MUTE_IN, 
	KSNODE_TOPO_AUX_MUTE_IN, 
	KSNODE_TOPO_CD_MUTE_IN, 
	KSNODE_TOPO_WAVEOUT_MUTE_IN, 
	KSNODE_TOPO_IEC_5V, 
	KSNODE_TOPO_IEC_OUT, 
	KSNODE_TOPO_IEC_INVERSE, 
	KSNODE_TOPO_IEC_MONITOR, 
	KSNODE_TOPO_IEC_SELECT, 
	KSNODE_TOPO_SPDIF_AC3_MUTE, 
	KSNODE_TOPO_SPDIF_AC3_MUX, 
	KSNODE_TOPO_XCHG_FB, 
	KSNODE_TOPO_BASS2LINE, 
	KSNODE_TOPO_CENTER2LINE, 
	KSNODE_TOPO_IEC_COPYRIGHT, 
	KSNODE_TOPO_IEC_POLVALID, 
	KSNODE_TOPO_IEC_LOOP, 
	KSNODE_TOPO_REAR2LINE, 
	KSNODE_TOPO_CENTER2MIC, 
	KSNODE_TOPO_MASTER_MUTE_DUMMY, 
 
	KSNODE_TOPO_INVALID 
}; 
 
//wave miniport pins 
enum 
{ 
	PIN_WAVE_CAPTURE_SINK = 0, 
	PIN_WAVE_CAPTURE_SOURCE, 
	PIN_WAVE_RENDER_SINK, 
	PIN_WAVE_RENDER_SOURCE, 
	PIN_WAVE_AC3_RENDER_SINK, 
	PIN_WAVE_AC3_RENDER_SOURCE, 
 
	PIN_WAVE_INVALID 
}; 
 
//wave miniport nodes 
enum 
{ 
	KSNODE_WAVE_ADC = 0, 
	KSNODE_WAVE_VOLUME1, 
	KSNODE_WAVE_3D_EFFECTS, 
	KSNODE_WAVE_SUPERMIX, 
	KSNODE_WAVE_VOLUME2, 
	KSNODE_WAVE_SRC, 
	KSNODE_WAVE_SUM, 
	KSNODE_WAVE_DAC, 
	KSNODE_WAVE_SPDIF, 
 
	KSNODE_WAVE_INVALID 
}; 
 
#endif //_INTERFACES_HPP_