Windows混音器API使用

 
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 ;
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值