格式协商

应用程序启动音频处理后,图形生成器会将 sAPOs 配置为音频图,并初始化 sAPO。 然后,音频服务与 LFX sAPO 协商,以在 sAPO 的输入和输出处为音频数据建立格式。 此协商过程称为格式协商。

为 Windows Vista 提供音频系统效果的所有 sAPO 必须具有某些接口和方法。 sAPO 和音频引擎用于协商数据格式的方法包括:IAudioProcessingObject 接口的 IsInputFormatSupported 方法以及 IAudioProcessingObjectConfiguration 接口的 LockForProcessUnlockForProcess 方法。

为了启动格式协商,音频服务首先将 LFX sAPO 的输出设置为基于 float32 的默认格式。 然后,音频服务调用 LFX sAPO 的 IAudioProcessingObject::IsInputFormatSupported 方法,建议默认格式,并监视此方法的 HRESULT 响应。 如果 LFX sAPO 可以支持建议的格式,它将返回S_OK,并引用受支持的格式。 如果 LFX sAPO 不支持建议的格式,它将返回S_FALSE以及对与建议格式最匹配的格式的引用。 如果 LFX sAPO 不支持建议的格式并且没有近似匹配项,则返回APOERR_FORMAT_NOT_SUPPORTED。 GFX sAPO 与 LFX sAPO 的输出格式配合工作。 因此,GFX sAPO 不参与格式协商过程。

选择数据格式以处理音频数据后,音频处理图形生成器将调用 sAPOs 的 IAudioProcessingObjectConfiguration::LockForProcess 方法,导致格式选择完成。

如果 Windows Vista sAPO 在响应 对 LockForProcess 方法的调用时向包装自定义 sAPO 返回错误,则自定义 sAPO 必须以尝试实例化 sAPO 失败时处理 CoCreateInstance 错误 的方式处理该错误。 有关如何覆盖系统提供的 LockForProcess 方法的详细信息,请参阅Spkrfill.cpp文件。

由于音频服务运行的方式,LFX 和 GFX sAPOs 必须能够独立于彼此响应音频服务中有关数据格式的查询。

重要 实现包装 Windows Vista LFX sAPO 的自定义 sAPO 时,请勿在自定义 sAPO 的注册属性中指定 APO_FLAG_FRAMESPERSECOND_MUST_MATCH 标志。 如果指定此标志,Windows Vista LFX sAPO 将无法执行扬声器填充、耳机虚拟化或虚拟环绕。 此外,自定义 sAPO 将无法进行任何音频流的下混。 例如,自定义的音频处理对象 (sAPO) 将无法将 5.1 音频流向下混合成双声道立体声。