如何检测当前音频设备的音量

时间:2009-07-04 05:47:40

标签: c# .net visual-studio-2008 audio volume

我想检测当前计算机的默认录音设备的当前音量。是否有任何API或解决方案?

我正在编写录音机,我希望在录制之前让用户知道默认录音设备的当前音量,以便我们可以避免无音频录制的问题(例如,最终用户将录音设备静音)。

如果可以以百分比值的格式检索结果(即0%表示静音,100%表示最大音量),那就太棒了!

我正在使用VSTS 2008 + C#+ .Net 3.5来编写Windows窗体应用程序。

2 个答案:

答案 0 :(得分:3)

执行此操作的方法是使用WaveInOpen打开默认的WaveIn设备,这将为您提供waveIn句柄。然后您可以使用混音器... API来选择相关的混音器线。

这将是目标行,并且将具有一些控件(通常是静音和音量)。您可以设置这些。然而,这是一个有点复杂的地方。还存在与目的地相关联的多个“源”(例如,麦克风,线路输入等)。这些也可以有音量和静音以及其他自定义控件。您可能需要进行一些实验才能找到您真正想要更改的控件。我发现很难找到在Vista和XP上可靠运行的代码(实际上可能与你的声卡驱动程序有关)。

我已经为NAudio中的所有这些函数编写了托管包装器,它将帮助您完成部分工作。这大致是你想要做的:

MixerLine mixerLine;
if (waveInHandle != IntPtr.Zero)
{
    mixerLine = new MixerLine(waveInHandle, 0, MixerFlags.WaveInHandle);
}
else
{
    mixerLine = new MixerLine((IntPtr)waveInDeviceNumber, 0, MixerFlags.WaveIn);
}

foreach (MixerControl control in mixerLine.Controls)
{
    if (control.ControlType == MixerControlType.Volume)
    {
        // this is the volume control of the "destination"
        UnsignedMixerControl volumeControl = (UnsignedMixerControl)control;
        Debug.WriteLine(volumeControl.Percent.ToString());
    }      
}

// to examine the volume controls of the "sources":
if (source.ComponentType == MixerLineComponentType.SourceMicrophone)
{
    foreach (MixerControl control in source.Controls)
    {
        if (control.ControlType == MixerControlType.Volume)
        {
            // this might be the one you want to set
        }
    }
}

答案 1 :(得分:1)

对于捕获设备,混音器音量和端点音量都反映了实际捕获硬件的音量(这使得使用AGC的应用无需修改即可正常工作)。