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

通过阅读WASAPI上的各种资料,听起来应用程序的大部分内容(基于waveXXX()函数)实际上可以正常工作,但用于设置主输出音量,音量,静音麦克风的mixer()内容肯定具有进行更改,并改为使用IAudioEndPointVolume调用。

是否可以仅更改mixerXXX()调用?是可取的吗?

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

最佳答案

我的建议:

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

  • 在我的情况下,专用扬声器输出至关重要-这将驱动产生相关输入信号的乐器。我想我不介意另一个应用程序是否想要共享对该传入信号的访问,但是从逻辑上讲,它是一个系统,希望与其音频端点进行排他性契约(Contract)。

    这种排他性要求我同时为扬声器输出和线路输入获得IMMDevice实例,对它们的Activate()接口(interface)使用IAudioClient并使用Initialize()都使用AUDCLNT_SHAREMODE_EXCLUSIVE(另请参见this answer)。

    但是,实际上我是否通过这样的过程选择了插队?可能不会。我可以确定的是,所有其他先前共享我的端点的应用程序都会被切断而烦恼。

    完成了这么多之后,还真的不清楚waveInXXX()调用会发生什么-可能会从输入中获取,也许会从麦克风中获取-可能取决于硬件供应商如何完成交易。对我来说还不清楚的是,输入和麦克风是否总是多路复用(即可选),总是混合(即只能通过静音另一个来模拟选择)还是没有任何标准可以依靠。

    由于诸如此类的因素,不要在整个过程中使用WASAPI是一种赌博。

    关于audio - 将音频代码升级到新的WASAPI标准,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28820650/

    10-12 06:08