【问题标题】:How to detect current audio device volume如何检测当前的音频设备音量
【发布时间】:2009-07-04 05:47:40
【问题描述】:

我想检测当前计算机默认录音设备的当前音量。有什么 API 可以使用或解决方案吗?

我正在写一个录音机,我想在录音前让用户知道默认录音设备的当前音量,这样我们就可以避免没有录音的问题(例如最终用户将录音设备静音)。

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

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

【问题讨论】:

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


    【解决方案1】:

    执行此操作的方法是使用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
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多