如何以编程方式获取当前音频级别?

时间:2010-10-21 23:27:03

标签: c# c++ windows winapi

基本上,我需要的是一种利用当前音频输出并检查声级的方法,即我需要能够检查音频设备上是否有播放的内容。

我不需要检查音量设置,而是检查实际播放音频流的声级。

抱歉,我在Visual Studio 2008上询问了如何在Windows中执行此操作。

@mikerobi:这构成了我推理的一部分 - 如果它显示在系统音量计上,必须有系统调用可以将其恢复

3 个答案:

答案 0 :(得分:2)

这是一个很好的问题。对于32位Windows应用程序,答案是挂钩到winmm.dll和其他低级音频控制DLL。在C#中,我创建了一个包含extern方法原型的包装类:

public class MyAudioWrapper
{
   [DllImport("winmm.dll", EntryPoint = "waveOutGetVolume")]
   public extern void GetWaveVolume(IntPtr devicehandle, out int Volume);

   ...
}

查看this link以获取Windows音频方法列表;您可以使用调音台或波形控制器来设置音量。您要使用的内容将决定要导入的库。您将不得不研究如何最好地定义原型,以及如何获得音频/混音器设备的句柄。

答案 1 :(得分:2)

以下是Windows API调用的有用链接,以下是您正在寻找的内容:

http://www.pinvoke.net/default.aspx/winmm.waveOutGetVolume


由于要求已更改且您不需要音频级别,我建议以下内容可能有所帮助:

我认为您需要阅读输出流中正在播放的内容,并通过分析某些算法中的数据,您可能能够确定天气是否正在播放。为此,您需要 MMDevice API

http://msdn.microsoft.com/en-us/library/dd316556(v=VS.85).aspx

我不想诋毁你,但相信如果你不熟悉非托管代码,这将不容易实现。

  • 你必须在每个调用中填充许多结构。
  • 您必须按特定顺序执行调用。
  • 编组对结构的引用。

即使您完成了这项工作,也无法预料到设备的结果行为。 祝你好运。

答案 2 :(得分:1)

我最近在这里回答了这样一个问题,请参阅How to detect if any sound plays on a Windows machine