将音频代码升级到新的 WASAPI 标准
Upgrading audio code to new WASAPI standard
我们有一个应用程序使用 waveXXX()
和 mixerXXX()
函数来处理音频 I/O 进出某些乐器(想想:示波器或电子设备而不是乐器,不是那个这很重要)。终于到了停止在 Windows XP 上部署它并将其移动到 Windows 7 and/or 8.
的时候了
通过阅读 WASAPI 上的各种 material,听起来大部分应用程序(基于 waveXXX()
函数)实际上可能工作正常,但 mixer()
使用的东西设置主输出音量、线路音量和静音麦克风肯定需要更改,并使用 IAudioEndPointVolume 电话代替。
是否可以仅更改 mixerXXX()
调用?是否可取?
从逻辑上讲,此应用程序需要独占使用其音频端点(扬声器输出、线路输入)。如果我想通过软件确保独占访问,是否会迫使我也重写所有 waveXXX()
代码? (另一种方法是警告用户其他音频应用程序可能会干扰此应用程序)。
我的推荐:
- 如果您需要独占访问权限,请将所有内容转换为 WASAPI
- 如果您使用的是线路输入,请将所有内容转换为 WASAPI
- 如果你有时间,把所有的东西都转换成WASAPI
- 如果你严格只在共享模式下使用扬声器和麦克风,请将
mixerXXX()
替换为 ISimpleAudioVolume
接口(以及其他几个接口),然后测试是否存在 waveXXX()
代码的行为符合您的需要。然后在每次硬件、OS 或音频驱动程序更改时进行测试。更好的是,只需转换为 WASAPI。
就我而言,独有的扬声器输出至关重要 - 这会驱动生成相关输入信号的乐器。我想我不介意另一个应用程序是否想要共享对该传入信号的访问,但从逻辑上讲,它是一个想要与其音频端点签订独家合同的系统。
这种排他性要求我为扬声器输出和线路输入获得一个 IMMDevice
实例,Activate()
它们上的 IAudioClient
接口和 Initialize()
都使用AUDCLNT_SHAREMODE_EXCLUSIVE
(另见 )。
但是我真的通过这样的过程选择了line-in吗?可能不会。我可以确定的是,通过切断它们来烦扰之前共享我的端点的任何其他应用程序。
做了这么多,真的不清楚 waveInXXX()
电话会发生什么——也许他们会从线路输入,也许从麦克风——也许这取决于硬件供应商如何实现他们的目标的交易。我也一直不清楚线路输入和麦克风是否总是多路复用(即可选择),总是混合(即你只能通过使另一个静音来模拟选择)或者没有可以依赖的标准。
由于这样的因素,不始终使用 WASAPI 是一场赌博。
我们有一个应用程序使用 waveXXX()
和 mixerXXX()
函数来处理音频 I/O 进出某些乐器(想想:示波器或电子设备而不是乐器,不是那个这很重要)。终于到了停止在 Windows XP 上部署它并将其移动到 Windows 7 and/or 8.
通过阅读 WASAPI 上的各种 material,听起来大部分应用程序(基于 waveXXX()
函数)实际上可能工作正常,但 mixer()
使用的东西设置主输出音量、线路音量和静音麦克风肯定需要更改,并使用 IAudioEndPointVolume 电话代替。
是否可以仅更改 mixerXXX()
调用?是否可取?
从逻辑上讲,此应用程序需要独占使用其音频端点(扬声器输出、线路输入)。如果我想通过软件确保独占访问,是否会迫使我也重写所有 waveXXX()
代码? (另一种方法是警告用户其他音频应用程序可能会干扰此应用程序)。
我的推荐:
- 如果您需要独占访问权限,请将所有内容转换为 WASAPI
- 如果您使用的是线路输入,请将所有内容转换为 WASAPI
- 如果你有时间,把所有的东西都转换成WASAPI
- 如果你严格只在共享模式下使用扬声器和麦克风,请将
mixerXXX()
替换为ISimpleAudioVolume
接口(以及其他几个接口),然后测试是否存在waveXXX()
代码的行为符合您的需要。然后在每次硬件、OS 或音频驱动程序更改时进行测试。更好的是,只需转换为 WASAPI。
就我而言,独有的扬声器输出至关重要 - 这会驱动生成相关输入信号的乐器。我想我不介意另一个应用程序是否想要共享对该传入信号的访问,但从逻辑上讲,它是一个想要与其音频端点签订独家合同的系统。
这种排他性要求我为扬声器输出和线路输入获得一个 IMMDevice
实例,Activate()
它们上的 IAudioClient
接口和 Initialize()
都使用AUDCLNT_SHAREMODE_EXCLUSIVE
(另见
但是我真的通过这样的过程选择了line-in吗?可能不会。我可以确定的是,通过切断它们来烦扰之前共享我的端点的任何其他应用程序。
做了这么多,真的不清楚 waveInXXX()
电话会发生什么——也许他们会从线路输入,也许从麦克风——也许这取决于硬件供应商如何实现他们的目标的交易。我也一直不清楚线路输入和麦克风是否总是多路复用(即可选择),总是混合(即你只能通过使另一个静音来模拟选择)或者没有可以依赖的标准。
由于这样的因素,不始终使用 WASAPI 是一场赌博。