我们有一个应用程序使用waveXXX()
和mixerXXX()
函数来处理与某些仪器之间的音频I / O(想想:示波器或电子设备而不是乐器,而不是那么重要) 。现在终于停止在Windows XP上部署它,并将其移至Windows 7和/或8。
通过阅读WASAPI上的各种资料,听起来大部分应用程序(基于waveXXX()
函数)实际上可能正常工作,但mixer()
用于设置主输出量的东西,音量线,麦克风静音肯定会改变,而是使用IAudioEndPointVolume来电。
是否可以仅更改mixerXXX()
来电?这是可取的吗?
逻辑上,此应用程序需要独占使用其音频端点(扬声器输出,线路输入)。如果我想确保通过软件进行独占访问,是否会强制我重写所有waveXXX()
代码? (另一种方法是警告用户其他音频应用可能会干扰这一应用)。
答案 0 :(得分:0)
我的建议:
mixerXXX()
替换为ISimpleAudioVolume
接口(以及其他几个接口),然后测试现有waveXXX()
代码表现得像你需要的那样。然后每次硬件,OS或音频驱动程序更改时进行测试。更好的是,只需转换为WASAPI。就我而言,专用扬声器输出至关重要 - 这会驱动仪器产生相关的输入信号。我想我不介意另一个应用程序想要共享对该传入信号的访问权限,但从逻辑上讲,它是一个需要与其音频端点签订独家合同的系统。
这种排他性要求我获得扬声器输出和输入输入的IMMDevice
实例,Activate()
IAudioClient
接口和Initialize()
两者都使用{{} 1}}(另见this answer)。
但是我真的选择了这样一个流程吗?可能不是。我可以肯定的是,通过切断它们之前共享我的端点的任何其他应用程序都很烦人。
做了这么多,我们真的不清楚AUDCLNT_SHAREMODE_EXCLUSIVE
电话会发生什么 - 也许他们会从线路输入,也许是从麦克风那里拿走 - 也许这取决于硬件的方式供应商实施了他们的交易结束。我也从来不清楚线路输入和麦克风是否总是多路复用(即可选择),总是混合(即你只能通过静音另一个来模拟选择),或者没有标准可以依赖。
由于这样的因素,在整个过程中不使用WASAPI是一种赌博。