Windows混音器API使用
1.首先用mixerGetNumDevs()函数获取系统中的混音器设备的数量。一般,机器上都至少有一个混音器设备——声卡,如果机器上没有连接其它的音频设备,那么也就只有声卡这一个混音器设备。我的机器上接有一个名为USB EMP Audio Dedice的录音设备,所以该函数返回2,表示有两个混音器设备:Realtec AC97 Audio和USB EMP Audio Dedice。
UINT uNum = mixerGetNumDevs();
2.使用mixerOpen()函数打开需要控制的混音器设备,获取其句柄。此函数第一个参数是一个传出参数,被打开的混音器设备句柄将写入其中,可作为后面一些函数的传入参数,第二个参数
uMxId
(
Identifier of the mixer device to open)是一个传入参数,用它来指定需要打开的混音器设备,最后一个参数指出怎样打开混音器设备。
MIXER_OBJECTF_MIXER
说明
The uMxId parameter is a mixer device identifier in the range of zero to one less than the number of devices returned by the mixerGetNumDevs function. This flag is optional.
下面的代码将依次打开系统中所以的混音器设备:
HMIXER hMixer;
for ( int id = 0; id < uNum; id++ )
{
mixerOpen(&hMixer,id,0,0,
MIXER_OBJECTF_MIXER);
}
3.
使用
mixerGetDevCaps()
函数获取一个打开的混音器设备的能力特征
,
它的第一个参数为
uMxId
(
Identifier or handle of an open mixer device
),是一个打开的混音器设备的
ID
号。第二个参数是一个传出参数,将返回一个
MIXERCAPS
的结构。此结构中包含有此混音器设备的信息,其中有用的是
cDestinations
成员(
member
)(
The number of audio line destinations available through the mixer device
)它表示此混音器设备的
audio line
目标的数量。
Realtec AC97 Audio
有两个
audio line
目标(
audio line destination
),一个
audio line
目标为“音量控制”,另一个
audio line
目标为“录音控制”。
MIXERCAPS mixercaps;
mixerGetDevCaps(id,&mixercaps,sizeof(MIXERCAPS));
如果打开的混音器设备是
Realtec AC97 Audio
,可以看到mixercaps.cDestinations将等于2.
4.使用mixerGetLineInfo()函数
retrieves information about a specific line of a mixer device
,用它来获取混音器设备某一
line
的信息。它的第一个参数类型为
HMIXEROBJ
(混音器设备对象句柄,注意区别于前面的混音器设备句柄)(
Handle to the mixer device object that controls the specific audio line
)
,是一个传入参数,表示需要获取此混音器设备对象的
line information
,此参数可以用前面获得的混音器设备句柄或
ID
号转换得到:
(HMIXEROBJ)hMixer
或
(HMIXEROBJ)id
。它的第二个参数类型为
LPMIXERLINE,
为“传入和传出”参数,将传入并返回一个类型为
MIXERLINE
的结构。第三个参数指定此函数获取
line info
的方式,例如可以是
by component type
(通过线路的
component
类型),也可以是
by line id
(通过线路的
ID
号),还可以是
MIXER_GETLINEINFOF_DESTINATION
和
MIXER_GETLINEINFOF_SOURCE
等
。你可以根据实际需要选择合适的方式。
注意:第三个参数的选择对第二个参数(
MIXERLINE
)的传入值的设定有要求,如果选择
by component type
方式,那么
MIXERLINE
必须初始化其
dwComponentType
成员再传入,而如果选择
by line id
方式,则
MIXERLINE
必须先初始化其
dwLineID
成员再传入。
下面看一些例子
,
注意首先要对
MIXERLINE
结构的
cbStruct
成员进行初始化(
The cbStruct member must always be initialized to be the size, in bytes, of the MIXERLINE structure
)
MIXERLINE mixerline;
memset(&mixerline,0,sizeof(MIXERLINE));
mixerline.cbStruct = sizeof(MIXERLINE);
如果根据
line
的
component
类型来获取
line
的
information
。注意,因为有可能不同的两个
line
的
component
类
型相同
,
因此有必要作进一步的判别以获得正确的
line
的
ID
或句柄。(例如再根据获取的
line
的
szName
成员进行判断)
// By component type
例子
//
音量控制目标
line
的
component
类型为
MIXERLINE_COMPONENTTYPE_
DST_SPEAKERS
mixerline.
dwComponentType
=MIXERLINE_COMPONENTTYPE_
DST_SPEAKERS
;
mmResult=mixerGetLineInfo((HMIXEROBJ)
id
,&mixerline,MIXER_OBJECTF_
MIXER
| MIXER_GETLINEINFOF_
COMPONENTTYPE
);
//
录音控制目标
line
的
component
类型为
MIXERLINE_COMPONENTTYPE_
DST_
WAVEIN
mixerline.
dwComponentType
=MIXERLINE_COMPONENTTYPE_
DST_WAVEIN
;