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