我们有一个使用waveXXX()
和mixerXXX()
函数来处理与某些乐器之间的音频I / O的应用程序(请考虑:示波器或电子设备,而不是乐器,这并不重要)。终于是时候停止在Windows XP上部署它,并将其移至Windows 7和/或8了。
通过阅读WASAPI上的各种资料,听起来应用程序的大部分内容(基于waveXXX()
函数)实际上可以正常工作,但用于设置主输出音量,音量,静音麦克风的mixer()
内容肯定具有进行更改,并改为使用IAudioEndPointVolume调用。
是否可以仅更改mixerXXX()
调用?是可取的吗?
从逻辑上讲,此应用程序需要专有使用其音频端点(扬声器输出,线路输入)。如果我想确保通过软件进行独占访问,是否还会迫使我重写所有waveXXX()
代码? (另一种方法是警告用户其他音频应用程序可能会干扰此程序)。
最佳答案
我的建议:
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/