一个函数实现调节录音控制麦克风输入音量

头文件包含:

#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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值