噪音及mixer

来源:互联网 发布:2016最新网络语言 编辑:程序博客网 时间:2024/04/27 19:30

 3524关于AC97声卡选择stereo mix录制的致命问题:
如果客户端有声音传送到服务端(不论是通过什么方式,可以是stereo mix录制过来的,也可以是
microphone录制过来的,或通过其它方式录制传送过来的),将导致服务端将客户端传送过来的
声音也进行录制,然后在传送给客户端,因此导致声音变成噪音。

而有的HD声卡,因为所有录制(stereo microphone line in等)默认都是开启的,也会有相关问题。
因为在默认情况下,所有录制都是开启状态,如果PC连接有line in线,且line in线有声音传送到PC,
而microphone也有声音输入,那么PC将分别通过line in录制和microphone录制将声音传送到远端,
同时,stereo也会将录制到的声音传送到远端,产生噪音。在这种情况下,应该关闭某些录制选项。

AC97客户端stereo --------- AC97服务端stereo   ERROR

AC97客户端stereo --------- AC97服务端Line in   ???

这个应该没有问题!!

AC97客户端stereo --------- HD服务端不选择(本想选stereo)  ???

这个应该会有和下面一样的问题~~

AC97客户端stereo --------- HD服务端不选择(本想选Line)   ERROR

这种情况下,如果将AC97客户端改为mic,将没有问题,可以接收到声音。说明服务端采用了Line in
录制,没有采用stereo录制,虽然两个都是开启状态。但如果AC97客户端选择stereo,将出现噪音,
说明服务端采用了Line in录制和stereo录制,或者只采用了stereo录制,这是怎么回事呢?

HD客户端不选择 --------- AC97服务端stereo

这种情况下,skype应该会选择microphone!!!所以出现噪音的可能性不大!!!

HD客户端不选择 --------- AC97服务端Line IN   OK


混音器设备(USB EMP Audio Device)静音控制
void SetDeviceMute(BOOL bValue)
{
 MMRESULT mmResult;
 HMIXER hMixer;
 MIXERCAPS mixercaps;

 MIXERLINE mixerline;
 memset(&mixerline,0,sizeof(MIXERLINE));
 mixerline.cbStruct = sizeof(MIXERLINE);

 MIXERLINECONTROLS mlc;
 memset(&mlc,0,sizeof(MIXERLINECONTROLS));
 mlc.cbStruct = sizeof(MIXERLINECONTROLS);

 MIXERCONTROL mc;
 memset(&mc,0,sizeof(MIXERCONTROL));
 mc.cbStruct = sizeof(MIXERCONTROL);

 UINT uNum = mixerGetNumDevs();
 for ( int i = 0; i < uNum; i++ )
 {
  mmResult = mixerOpen(&hMixer,i,0,0,MIXER_OBJECTF_MIXER);
  mmResult = mixerGetDevCaps(i,&mixercaps,sizeof(MIXERCAPS));
  for ( int j = 0; j < mixercaps.cDestinations; j++ )
  {
   mixerline.dwDestination = j;
   mmResult = mixerGetLineInfo((HMIXEROBJ)hMixer,&mixerline,MIXER_GETLINEINFOF_DESTINATION);
   if ( mixerline.dwComponentType == MIXERLINE_COMPONENTTYPE_DST_WAVEIN && mixercaps.cDestinations == 1)
   {
    mlc.cControls = 1;
    mlc.cbmxctrl = sizeof(MIXERCONTROL);                  
    mlc.pamxctrl = &mc;
    mlc.dwLineID = mixerline.dwLineID;
    mlc.dwControlType = MIXERCONTROL_CONTROLTYPE_MUTE;
    mmResult = mixerGetLineControls((HMIXEROBJ)hMixer,&mlc,MIXER_OBJECTF_HMIXER | MIXER_GETLINECONTROLSF_ONEBYTYPE);

    MIXERCONTROLDETAILS_BOOLEAN *pmxcdMute = (MIXERCONTROLDETAILS_BOOLEAN*)malloc(sizeof(MIXERCONTROLDETAILS_BOOLEAN));

    pmxcdMute[0].fValue = bValue;    

    MIXERCONTROLDETAILS mixercontroldetails;
    memset(&mixercontroldetails,0,sizeof(MIXERCONTROLDETAILS));

    mixercontroldetails.cbStruct = sizeof(MIXERCONTROLDETAILS);
    mixercontroldetails.cbDetails = sizeof(MIXERCONTROLDETAILS_BOOLEAN);
    mixercontroldetails.cChannels = 1;             
    mixercontroldetails.paDetails = pmxcdMute;
    mixercontroldetails.dwControlID = mc.dwControlID;

    mmResult = mixerSetControlDetails((HMIXEROBJ)hMixer,&mixercontroldetails,MIXER_SETCONTROLDETAILSF_VALUE | MIXER_OBJECTF_HMIXER);
    free(pmxcdMute);

   }
  }
 }
 mixerClose(hMixer);
}

 Audio Mixer Device音量调节

void AdjustDeviceVolume(BOOL bVolumeUp)
{
 MMRESULT mmResult;
 HMIXER hMixer;
 MIXERCAPS mixercaps;

 MIXERLINE mixerline;
 memset(&mixerline,0,sizeof(MIXERLINE));
 mixerline.cbStruct = sizeof(MIXERLINE);

 MIXERLINECONTROLS mlc;
 memset(&mlc,0,sizeof(MIXERLINECONTROLS));
 mlc.cbStruct = sizeof(MIXERLINECONTROLS);

 MIXERCONTROL mc;
 memset(&mc,0,sizeof(MIXERCONTROL));
 mc.cbStruct = sizeof(MIXERCONTROL);


 UINT uNum = mixerGetNumDevs();
 for ( int i = 0; i < uNum; i++ )
 {
  mmResult = mixerOpen(&hMixer,i,0,0,MIXER_OBJECTF_MIXER);
  mmResult = mixerGetDevCaps(i,&mixercaps,sizeof(MIXERCAPS));
  for ( int j = 0; j < mixercaps.cDestinations; j++ )
  {
   mixerline.dwDestination = j;
   mmResult = mixerGetLineInfo((HMIXEROBJ)hMixer,&mixerline,MIXER_GETLINEINFOF_DESTINATION);
   if ( mixerline.dwComponentType == MIXERLINE_COMPONENTTYPE_DST_WAVEIN && mixercaps.cDestinations == 1)
   {
    mlc.cControls = 1;
    mlc.cbmxctrl = sizeof(MIXERCONTROL);                  
    mlc.pamxctrl = &mc;
    mlc.dwLineID = mixerline.dwLineID;
    mlc.dwControlType = MIXERCONTROL_CONTROLTYPE_VOLUME;
    mmResult = mixerGetLineControls((HMIXEROBJ)hMixer,&mlc,MIXER_OBJECTF_HMIXER | MIXER_GETLINECONTROLSF_ONEBYTYPE);    

    MIXERCONTROLDETAILS_BOOLEAN* pControlDetail_BOOL = (MIXERCONTROLDETAILS_BOOLEAN*)malloc(mixerline.cChannels*sizeof(MIXERCONTROLDETAILS_BOOLEAN));
    if ( !pControlDetail_BOOL )
     return;

    MIXERCONTROLDETAILS mixercontroldetails;
    memset(&mixercontroldetails,0,sizeof(MIXERCONTROLDETAILS));

    mixercontroldetails.cbStruct = sizeof(MIXERCONTROLDETAILS);
    mixercontroldetails.cbDetails = sizeof(MIXERCONTROLDETAILS_BOOLEAN);
    mixercontroldetails.cChannels = 1;
    mixercontroldetails.cMultipleItems = 0;
    mixercontroldetails.paDetails = &pControlDetail_BOOL[0];
    mixercontroldetails.dwControlID = mc.dwControlID;

    mmResult = mixerGetControlDetails((HMIXEROBJ)hMixer,&mixercontroldetails,MIXER_GETCONTROLDETAILSF_VALUE | MIXER_OBJECTF_HMIXER);

    for ( int i = 0; i < mixerline.cChannels; i++ )
    {
     if(bVolumeUp)
     {
      pControlDetail_BOOL[i].fValue += 13107;
      if( pControlDetail_BOOL[i].fValue > 65535 )
      {
       pControlDetail_BOOL[i].fValue = 65535;
      }
     }
     else
     {
      pControlDetail_BOOL[i].fValue -= 13107;
      if( pControlDetail_BOOL[i].fValue < 0 )
      {
       pControlDetail_BOOL[i].fValue = 0;
      }
     }
    }

    mmResult = mixerSetControlDetails((HMIXEROBJ)hMixer,&mixercontroldetails,MIXER_SETCONTROLDETAILSF_VALUE | MIXER_OBJECTF_HMIXER);

    free(pControlDetail_BOOL);

   }
  }
 }
 mixerClose(hMixer);
}

 

void MuteMasterAudio()
{
 MMRESULT mmResult;
 HMIXER hMixer;
 MIXERCAPS mixercaps;

 MIXERLINE mixerline;
 memset(&mixerline,0,sizeof(MIXERLINE));
 mixerline.cbStruct = sizeof(MIXERLINE);

 MIXERLINECONTROLS mlc;
 memset(&mlc,0,sizeof(MIXERLINECONTROLS));
 mlc.cbStruct = sizeof(MIXERLINECONTROLS);

 MIXERCONTROL mc;
 memset(&mc,0,sizeof(MIXERCONTROL));
 mc.cbStruct = sizeof(MIXERCONTROL);

 DWORD dwStereoSelControlID;

 UINT uNum = mixerGetNumDevs();
 for ( int i = 0; i < uNum; i++ )
 {
  mmResult = mixerOpen(&hMixer,i,0,0,MIXER_OBJECTF_MIXER);
  mmResult = mixerGetDevCaps(i,&mixercaps,sizeof(MIXERCAPS));
  for ( int j = 0; j < mixercaps.cDestinations; j++ )
  {
   mixerline.dwDestination = j;
   mmResult = mixerGetLineInfo((HMIXEROBJ)hMixer,&mixerline,MIXER_GETLINEINFOF_DESTINATION);
   if ( mixerline.dwComponentType == MIXERLINE_COMPONENTTYPE_DST_SPEAKERS )
   {
    mlc.cControls = 1;
    mlc.cbmxctrl = sizeof(MIXERCONTROL);                  
    mlc.pamxctrl = &mc;
    mlc.dwLineID = mixerline.dwLineID;
    mlc.dwControlType = MIXERCONTROL_CONTROLTYPE_MUTE;
    mmResult = mixerGetLineControls((HMIXEROBJ)hMixer,&mlc,MIXER_OBJECTF_HMIXER | MIXER_GETLINECONTROLSF_ONEBYTYPE);

    dwStereoSelControlID = mc.dwControlID;        

    MIXERCONTROLDETAILS_BOOLEAN *pmxcdMute = (MIXERCONTROLDETAILS_BOOLEAN*)malloc(sizeof(MIXERCONTROLDETAILS_BOOLEAN));
                                                                 
    pmxcdMute[0].fValue = TRUE;     
     
    MIXERCONTROLDETAILS mixercontroldetails;
    memset(&mixercontroldetails,0,sizeof(MIXERCONTROLDETAILS));

    mixercontroldetails.cbStruct = sizeof(MIXERCONTROLDETAILS);
    mixercontroldetails.cbDetails = sizeof(MIXERCONTROLDETAILS_BOOLEAN);
    mixercontroldetails.cChannels = 1;             
    mixercontroldetails.paDetails = pmxcdMute;
    mixercontroldetails.dwControlID = dwStereoSelControlID;
    
    mmResult = mixerSetControlDetails((HMIXEROBJ)hMixer,&mixercontroldetails,MIXER_SETCONTROLDETAILSF_VALUE | MIXER_OBJECTF_HMIXER);
    free(pmxcdMute);

    }
   }
  }
  mixerClose(hMixer);
}

原创粉丝点击