我想用两个按钮来控制系统声音,不知道怎么才能实现?
解决方案 »
- 求大虾解释下
- 我想在vs2003环境下,学习用MFC开发ActiveX控件,大家谁有什么好的教程,请发给我.
- 关于CTreeCtrl,还是有问题,真诚请教。
- 我朋友猎狐的.NET技术与休闲社区初运行,欢迎大家去测试(www.lyhu.com/bbs),谢谢^_^
- 怎样让对话框显示后改变大小啊
- 麻烦请问各OpenGL高手。
- 用socket进行网络通信
- 请教大家,如何捕获文件被修改的消息?
- 请帮忙解决下mfc中读取txt文档中的内容并按行显示,出现的问题
- 远程关机函数InitiateSystemShutdown的使用,请教大家!
- 怎么用vc发出音乐声音,可以调节频率及音量大小?
- 请问为什么我的TRACE语句没有输出的?
控制声音的大小,要对声卡进行操作,用SDK函数waveOutSetVolume即可
void CEffectsPage::OnReleasedcaptureSliderSystemVolume(NMHDR* pNMHDR, LRESULT* pResult)
{
m_dSystemVolume = (36-m_SystemVolume.GetPos());
TRACE("%d\n",m_dSystemVolume);
UINT m_nNumMixers,Open;
HMIXER m_hMixer= NULL;
MIXERCAPS m_mxcaps;
BOOL bSucc = TRUE;
m_nNumMixers = ::mixerGetNumDevs();
for(Open=0;Open<m_nNumMixers;Open++)
{
::ZeroMemory(&m_mxcaps, sizeof(MIXERCAPS));
if (::mixerOpen(&m_hMixer,Open,NULL,NULL,MIXER_OBJECTF_MIXER)!= MMSYSERR_NOERROR)
return ;
if (::mixerGetDevCaps((UINT)m_hMixer, &m_mxcaps, sizeof(MIXERCAPS))!= MMSYSERR_NOERROR)
return ;
////////////////////////////
MIXERLINE mxl;
MIXERCONTROL mxc;
MIXERLINECONTROLS mxlc;
DWORD m_dwMinimum,m_dwMaximum,m_dwVolumeControlID;
if (m_hMixer == NULL) return ;
mxl.cbStruct = sizeof(MIXERLINE);
mxl.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;
if (::mixerGetLineInfo((HMIXEROBJ)m_hMixer, &mxl, MIXER_OBJECTF_HMIXER ¦
MIXER_GETLINEINFOF_COMPONENTTYPE)!= MMSYSERR_NOERROR)
return ;
// get dwControlID
mxlc.cbStruct = sizeof(MIXERLINECONTROLS);
mxlc.dwLineID = mxl.dwLineID;
mxlc.dwControlType = MIXERCONTROL_CONTROLTYPE_VOLUME;
mxlc.cControls = 1;
mxlc.cbmxctrl = sizeof(MIXERCONTROL);
mxlc.pamxctrl = &mxc;
if (::mixerGetLineControls((HMIXEROBJ)m_hMixer, &mxlc, MIXER_OBJECTF_HMIXER ¦
MIXER_GETLINECONTROLSF_ONEBYTYPE)!= MMSYSERR_NOERROR)
return ;
// record dwControlID
m_dwMinimum = mxc.Bounds.dwMinimum;
m_dwMaximum = mxc.Bounds.dwMaximum;
m_dwVolumeControlID = mxc.dwControlID;
////////////////////////////////////////////////
MIXERCONTROLDETAILS_UNSIGNED mxcdVolume;
MIXERCONTROLDETAILS mxcd;
LONG dwVal;
if (m_hMixer == NULL) return ;
mxcd.cbStruct = sizeof(MIXERCONTROLDETAILS);
mxcd.dwControlID = m_dwVolumeControlID;
mxcd.cChannels = 1;
mxcd.cMultipleItems = 0;
mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_UNSIGNED);
mxcd.paDetails = &mxcdVolume;
if (::mixerGetControlDetails((HMIXEROBJ)m_hMixer,&mxcd,MIXER_OBJECTF_HMIXER ¦
MIXER_GETCONTROLDETAILSF_VALUE)!= MMSYSERR_NOERROR)
return ;
dwVal = mxcdVolume.dwValue;
dwVal=(0x0000ffff/36)*m_dSystemVolume;
mxcdVolume.dwValue =dwVal ;
///////////////////////////////////////////////////
// MIXERCONTROLDETAILS_UNSIGNED mxcdVolume = { dwVal };
// MIXERCONTROLDETAILS mxcd;
if (m_hMixer == NULL) return ;
mxcd.cbStruct = sizeof(MIXERCONTROLDETAILS);
mxcd.dwControlID = m_dwVolumeControlID;
mxcd.cChannels = 1;
mxcd.cMultipleItems = 0;
mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_UNSIGNED);
mxcd.paDetails = &mxcdVolume;
if (::mixerSetControlDetails((HMIXEROBJ)m_hMixer,&mxcd,MIXER_OBJECTF_HMIXER ¦
MIXER_SETCONTROLDETAILSF_VALUE)!= MMSYSERR_NOERROR)
return ;
//////////////////
if (m_hMixer != NULL)
{
bSucc = ::mixerClose(m_hMixer) == MMSYSERR_NOERROR;
m_hMixer = NULL;
}
}//Set every device's volume
RegSetValueEx(m_hKey, "SystemVolume", 0, REG_DWORD, (PBYTE)&m_dSystemVolume, sizeof(float));
*pResult = 0;
}
回复人: tony_1029(tian) ( ) 信誉:100 2002-1-22 20:47:04 得分:0
to huazai():调用waveOutSetVolume()之后就成了单声道。
回复人: huazai() ( ) 信誉:100 2002-1-23 10:56:32 得分:0
首先在调用waveOutOpen()时,参数中设置为双声道,另外,waveOutSetVolume中参数中低子节为左声道音量值,高字节为右声道音量值,