头文件包含:
- #include "mmsystem.h"
- #pragma comment(lib, "winmm.lib")
- BOOL SetMicrPhoneVolume(DWORD dwVolume)
- {
- BOOL bResult = FALSE;
- try
- {
- int mixerNum = (int)mixerGetNumDevs();
- for(int i = 0; i < mixerNum; i ++)
- {
- DWORD dwSource = 0;
- HMIXER m_hMixer = NULL;
- MMRESULT mr = NULL;
- //打开Mixer设备
- if(mixerOpen(&m_hMixer, i, 0, 0, MIXER_OBJECTF_MIXER) != MMSYSERR_NOERROR)
- continue;
- MIXERLINE MixerLine;
- //结构体的大小
- MixerLine.cbStruct = sizeof(MixerLine);
- //录制设备总线
- MixerLine.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_WAVEIN;
- //得到录制总线中的连接数
- if(mixerGetLineInfo((HMIXEROBJ)m_hMixer, &MixerLine,
- MIXER_OBJECTF_HMIXER | MIXER_GETLINEINFOF_COMPONENTTYPE) != MMSYSERR_NOERROR)
- continue;
- //将连接数保存
- DWORD dwConnections = MixerLine.cConnections;
- //准备获取麦克风设备的ID
- DWORD dwLineID = 0;
- for(DWORD i = 0; i < dwConnections; i++ )
- {
- //枚举每一个设备,当Source的ID等于当前的迭代记数
- MixerLine.dwSource = i;
- //根据SourceID获得连接的信息
- if(mixerGetLineInfo((HMIXEROBJ)m_hMixer, &MixerLine,
- MIXER_OBJECTF_HMIXER | MIXER_GETLINEINFOF_SOURCE) != MMSYSERR_NOERROR)
- //判断函数执行错误
- break;
- //如果当前设备类型是麦克风,则跳出循环。
- if(MixerLine.dwComponentType == MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE)
- {
- dwLineID = MixerLine.dwLineID;
- dwSource = MixerLine.dwSource;
- break;
- }
- }
- //如果没有找到,返回失败。
- if(dwLineID == 0)
- continue;
- //get line id of destination line
- MIXERLINE lineinfo_Dest;
- ::ZeroMemory(&lineinfo_Dest, sizeof(MIXERLINE));
- lineinfo_Dest.cbStruct = sizeof(MIXERLINE);
- lineinfo_Dest.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_WAVEIN;
- if(::mixerGetLineInfo(
- (HMIXEROBJ)m_hMixer,
- &lineinfo_Dest,
- MIXER_OBJECTF_HMIXER |
- MIXER_GETLINEINFOF_COMPONENTTYPE) != MMSYSERR_NOERROR)
- continue;
- //get id of specified connector
- MIXERLINE lineinfo_Connector;
- ::ZeroMemory(&lineinfo_Connector, sizeof(MIXERLINE));
- lineinfo_Connector.cbStruct = sizeof(MIXERLINE);
- lineinfo_Connector.dwDestination = lineinfo_Dest.dwLineID;
- lineinfo_Connector.dwSource = dwSource;
- if(::mixerGetLineInfo(
- (HMIXEROBJ)m_hMixer,
- &lineinfo_Connector,
- MIXER_GETLINEINFOF_SOURCE) != MMSYSERR_NOERROR)
- continue;
- MIXERCONTROL mxc;
- MIXERLINECONTROLS mxlc;
- mxlc.cbStruct = sizeof(MIXERLINECONTROLS);
- mxlc.dwLineID = lineinfo_Connector.dwLineID;
- mxlc.dwControlType = MIXERCONTROL_CONTROLTYPE_VOLUME;
- mxlc.cControls = 1;
- mxlc.cbmxctrl = sizeof(MIXERCONTROL);
- mxlc.pamxctrl = &mxc;
- if(::mixerGetLineControls(
- reinterpret_cast<HMIXEROBJ>(m_hMixer),
- &mxlc,
- MIXER_OBJECTF_HMIXER|MIXER_GETLINECONTROLSF_ONEBYTYPE)!= MMSYSERR_NOERROR)
- continue;
- //get volume value range now
- MIXERCONTROLDETAILS_UNSIGNED mxcdVolume;
- MIXERCONTROLDETAILS mxcd;
- mxcd.cbStruct = sizeof(MIXERCONTROLDETAILS);
- mxcd.dwControlID = mxc.dwControlID;
- mxcd.cChannels = 1;
- mxcd.cMultipleItems = 0;
- mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_UNSIGNED);
- mxcd.paDetails = &mxcdVolume;
- if(mixerGetControlDetails(
- reinterpret_cast<HMIXEROBJ>(m_hMixer),
- &mxcd,
- MIXER_GETCONTROLDETAILSF_VALUE)!= MMSYSERR_NOERROR)
- continue;
- //set volume
- MIXERCONTROLDETAILS_UNSIGNED mxcdVolume_Set = { mxc.Bounds.dwMaximum * dwVolume / 100 };
- MIXERCONTROLDETAILS mxcd_Set;
- mxcd_Set.cbStruct = sizeof(MIXERCONTROLDETAILS);
- mxcd_Set.dwControlID = mxc.dwControlID;
- mxcd_Set.cChannels = 1;
- mxcd_Set.cMultipleItems = 0;
- mxcd_Set.cbDetails = sizeof(MIXERCONTROLDETAILS_UNSIGNED);
- mxcd_Set.paDetails = &mxcdVolume_Set;
- if(mixerSetControlDetails(reinterpret_cast<HMIXEROBJ>(m_hMixer),
- &mxcd_Set,
- MIXER_OBJECTF_HMIXER | MIXER_SETCONTROLDETAILSF_VALUE) != MMSYSERR_NOERROR)
- continue;
- ::mixerClose(m_hMixer);
- m_hMixer = NULL;
- bResult = TRUE;;
- }
- }
- catch(...){ return FALSE; }
- return bResult;
- }
http://blog.csdn.net/augusdi/article/details/8760180