0

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

从阅读有关 WASAPI 的各种材料,听起来大部分应用程序(基于waveXXX()功能)可能实际上工作正常,但mixer()用于设置主输出音量、线路音量和麦克风静音的东西肯定必须改变,并改用IAudioEndPointVolume调用。

是否可以只更改mixerXXX()呼叫?这是可取的吗?

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

4

1 回答 1

0

我的建议:

  • 如果您需要独占访问,请将所有内容都转换为 WASAPI
  • 如果您使用 line-in,请将所有内容转换为 WASAPI
  • 如果您有时间,请将所有内容都转换为 WASAPI
  • 如果您严格只在共享模式下使用扬声器和麦克风,请替换mixerXXX()ISimpleAudioVolume接口(以及其他几个接口),然后测试现有waveXXX()代码的行为是否符合您的需要。然后在每次硬件、操作系统或音频驱动程序更改时进行测试。更好的是,只需转换为 WASAPI。

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

这种排他性要求我获得IMMDevice扬声器输出和线路输入的实例、它们上Activate()IAudioClient接口以及Initialize()两者的使用AUDCLNT_SHAREMODE_EXCLUSIVE(另请参见此答案)。

但是我真的通过这样的过程选择了line-in吗?可能不是。我可以肯定的是,通过切断它们来让以前共享我的端点的任何其他应用程序感到恼火。

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

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

于 2015-03-20T03:18:16.970 回答