{
// 枚举每一个设备,当Source的ID等于当前的迭代记数
mxl.dwSource = i;
// 根据SourceID获得连接的信息
rc = mixerGetLineInfo( (HMIXEROBJ)hMixer, &mxl,
MIXER_OBJECTF_HMIXER | MIXER_GETLINEINFOF_SOURCE );
// 判断函数执行错误
if( MMSYSERR_NOERROR==rc )
{
// 如果当前设备类型是麦克风,则跳出循环。
if( mxl.dwComponentType==MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE )
{
dwLineID = mxl.dwLineID;
break;
}
}
}
// 如果没有找到,返回失败。
if( dwLineID==-1 )
{
//尝试其他声卡
continue;
}
// MIXERCONTROL 结构体变量清零
ZeroMemory(&mxc, sizeof(MIXERCONTROL));
mxc.cbStruct = sizeof(mxc); // 微软用此办法判断版本
// MIXERLINECONTROLS 结构体变量清零
ZeroMemory(&mxlc, sizeof(MIXERLINECONTROLS));
mxlc.cbStruct = sizeof(mxlc); // 微软用此办法判断版本
mxlc.dwLineID = dwLineID; // 上面取得的声卡音频输入线路标识
// 控制类型为控制音量
mxlc.dwControlType = MIXERCONTROL_CONTROLTYPE_VOLUME;
mxlc.cControls = 1; // 使用 MIXERCONTROL 结构体变量个数
mxlc.pamxctrl = &mxc; // MIXERCONTROL 结构体变量指针
mxlc.cbmxctrl = sizeof(mxc); // MIXERCONTROL 结构体变量字节大小
// 取得控制器信息
rc = mixerGetLineControls((HMIXEROBJ)hMixer,
&mxlc,
MIXER_GETLINECONTROLSF_ONEBYTYPE);
// 取得控制器信息成功的话,则
if (MMSYSERR_NOERROR == rc)
{
// 获取控制器中的值的音量范围:mxc.Bounds.lMinimum到mxc.Bounds.lMaximum.
MIXERCONTROLDETAILS mxcd; // 控制器的状态信息
MIXERCONTROLDETAILS_SIGNED volStruct; // 音量结构体变量(就一个成员量)
// MIXERCONTROLDETAILS 结构体变量清零
ZeroMemory(&mxcd, sizeof(mxcd));
mxcd.cbStruct = sizeof(mxcd); // 微软用此办法判断版本
mxcd.dwControlID = mxc.dwControlID; // 上面取得的控制器标识
mxcd.paDetails = &volStruct; // 音量结构体变量指针
mxcd.cbDetails = sizeof(volStruct); // 音量结构体变量字节大小
mxcd.cChannels = 1; // 取得或设置全部通道
// 获取控制器中的值的音量范围:mxc.Bounds.lMinimum到mxc.Bounds.lMaximum.
// 获得音量值
rc = mixerGetControlDetails((HMIXEROBJ)hMixer,
&mxcd,
MIXER_GETCONTROLDETAILSF_VALUE);
if (MMSYSERR_NOERROR == rc)
{
long step = ( mxc.Bounds.lMaximum - mxc.Bounds.lMinimum ) /100;
int index = ( volStruct.lValue - mxc.Bounds.lMinimum) /step ;
printf("音量:%X", volStruct.lValue);
return index;
}
}
}
return -1;
}
转载自 http://sunerok.blog.163.com/blog/static/231096422010112815525949/