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

头文件包含:

[cpp]  view plain copy
  1. #include "mmsystem.h"  
  2. #pragma comment(lib, "winmm.lib")  



[cpp]  view plain copy
  1. BOOL SetMicrPhoneVolume(DWORD dwVolume)  
  2. {  
  3.  BOOL bResult = FALSE;  
  4.  try  
  5.  {  
  6.   int mixerNum = (int)mixerGetNumDevs();  
  7.   for(int i = 0; i < mixerNum; i ++)  
  8.   {  
  9.    DWORD dwSource = 0;  
  10.    HMIXER m_hMixer = NULL;     
  11.    MMRESULT mr = NULL;  
  12.    //打开Mixer设备     
  13.    if(mixerOpen(&m_hMixer, i, 0, 0, MIXER_OBJECTF_MIXER) != MMSYSERR_NOERROR)  
  14.     continue;   
  15.    MIXERLINE MixerLine;     
  16.    //结构体的大小     
  17.    MixerLine.cbStruct = sizeof(MixerLine);     
  18.    //录制设备总线     
  19.    MixerLine.dwComponentType   =   MIXERLINE_COMPONENTTYPE_DST_WAVEIN;     
  20.    //得到录制总线中的连接数     
  21.    if(mixerGetLineInfo((HMIXEROBJ)m_hMixer, &MixerLine,  
  22.     MIXER_OBJECTF_HMIXER | MIXER_GETLINEINFOF_COMPONENTTYPE) != MMSYSERR_NOERROR)  
  23.     continue;   
  24.    //将连接数保存     
  25.    DWORD dwConnections = MixerLine.cConnections;     
  26.    //准备获取麦克风设备的ID     
  27.    DWORD dwLineID = 0;     
  28.    for(DWORD i = 0; i < dwConnections; i++ )     
  29.    {     
  30.     //枚举每一个设备,当Source的ID等于当前的迭代记数     
  31.     MixerLine.dwSource = i;     
  32.     //根据SourceID获得连接的信息     
  33.     if(mixerGetLineInfo((HMIXEROBJ)m_hMixer, &MixerLine,     
  34.      MIXER_OBJECTF_HMIXER | MIXER_GETLINEINFOF_SOURCE) != MMSYSERR_NOERROR)   
  35.      //判断函数执行错误     
  36.      break;    
  37.     //如果当前设备类型是麦克风,则跳出循环。     
  38.     if(MixerLine.dwComponentType == MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE)     
  39.     {     
  40.      dwLineID = MixerLine.dwLineID;  
  41.      dwSource = MixerLine.dwSource;  
  42.      break;     
  43.     }     
  44.    }  
  45.    //如果没有找到,返回失败。     
  46.    if(dwLineID == 0)     
  47.     continue;     
  48.    //get line id of destination line     
  49.    MIXERLINE lineinfo_Dest;     
  50.    ::ZeroMemory(&lineinfo_Dest, sizeof(MIXERLINE));     
  51.    lineinfo_Dest.cbStruct = sizeof(MIXERLINE);     
  52.    lineinfo_Dest.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_WAVEIN;     
  53.    if(::mixerGetLineInfo(     
  54.     (HMIXEROBJ)m_hMixer,     
  55.     &lineinfo_Dest,     
  56.     MIXER_OBJECTF_HMIXER   |       
  57.     MIXER_GETLINEINFOF_COMPONENTTYPE) != MMSYSERR_NOERROR)  
  58.     continue;    
  59.    //get id of specified connector     
  60.    MIXERLINE lineinfo_Connector;     
  61.    ::ZeroMemory(&lineinfo_Connector, sizeof(MIXERLINE));    
  62.    lineinfo_Connector.cbStruct = sizeof(MIXERLINE);     
  63.    lineinfo_Connector.dwDestination = lineinfo_Dest.dwLineID;     
  64.    lineinfo_Connector.dwSource = dwSource;     
  65.    if(::mixerGetLineInfo(     
  66.     (HMIXEROBJ)m_hMixer,     
  67.     &lineinfo_Connector,       
  68.     MIXER_GETLINEINFOF_SOURCE) != MMSYSERR_NOERROR)  
  69.     continue;    
  70.    MIXERCONTROL mxc;     
  71.    MIXERLINECONTROLS mxlc;     
  72.    mxlc.cbStruct = sizeof(MIXERLINECONTROLS);     
  73.    mxlc.dwLineID = lineinfo_Connector.dwLineID;     
  74.    mxlc.dwControlType = MIXERCONTROL_CONTROLTYPE_VOLUME;     
  75.    mxlc.cControls = 1;     
  76.    mxlc.cbmxctrl = sizeof(MIXERCONTROL);     
  77.    mxlc.pamxctrl = &mxc;     
  78.    if(::mixerGetLineControls(     
  79.     reinterpret_cast<HMIXEROBJ>(m_hMixer),     
  80.     &mxlc,     
  81.     MIXER_OBJECTF_HMIXER|MIXER_GETLINECONTROLSF_ONEBYTYPE)!= MMSYSERR_NOERROR)  
  82.     continue;    
  83.    //get volume value range now     
  84.    MIXERCONTROLDETAILS_UNSIGNED mxcdVolume;     
  85.    MIXERCONTROLDETAILS mxcd;     
  86.    mxcd.cbStruct = sizeof(MIXERCONTROLDETAILS);     
  87.    mxcd.dwControlID = mxc.dwControlID;     
  88.    mxcd.cChannels = 1;     
  89.    mxcd.cMultipleItems = 0;     
  90.    mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_UNSIGNED);     
  91.    mxcd.paDetails = &mxcdVolume;     
  92.    if(mixerGetControlDetails(     
  93.     reinterpret_cast<HMIXEROBJ>(m_hMixer),     
  94.     &mxcd,     
  95.     MIXER_GETCONTROLDETAILSF_VALUE)!= MMSYSERR_NOERROR)  
  96.     continue;    
  97.    //set volume     
  98.    MIXERCONTROLDETAILS_UNSIGNED mxcdVolume_Set = { mxc.Bounds.dwMaximum * dwVolume / 100 };     
  99.    MIXERCONTROLDETAILS mxcd_Set;     
  100.    mxcd_Set.cbStruct = sizeof(MIXERCONTROLDETAILS);     
  101.    mxcd_Set.dwControlID = mxc.dwControlID;     
  102.    mxcd_Set.cChannels = 1;     
  103.    mxcd_Set.cMultipleItems = 0;     
  104.    mxcd_Set.cbDetails = sizeof(MIXERCONTROLDETAILS_UNSIGNED);     
  105.    mxcd_Set.paDetails = &mxcdVolume_Set;     
  106.    if(mixerSetControlDetails(reinterpret_cast<HMIXEROBJ>(m_hMixer),     
  107.     &mxcd_Set,     
  108.     MIXER_OBJECTF_HMIXER | MIXER_SETCONTROLDETAILSF_VALUE) != MMSYSERR_NOERROR)  
  109.     continue;     
  110.    ::mixerClose(m_hMixer);  
  111.    m_hMixer = NULL;  
  112.    bResult = TRUE;;  
  113.   }  
  114.  }  
  115.  catch(...){ return FALSE; }  
  116.  return bResult;  
  117. }  

http://blog.csdn.net/augusdi/article/details/8760180
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值