格式协商
应用程序启动音频处理后,图形生成器会将 sAPO 配置为音频图,并初始化 sAPO。 然后,音频服务与 LFX sAPO 协商,以在 sAPO 的输入和输出处确定音频数据的格式。 此协商过程称为格式协商。
为 Windows Vista 提供音频系统效果的所有 sAPO 必须具有某些接口和方法。 sAPO 和音频引擎用于协商数据格式的方法包括:IAudioProcessingObject 接口的 IsInputFormatSupported 方法以及 IAudioProcessingObjectConfiguration 接口的 LockForProcess 和 UnlockForProcess 方法。
为了启动格式协商,音频服务首先将 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 不参与格式协商过程。
选择数据格式以处理音频数据后,音频处理图形生成器会调用 sAPO 的 IAudioProcessingObjectConfiguration::LockForProcess 方法,从而完成格式选择。
如果 Windows Vista sAPO 在响应对 LockForProcess 方法的调用时向包装自定义 sAPO 返回错误,则自定义 sAPO 必须以尝试实例化 sAPO 失败时处理 CoCreateInstance 错误的方式处理该错误。 有关如何覆盖系统提供的 LockForProcess 方法的详细信息,请参阅 Spkrfill.cpp 文件。
由于音频服务运行的方式,LFX 和 GFX sAPO 必须能够独立于彼此响应音频服务中有关数据格式的查询。
重要说明:实现包装 Windows Vista LFX sAPO 的自定义 sAPO 时,请勿在自定义 sAPO 的注册属性中指定 APO_FLAG_FRAMESPERSECOND_MUST_MATCH 标志。 如果指定此标志,Windows Vista LFX sAPO 将无法执行扬声器填充、耳机虚拟化或虚拟环绕。 此外,自定义 sAPO 将无法混合任何音频流。 例如,自定义 sAPO 将无法将 5.1 音频流向下混缩为双声道立体声音频流。