2010-10-21 61 views
12

基本上,我需要的是挖掘到当前的音频输出,并检查音量的方式,即我需要能够检查是否有一些播放音频设备或不上。如何以编程方式获取当前的音频级别?

我并不需要检查音量设置,但实际播放音频流的音量。

对不起,我是问如何做到这一点在Windows上的Visual Studio 2008

@mikerobi:形成我推理的一部分 - 如果正在对系统音量计显示它,必须有是一个系统调用,可以拿回来

+0

我不明白消极的反应,肯定有一种方式来看待正在播放什么声音?我不知道是否容易从该流中提取和获取有用的信息,但这些评论并没有指出正确的方向。 – 2010-10-21 23:34:16

+0

+1,现在该平台被提及。从Windows Vista/7开始,我们有[核心音频API](http://msdn.microsoft.com/en-us/library/dd370784%28VS.85%29.aspx),但我肯定从未使用过他们。让我们尝试标记这个“windows-api”并看看我们画的是谁。:) – 2010-10-21 23:42:23

+0

也许你可以在这里找到一些东西http://www.dreamincode.net/forums/topic/45693-controlling-sound-volume-in-c%23/#/ – BrunoLM 2010-10-21 23:50:21

回答

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

Vista和更高版本的更好的答案是以环回模式打开音频流并从中捕获。 – 2010-10-22 01:48:07

2

这里是一个有用的链接,Windows API的invokations,而这里也正是你在找什么:

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


由于需求变化,你不需要的音频电平,我建议下面可能会有帮助:

我认为你需要阅读的是什么的输出流,并通过一些算法,你也许能决定耐候一些分析数据playedback正在playedback与否。要做到这一点,你需要的MMDevice API

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

我不想discorage你,但相信我,这不是一件容易的事要完成,如果你不熟悉的非托管代码。

  • 您必须在每个调用中填充许多结构。
  • 您必须按特定顺序执行invokations。
  • 编组参考结构。

即使你完成了,你也无法预测设备的结果行为。 祝你好运。

相关问题