混音编程参考

#include "Mmsystem.h"
#include "Windows.h"

// Open the mixer device
   UINT uNum = mixerGetNumDevs();
HMIXER hmx; 
mixerOpen(&hmx,uNum-1,0,0,MIXER_OBJECTF_MIXER);
   // Get the line info for the wave in destination line
   MIXERLINE mxl;
   mxl.cbStruct = sizeof(mxl);
   mxl.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_WAVEIN;
   mixerGetLineInfo((HMIXEROBJ)hmx, &mxl, MIXER_GETLINEINFOF_COMPONENTTYPE);

   /*录音控制--必须开启,如果是静音,则无法录制声音*/
   // Find a mute control, if any, of the microphone line
LPMIXERCONTROL pmxctrl = (LPMIXERCONTROL)malloc(sizeof MIXERCONTROL);
MIXERLINECONTROLS mxlctrl = {sizeof mxlctrl, mxl.dwLineID, MIXERCONTROL_CONTROLTYPE_MUTE, 1, sizeof MIXERCONTROL, pmxctrl};
if(!mixerGetLineControls((HMIXEROBJ) hmx, &mxlctrl,MIXER_GETLINECONTROLSF_ONEBYTYPE))
{
  // Found, so proceed
  DWORD cChannels = mxl.cChannels;
  if (MIXERCONTROL_CONTROLF_UNIFORM & pmxctrl->fdwControl)
   cChannels = 1;
  //把录音控制设置为非静音模式
  LPMIXERCONTROLDETAILS_BOOLEAN pbool = (LPMIXERCONTROLDETAILS_BOOLEAN) malloc(cChannels * sizeof MIXERCONTROLDETAILS_BOOLEAN);
  MIXERCONTROLDETAILS mxcd = {sizeof(mxcd), pmxctrl->dwControlID,cChannels, (HWND)0,sizeof MIXERCONTROLDETAILS_BOOLEAN, (LPVOID) pbool};
  mixerGetControlDetails((HMIXEROBJ)hmx, &mxcd,MIXER_SETCONTROLDETAILSF_VALUE);
  // Unmute the microphone line (for both channels)
  pbool[0].fValue = pbool[cChannels - 1].fValue = 0;
  mixerSetControlDetails((HMIXEROBJ)hmx, &mxcd,MIXER_SETCONTROLDETAILSF_VALUE);
 
  free(pbool);
}
/*录音控制--音量设置为最大*/
MIXERLINECONTROLS mxlctrl2 = {sizeof mxlctrl, mxl.dwLineID, MIXERCONTROL_CONTROLTYPE_VOLUME, 1, sizeof MIXERCONTROL, pmxctrl};
if(!mixerGetLineControls((HMIXEROBJ) hmx, &mxlctrl2, MIXER_GETLINECONTROLSF_ONEBYTYPE))
{
  // Found, so proceed
  DWORD cChannels = mxl.cChannels;
  if (MIXERCONTROL_CONTROLF_UNIFORM & pmxctrl->fdwControl)
   cChannels = 1;
  //把录音控制音量设置为最大
  LPMIXERCONTROLDETAILS_UNSIGNED pUnsigned =(LPMIXERCONTROLDETAILS_UNSIGNED)malloc(cChannels * sizeof MIXERCONTROLDETAILS_UNSIGNED);
        MIXERCONTROLDETAILS mxcd2 = {sizeof(mxcd2), pmxctrl->dwControlID, cChannels, (HWND)0, sizeof MIXERCONTROLDETAILS_UNSIGNED, (LPVOID) pUnsigned};
        mixerGetControlDetails((HMIXEROBJ)hmx, &mxcd2, MIXER_SETCONTROLDETAILSF_VALUE);
        // Set the volume to the middle  (for both channels as needed)
        pUnsigned[0].dwValue = pUnsigned[cChannels - 1].dwValue = pmxctrl->Bounds.dwMaximum;
        mixerSetControlDetails((HMIXEROBJ)hmx, &mxcd2,MIXER_SETCONTROLDETAILSF_VALUE);

  free(pmxctrl);
  free(pUnsigned);
}

   // Now find the microphone source line connected to this wave in
   // destination
   DWORD cConnections = mxl.cConnections;
   for(DWORD j=0; j<cConnections; j++)
   {
      mxl.dwSource = j;
      mixerGetLineInfo((HMIXEROBJ)hmx, &mxl, MIXER_GETLINEINFOF_SOURCE);
   switch(mxl.dwComponentType)
   {

//这里只选择--立体混音

  case MIXERLINE_COMPONENTTYPE_SRC_ANALOG:
    {
    // Find a mute control, if any, of the microphone line
    LPMIXERCONTROL pmxctrl = (LPMIXERCONTROL)malloc(sizeof MIXERCONTROL);
    MIXERLINECONTROLS mxlctrl = {sizeof mxlctrl, mxl.dwLineID, MIXERCONTROL_CONTROLTYPE_MUTE, 1, sizeof MIXERCONTROL, pmxctrl};
    if(!mixerGetLineControls((HMIXEROBJ) hmx, &mxlctrl,MIXER_GETLINECONTROLSF_ONEBYTYPE))
    {
     // Found, so proceed
     DWORD cChannels = mxl.cChannels;
     if (MIXERCONTROL_CONTROLF_UNIFORM & pmxctrl->fdwControl)
      cChannels = 1;

     LPMIXERCONTROLDETAILS_BOOLEAN pbool = (LPMIXERCONTROLDETAILS_BOOLEAN) malloc(cChannels * sizeof MIXERCONTROLDETAILS_BOOLEAN);
     MIXERCONTROLDETAILS mxcd = {sizeof(mxcd), pmxctrl->dwControlID,cChannels, (HWND)0,sizeof MIXERCONTROLDETAILS_BOOLEAN, (LPVOID) pbool};
     mixerGetControlDetails((HMIXEROBJ)hmx, &mxcd,MIXER_SETCONTROLDETAILSF_VALUE);
     // Unmute the microphone line (for both channels)
     pbool[0].fValue = pbool[cChannels - 1].fValue = 0;
     mixerSetControlDetails((HMIXEROBJ)hmx, &mxcd,MIXER_SETCONTROLDETAILSF_VALUE);
     free(pmxctrl);
     free(pbool);
     }
     else
     free(pmxctrl);
     break;
    }

//其他通道通天静音
  default:
   {
    // Find a mute control, if any, of the microphone line
    LPMIXERCONTROL pmxctrl = (LPMIXERCONTROL)malloc(sizeof MIXERCONTROL);
    MIXERLINECONTROLS mxlctrl = {sizeof mxlctrl, mxl.dwLineID, MIXERCONTROL_CONTROLTYPE_MUTE, 1, sizeof MIXERCONTROL, pmxctrl};
    if(!mixerGetLineControls((HMIXEROBJ) hmx, &mxlctrl,MIXER_GETLINECONTROLSF_ONEBYTYPE))
    {
     // Found, so proceed
     DWORD cChannels = mxl.cChannels;
     if (MIXERCONTROL_CONTROLF_UNIFORM & pmxctrl->fdwControl)
      cChannels = 1;

     LPMIXERCONTROLDETAILS_BOOLEAN pbool = (LPMIXERCONTROLDETAILS_BOOLEAN) malloc(cChannels * sizeof MIXERCONTROLDETAILS_BOOLEAN);
     MIXERCONTROLDETAILS mxcd = {sizeof(mxcd), pmxctrl->dwControlID,cChannels, (HWND)0,sizeof MIXERCONTROLDETAILS_BOOLEAN, (LPVOID) pbool};
     mixerGetControlDetails((HMIXEROBJ)hmx, &mxcd,MIXER_SETCONTROLDETAILSF_VALUE);
     // Unmute the microphone line (for both channels)
     pbool[0].fValue = pbool[cChannels - 1].fValue = 1;
     mixerSetControlDetails((HMIXEROBJ)hmx, &mxcd,MIXER_SETCONTROLDETAILSF_VALUE);
     free(pmxctrl);
     free(pbool);
     }
     else
     free(pmxctrl);   
     break;
   }
   }
   }
   mixerClose(hmx);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值