使用串行设备来控制应用程序卷

时间:2013-11-07 15:49:54

标签: visual-c++ audio windows-7 volume wasapi

我已经构建了一个外部设备来控制Windows7-Applications的级别。串行通信有效,但我正在努力使用内置的Windows Audio Session API(WASAPI)。

特别是,我有两个问题:

  1. WASAPI适合我的问题吗?对我来说,这似乎太过分了
  2. 如何访问每个正在运行的程序的级别?
  3. Windows 7 Audio Mixer

    如果你能帮助我,我会很高兴的!

1 个答案:

答案 0 :(得分:0)

没有检查但似乎你确实可以使用WASAPI。使用此http://msdn.microsoft.com/en-us/library/windows/desktop/dd316769%28v=vs.85%29.aspx文档作为起点。我期望这种方式工作的方式是,对于每个IMMDevice(从IMMDeviceEnumerator获得),您激活IAudioSessionManager,使用它来获取ISimpleAudioVolume,然后您就可以使用Get / SetMasterVolume进行会话。为了让IAudioSessionManager为您提供ISimpleAudioVolume,您还需要您要控制的会话的会话GUID,因为多个进程可能会以共享模式写入同一设备。为此,您可以使用IAudioSessionEnumerator获取“当前”会话,但请注意,在将新会话添加到系统时,不会更新此会话。为此,您将需要IAudioSessionManager2 :: RegisterSessionNotification(注意,有一些特定的线程要求:它必须在MTA公寓中运行)并实现您自己的回调以将会话添加到某个内部集合中(由您维护并最初从IAudioSessionEnumerator填充) )。另请注意,会话枚举器的通知内容会为您提供一个IAudioSessionControl,您必须使用QueryInterface进入IAudioSessionControl2以获取会话guid,您最终需要控制每个会话的卷。最后,您还需要使用IAudioSessionControl :: RegisterAudioSessionNotification来获取会话主音量变化的通知,以便您可以与(例如)Windows音量混音器sndvol保持同步。再次注意,这完全来自内存,我实际上没有测试或验证任何这些。关于WASAPI超大,是的,我认为你是对的。无论如何,这至少应该让你开始。祝你好运。