将音频代码升级到新的WASAPI标准

时间:2015-03-02 22:28:22

标签: audio wasapi

我们有一个应用程序使用waveXXX()mixerXXX()函数来处理与某些仪器之间的音频I / O(想想:示波器或电子设备而不是乐器,而不是那么重要) 。现在终于停止在Windows XP上部署它,并将其移至Windows 7和/或8。

通过阅读WASAPI上的各种资料,听起来大部分应用程序(基于waveXXX()函数)实际上可能正常工作,但mixer()用于设置主输出量的东西,音量线,麦克风静音肯定会改变,而是使用IAudioEndPointVolume来电。

是否可以仅更改mixerXXX()来电?这是可取的吗?

逻辑上,此应用程序需要独占使用其音频端点(扬声器输出,线路输入)。如果我想确保通过软件进行独占访问,是否会强制我重写所有waveXXX()代码? (另一种方法是警告用户其他音频应用可能会干扰这一应用)。

1 个答案:

答案 0 :(得分:0)

我的建议:

  • 如果您需要独占访问权限,请将所有内容转换为WASAPI
  • 如果您使用的是Line-in,请将所有内容转换为WASAPI
  • 如果您有时间,请将所有内容转换为WASAPI
  • 如果您严格仅在共享模式下使用扬声器和麦克风,请将mixerXXX()替换为ISimpleAudioVolume接口(以及其他几个接口),然后测试现有waveXXX()代码表现得像你需要的那样。然后每次硬件,OS或音频驱动程序更改时进行测试。更好的是,只需转换为WASAPI。

就我而言,专用扬声器输出至关重要 - 这会驱动仪器产生相关的输入信号。我想我不介意另一个应用程序想要共享对该传入信号的访问权限,但从逻辑上讲,它是一个需要与其音频端点签订独家合同的系统。

这种排他性要求我获得扬声器输出和输入输入的IMMDevice实例,Activate() IAudioClient接口和Initialize()两者都使用{{} 1}}(另见this answer)。

但是我真的选择了这样一个流程吗?可能不是。我可以肯定的是,通过切断它们之前共享我的端点的任何其他应用程序都很烦人。

做了这么多,我们真的不清楚AUDCLNT_SHAREMODE_EXCLUSIVE电话会发生什么 - 也许他们会从线路输入,也许是从麦克风那里拿走 - 也许这取决于硬件的方式供应商实施了他们的交易结束。我也从来不清楚线路输入和麦克风是否总是多路复用(即可选择),总是混合(即你只能通过静音另一个来模拟选择),或者没有标准可以依赖。

由于这样的因素,在整个过程中不使用WASAPI是一种赌博。