2009-07-04 59 views
1

我想检测当前计算机的默认音频录制设备的当前音量。有没有使用API​​或解决方案?如何检测当前音频设备音量

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

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

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

回答

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

对于捕获设备,调音台体积和终点体积既反映实际采集硬件的体积(这让使用AGC无需修改正常运行的应用程序)。