gpt4 book ai didi

c# - 如何从 C# 调整麦克风增益(需要在 XP 和 W7 上工作)

转载 作者:太空狗 更新时间:2023-10-29 20:37:53 24 4
gpt4 key购买 nike

首先,请注意,我知道已经发布了一些类似的问题;然而他们似乎没有充分解决问题。我有一个 C# 应用程序,带有所有 pInvoke Hook 来与 waveXXX API 对话,我能够捕获和回放音频与那个。我还可以使用该 API 调整扬声器 (WaveOut) 音量。
问题是无论出于何种原因,该 API 都不允许我调整麦克风(波入)音量。所以,我设法找到了一些我也引入的混合器代码,并且通过 pInvoke 访问,这允许我调整麦克风音量,但仅限于我的 W7 PC。我开始使用的混音器代码来自这里: http://social.msdn.microsoft.com/Forums/en-US/isvvba/thread/05dc2d35-1d45-4837-8e16-562ee919da85它可以工作,但是是用来调节扬声器音量的。我添加了 SetMicVolume 方法显示在这里...

    public static void SetMicVolume(int mxid, int percentage)
{
bool rc;
int mixer, vVolume;
MIXERCONTROL volCtrl = new MIXERCONTROL();
int currentVol;
mixerOpen(out mixer, mxid, 0, 0, MIXER_OBJECTF_WAVEIN);
int type = MIXERCONTROL_CONTROLTYPE_VOLUME;
rc = GetVolumeControl(mixer, MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE, type, out volCtrl, out currentVol);
if (rc == false)
{
mixerClose(mixer);
mixerOpen(out mixer, 0, 0, 0, 0);
rc = GetVolumeControl(mixer, MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE, type, out volCtrl, out currentVol);
if (rc == false)
throw new Exception("SetMicVolume/GetVolumeControl() failed");
}
vVolume = ((int)((float)(volCtrl.lMaximum - volCtrl.lMinimum) / 100.0F) * percentage);
rc = SetVolumeControl(mixer, volCtrl, vVolume);
if (rc == false)
throw new Exception("SetMicVolume/SetVolumeControl() failed");
mixerClose(mixer);
}

请注意调用 GetVolumeControl() 的“第二次尝试”。这样做是因为在 XP 上,在第一次调用 GetVolumeControl 时(请参阅上面的站点了解该代码),对 mixerGetLineControlsA() 的调用失败,XP 系统返回 MIXERR_INVALCONTROL。然后,第二次尝试使用 mixerOpen(out mixer, 0, 0, 0, 0),代码不会返回失败,但麦克风增益不受影响。请注意,正如我上面所说,这适用于 W7(第二次尝试永远不会执行,因为使用 mixerOpen(out mixer, mxid, 0, 0, MIXER_OBJECTF_WAVEIN) 不会失败)。

我承认我没有很好地掌握混音器 API,所以这就是我现在正在研究的;但是,如果有人知道为什么这适用于 W7 而不是 XP,我很想听听。同时,如果我在收到回复之前弄明白了,我会发布我自己的答案...

最佳答案

我刚才在写 .NET Voice Recorder 的时候试过这样做使用 NAudio,发现它非常困难。您可能最终不得不编写两批代码,一份用于 XP,另一份用于 Vista/Win 7。我正在使用 NAudio用于混音器互操作。

这就是我最终得到的结果(仍然不能在任何地方工作)

    private void TryGetVolumeControl()
{
int waveInDeviceNumber = waveIn.DeviceNumber;
if (Environment.OSVersion.Version.Major >= 6) // Vista and over
{
var mixerLine = new MixerLine((IntPtr)waveInDeviceNumber, 0, MixerFlags.WaveIn);
foreach (var control in mixerLine.Controls)
{
if (control.ControlType == MixerControlType.Volume)
{
volumeControl = control as UnsignedMixerControl;
MicrophoneLevel = desiredVolume;
break;
}
}
}
else
{
var mixer = new Mixer(waveInDeviceNumber);
foreach (var destination in mixer.Destinations)
{
if (destination.ComponentType == MixerLineComponentType.DestinationWaveIn)
{
foreach (var source in destination.Sources)
{
if (source.ComponentType == MixerLineComponentType.SourceMicrophone)
{
foreach (var control in source.Controls)
{
if (control.ControlType == MixerControlType.Volume)
{
volumeControl = control as UnsignedMixerControl;
MicrophoneLevel = desiredVolume;
break;
}
}
}
}
}
}
}

}

关于c# - 如何从 C# 调整麦克风增益(需要在 XP 和 W7 上工作),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3022981/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com