非 PCM 引脚工厂的要求

在 Windows XP 及更高版本以及 Microsoft Windows Me 下,播放非 PCM WAVEFORMATEX 格式的驱动程序应根据以下准则公开其非 PCM 引脚。

首先,为非 PCM 数据格式定义一个与任何 PCM 引脚工厂分开的引脚工厂。 PCM 和非 PCM 不能共享同一个单实例引脚工厂,因为唯一的引脚实例自动分配给 KMixer。 如果引脚工厂支持多个实例,PCM 和非 PCM 可以在同一引脚工厂上共存。 但是,在这种情况下,无法保证这些引脚实例在运行时可供非 PCM 客户端使用,因为 PCM 客户端可能已经分配了这些实例。 最安全的选择是为非 PCM 格式提供一个单独的引脚工厂。

为了使 DirectSound 8 发现和使用引脚,请在已支持 PCM 的筛选器上定义此非 PCM 引脚工厂。 否则,DirectSound 将无法检测到非 PCM 引脚。 这也意味着根本不支持 PCM 的设备无法支持非 PCM 格式。

其次,在非 PCM 引脚上实现数据交集处理程序。 PortCls 提供内置处理程序,但此默认处理程序始终选择 PCM,因此应为非 PCM 格式添加自己的处理程序。 在非 PCM 引脚的交集处理程序中,不应支持 WAVE_FORMAT_PCM。 请注意,可以在 OutputBufferLength 为 0 的情况下调用此处理程序,在这种情况下,调用方只请求首选数据范围的大小,而不是针对数据本身。 在这种情况下,处理程序通过将非 PCM 数据范围的大小复制到 ResultantFormatLength 参数并返回 STATUS_BUFFER_OVERFLOW 来响应。 Windows 驱动程序工具包 (WDK) 中的 Msvad 示例包含可用于示例处理程序的 DataRangeIntersection 例程的代码。 若要测试 DataRangeIntersection 例程,请使用 KsStudio 实用工具实例化引脚,它首先调用交集处理程序以确定可接受的默认格式。 若要支持非 PCM 格式,驱动程序必须在以下位置正确处理它: