如何从C#调整麦克风增益(需要在XP和W7上工作)首先,请注意,我知道有一些已发布的问题;但他们似乎没有充分解决这个问题。我有一个C#应用程序,所有pInvoke挂钩都与waveXXXAPI通信,我可以使用它来捕获和播放音频。我还可以使用API调整扬声器(WaveOut)音量。问题是,无论出于何种原因,API都不允许我调整麦克风(WaveIn)音量。因此,我设法找到了一些调音台代码,我也已将其pInvoke并允许我调整麦克风音量,但仅限于我的W7PC。我开始使用的混音器代码来自这里:http://social.msdn.microsoft.com/Forums/en-US/isvvba/thread/05dc2d35-1d45-4837-8e16-562ee919da85它有效,但写了Adjustspeakervolume。我添加了此处显示的SetMicVolume方法……publicstaticvoidSetMicVolume(intmxid,intpercentage){boolrc;int混合器,vVolume;MIXERC??ONTROLvolCtrl=newMIXERC??ONTROL();intcurrentVol;mixerOpen(输出混音器,mxid,0、0,MIXER_OBJECTF_WAVEIN);int类型=MIXERC??ONTROL_CONTROLTYPE_VOLUME;rc=GetVolumeControl(混音器,MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE,类型,输出volCtrl,输出currentVol);如果(rc==false){mixerClose(混音器);mixerOpen(输出混频器,0、0、0、0);rc=GetVolumeControl(混音器,MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE,类型,输出volCtrl,输出currentVol);if(rc==false)thrownewException("SetMicVolume/GetVolumeControl()failed");}vVolume=((int)((float)(volCtrl.lMaximum-volCtrl.lMinimum)/100.0F)*百分比);rc=SetVolumeControl(混音器,volCtrl,vVolume);如果(rc==false)thrownewException("SetMicVolume/SetVolumeControl()failed");混音器关闭(混音器);}注意调用GetVolumeControl()的“第二次尝试”。这样做是因为在XP上,在第一次调用GetVolumeControl时(请参阅上述站点的代码),调用mixerGetLineControlsA()失败并且XP系统返回MIXERR_INVALCONTROL。然后,在第二次尝试使用mixerOpen(output-mixer,0,0,0,0)时,代码未返回任何错误,但麦克风增益不受影响。请注意,正如我上面所说,这适用于W7(第二次尝试从未执行,因为它使用mixerOpen(outputmixer,mxid,0,0,MIXER_OBJECTF_WAVEIN)而没有失败)。我承认我没有很好地掌握混音器API,所以这就是我现在正在做的事情;但是,如果有人知道为什么这适用于W7而不是XP,我绝对想听听。与此同时,如果我在得到答案之前弄清楚,我会发布我自己的答案......我只是在使用NAudio编写.NET录音机时尝试这样做,发现它非常困难。您最终可能会编写两份代码,一份用于XP,一份用于Vista/Win7。我将NAudio用于混音器互操作。这就是我最终得到的结果(并非在任何地方都有效)if(Environment.OSVersion.Version.Major>=6)//Vista及以上版本{varmixerLine=newMixerLine((IntPtr)waveInDeviceNumber,0,MixerFlags.WaveIn);foreach(varcontrolinmixerLine.Controls){if(control.ControlType==MixerControlType.Volume){volumeControl=controlasUnsignedMixerControl;麦克风级别=desiredVolume;休息;}}}else{varmixer=newMixer(waveInDeviceNumber);foreach(vardestinationinmixer.Destinations){if(destination.ComponentType==MixerLineComponentType.DestinationWaveIn){foreach(varsourceindestination.Sources){if(source.ComponentType==MixerLineComponentType.SourceMicrophone){foreach(var控制在源中.Controls){if(control.ControlType==MixerControlType.Volume){volumeControl=controlasUnsignedMixerControl;麦克风级别=desiredVolume;休息;}}}}}}}}下面的代码现在似乎对我有用(2更新06/29/010)请注意,我的测试用例是我的两台PC,一台W7和另一台XP,所以它不是决定性的。我已经证实这并不适用于所有机器,但对于那些适用的机器,似乎没问题。publicstaticboolsetMicVolume(intmxid,intpercentage){if(mixerdisabled)return(false);布尔RC;int混合器,vVolume,ctrltype,comptype;MIXERC??ONTROLvolCtrl=newMIXERC??ONTROL();intcurrentVol;intmr=mixerOpen(outmixer,mxid,0,0,MIXER_OBJECTF_WAVEIN);if(mr!=MMSYSERR_NOERROR){Warning("mixerOpen()失败:"+mr.ToString());混合器禁用=真;返回(假);}ctrltype=MIXERC??ONTROL_CONTROLTYPE_VOLUME;comptype=MIXERLINE_COMPONENTTYPE_DST_WAVEIN;rc=GetVolumeControl(混音器,comptype,ctrltype,outvolCtrl,outcurrentVol);if(rc==false){警告("SetMicVolume/GetVolumeControl()失败");混合器禁用=真;混音器关闭(混音器);返回(假);}vVolume=((int)((float)(volCtrl.lMaximum-volCtrl.lMinimum)/100.0F)*百分比);rc=SetVolumeControl(混音器,volCtrl,vVolume);if(rc==false){警告("SetMicVolume/SetVolumeControl()失败");混合器禁用=真;混音器关闭(混音器);返回(假);}mixer关闭(混合器);返回(真);请注意,主要区别是我使用的组件类型是“MIXERLINE_COMPONENTTYPE_DST_WAVEIN”而不是“MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE”真的不明白这一点,所以如果有人想解释(或告诉我这一般不会起作用),欢迎回帖!以上就是C#学习教程的全部内容:如何从C#中调整麦克风增益(需要在XP和W7上工作)。网络收藏不代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
