天天看點

VC調節音量

//----------------------------設定音量---------------------------------------

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);