100分 求解VC 用waveIn录音 音量调节问题,我找了一段代码,但不起任何作用.忘高手指点.
BOOL CWaveSound::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;
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;
case 4:
device = MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE;
break;
default:
device = MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;
}
if(MMSYSERR_NOERROR != ::mixerOpen(&hmixer, 0, 0, 0, 0))
return FALSE;
if(GetVolumeControl(hmixer,device,MIXERCONTROL_CONTROLTYPE_VOLUME,&volCtrl))
{
vol = vol * volCtrl.Bounds.lMaximum / 100;
if(SetVolumeValue(hmixer,&volCtrl,vol))
{
rc = TRUE;
}
}
else
{
rc = FALSE;
}
::mixerClose(hmixer);
return rc;
}
BOOL CWaveSound::GetVolumeControl(HMIXER hmixer ,long componentType,long ctrlType,MIXERCONTROL* mxc)
{
MIXERLINECONTROLS mxlc;
MIXERLINE mxl;
mxl.cbStruct = sizeof(mxl);
mxl.dwComponentType = componentType;
if(MMSYSERR_NOERROR == 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(MMSYSERR_NOERROR == mixerGetLineControls((HMIXEROBJ)hmixer,&mxlc,MIXER_GETLINECONTROLSF_ONEBYTYPE))
return TRUE;
else
return FALSE;
}
else
{
return FALSE;
}
}
//---------------------------------------------------------------------------
BOOL CWaveSound::SetVolumeValue(HMIXER hmixer,MIXERCONTROL *mxc,long volume)
{
MIXERCONTROLDETAILS mxcd;
MIXERCONTROLDETAILS_UNSIGNED vol;
vol.dwValue = volume;
mxcd.hwndOwner = 0;
mxcd.dwControlID = mxc->dwControlID;
mxcd.cbStruct = sizeof(mxcd);
mxcd.cbDetails = sizeof(vol);
mxcd.paDetails = &vol;
mxcd.cChannels = 1;
if(MMSYSERR_NOERROR == mixerSetControlDetails((HMIXEROBJ)hmixer,&mxcd,
MIXER_OBJECTF_HMIXER|MIXER_SETCONTROLDETAILSF_VALUE))
return TRUE;
return FALSE;
}