在 Windows 10 中的捕获客户端上使用 IAudioClient2::SetClientProperties 的预期效果是什么?

What is the expected effect of using IAudioClient2::SetClientProperties on a capture client in Windows 10?

IAudioClient2::SetClientProperties 的规范仅包含一个参数,但我不清楚根据现有文档对 API 的期望是什么。参数由:

typedef struct AudioClientProperties {
  UINT32                cbSize;
  BOOL                  bIsOffload;
  AUDIO_STREAM_CATEGORY eCategory;
  AUDCLNT_STREAMOPTIONS Options;
} AudioClientProperties;

我有一个捕获客户端,我正在尝试了解使用 eCategoryOptions 的不同组合的确切结果。

首先:如果我不在我的流中调用 SetClientProperties;那么默认设置是什么?假设存在一个对应的GetClientProperties,有没有可能说出它会是什么return?

如果我将流类别设置为 AudioCategory_Speech 并将流选项设置为 AUDCLNT_STREAMOPTIONS_RAW,手册指出

The audio stream is a 'raw' stream that bypasses
all signal processing except for endpoint specific,
always-on processing in the Audio Processing Object (APO), driver, and hardware.

这是否意味着 Signal Enhancements 完成的任何处理都被绕过了,还是绕过了其他类型的内置信号处理?我想我不太理解上面的 endpoint specific,always-on 部分。

此外,如果我改为使用 AudioCategory_CommunicationsAUDCLNT_STREAMOPTIONS_RAW,这两者是否存在任何矛盾?对我来说,好像 AudioCategory_Communications 应该启用对 VoIP 有用的组件(例如 AGC、NS 等),而 AUDCLNT_STREAMOPTIONS_RAW 标志意味着“尽可能保持音频路径干净”?

也许我可以改一下最后一个问题。使用 AudioCategory_Communications + AUDCLNT_STREAMOPTIONS_RAW 和使用 AudioCategory_Speech + AUDCLNT_STREAMOPTIONS_RAW 之间的最终行为有什么区别?

eCategory 具有超越音频效果的行为影响。例如,如果您有一个 VOIP 应用程序并启动了一个 AudioCategory_Communications 流,这将导致电影应用程序暂停或被闪避,无论您是否使用 AUDCLNT_STREAMOPTIONS_RAW.

如果您的捕获客户端用于 VOIP,您需要 AudioCategory_Communications。如果您的捕获客户端用于语音命令或听写,您需要 AudioCategory_Speech.

AUDCLNT_STREAMOPTIONS_RAW 仅适用于非常狭窄的情况。通常您会欢迎您选择的 eCategory 的默认音频处理。

另一方面,如果音频处理的细节对您来说非常重要,以至于您在特定硬件上单独评估音频驱动程序,您可能会确定某些特定型号的计算机具有音频处理功能这不适用于您的应用。

在这种情况下(应该很少见),你应该做两件事:

  1. 联系该计算机的制造商并告诉他们您不喜欢他们的音频处理的哪些方面,这样他们就有机会说服您他们正在做的事情真的没问题,或者您有机会说服他们他们确实有问题,在这种情况下他们应该解决它。
  2. 当他们正在修复时,您的应用程序应该在确定它在此类问题系统上 运行 后,使用 AUDCLNT_STREAMFLAGS_RAW。请注意,您的应用将需要应用它自己需要的任何处理,因为系统不再提供该处理。

您的应用可以使用音频效果发现功能查询将在正常模式和原始模式下应用于其所选流类别的音频效果 API。这里有一个示例:https://github.com/microsoftarchive/msdn-code-gallery-microsoft/tree/master/Official%20Windows%20Platform%20Sample/Audio%20effects%20discovery%20sample

默认情况下,如果您不调用 IAudioClient2::SetClientProperties,则为 eCategory = AudioCategory_Other,这通常不是您想要的。