//----------------------------設定音量---------------------------------------
bool getvolumecontrol(hmixer hmixer ,long componenttype,long ctrltype,mixercontrol* mxc)
{
mixerlinecontrols mxlc;
mixerline mxl;
mxl.cbstruct = sizeof(mxl);
mxl.dwcomponenttype = componenttype;
if(!mixergetlineinfo((hmixerobj)hmixer, &mxl, mixer_getlineinfof_componenttype))
mxlc.cbstruct = sizeof(mxlc);
mxlc.dwlineid = mxl.dwlineid;
mxlc.dwcontroltype = ctrltype;
mxlc.ccontrols = 1;
mxlc.cbmxctrl = sizeof(mixercontrol);
mxlc.pamxctrl = mxc;
if(mixergetlinecontrols((hmixerobj)hmixer,&mxlc,mixer_getlinecontrolsf_onebytype))
return 0;
else
return 1;
}
//---------------------------------------------------------------------------
long getmutevalue(hmixer hmixer ,mixercontrol *mxc)
mixercontroldetails mxcd;
mixercontroldetails_boolean mxcdmute;
mxcd.hwndowner = 0;
mxcd.cbstruct = sizeof(mxcd);
mxcd.dwcontrolid = mxc->dwcontrolid;
mxcd.cbdetails = sizeof(mxcdmute);
mxcd.padetails = &mxcdmute;
mxcd.cchannels = 1;
mxcd.cmultipleitems = 0;
if (mixergetcontroldetails((hmixerobj)hmixer, &mxcd,mixer_objectf_hmixer|mixer_getcontroldetailsf_value))
return -1;
return mxcdmute.fvalue;
unsigned getvolumevalue(hmixer hmixer ,mixercontrol *mxc)
mixercontroldetails_unsigned vol; vol.dwvalue=0;
mxcd.cbdetails = sizeof(vol);
mxcd.padetails = &vol;
if(mixergetcontroldetails((hmixerobj)hmixer, &mxcd, mixer_objectf_hmixer|mixer_getcontroldetailsf_value))
return vol.dwvalue;
bool setmutevalue(hmixer hmixer ,mixercontrol *mxc, bool mute)
mixercontroldetails_boolean mxcdmute;mxcdmute.fvalue=mute;
if (mixersetcontroldetails((hmixerobj)hmixer, &mxcd, mixer_objectf_hmixer|mixer_setcontroldetailsf_value))
bool setvolumevalue(hmixer hmixer ,mixercontrol *mxc, long volume)
mixercontroldetails_unsigned vol;vol.dwvalue = volume;
if(mixersetcontroldetails((hmixerobj)hmixer, &mxcd, mixer_objectf_hmixer|mixer_setcontroldetailsf_value))
unsigned winapi getvolume(int dev)//得到裝置的音量dev=0主音量,1wave ,2midi ,3 line in
long device;unsigned rt=0;
mixercontrol volctrl;
hmixer hmixer;
switch (dev)
case 1:
device=mixerline_componenttype_src_waveout; break;
case 2:
device=mixerline_componenttype_src_synthesizer; break;
case 3:
// device=mixerline_componenttype_src_compactdisc; break; // cd 音量
// device=mixerline_componenttype_src_microphone; break; //麥克風音量
// device=mixerline_componenttype_src_line; break; //pc 揚聲器音量
device=mixerline_componenttype_src_compactdisc; break;
default:
device=mixerline_componenttype_dst_speakers;
if(mixeropen(&hmixer, 0, 0, 0, 0)) return 0;
if(!getvolumecontrol(hmixer,device,mixercontrol_controltype_volume,&volctrl))
rt=getvolumevalue(hmixer,&volctrl)*100/volctrl.bounds.lmaximum;
mixerclose(hmixer);
return rt;
bool winapi setvolume(long dev,long vol)//設定裝置的音量
// dev =0,1,2 分别表示主音量,波形,midi ,line in
// vol=0-100 表示音量的大小 , 設定與傳回音量的值用的是百分比,即音量從0 - 100,而不是裝置的絕對值
// retrun false 表示設定音量的大小的操作不成功
// retrun true 表示設定音量的大小的操作成功
long device;
bool rc=false;
if(getvolumecontrol(hmixer,device,mixercontrol_controltype_volume,&volctrl))
vol=vol*volctrl.bounds.lmaximum/100;
if(setvolumevalue(hmixer,&volctrl,vol))
rc=true;
return rc;
bool winapi setmute(long dev,long vol)//設定裝置靜音
// vol=0,1 分别表示取消靜音,設定靜音
// retrun false 表示取消或設定靜音操作不成功
// retrun true 表示取消或設定靜音操作成功
if(getvolumecontrol(hmixer,device,mixercontrol_controltype_mute,&volctrl))
if(setmutevalue(hmixer,&volctrl,(bool)vol))
bool winapi getmute(long dev)//檢查裝置是否靜音
//dev =0,1,2 分别表示主音量,波形,midi ,line in
// retrun false 表示沒有靜音
// retrun true 表示靜音
rc=getmutevalue(hmixer,&volctrl);
使用:
//調節音量
void __fastcall tform1::trackbar0change(tobject *sender)
setvolume(0,trackbar0->position*10);
//靜音
void __fastcall tform1::checkbox0click(tobject *sender)
setmute(0,checkbox0->checked);
}