适用于内核模式软件合成器的 Wave 接收器

合成器和波次接收器中所述,DMus 端口驱动程序会为在内核模式下运行的软件合成器实现波次接收器。 合成器微型端口驱动程序会向端口驱动程序公开 ISynthSinkDMus 接口。 端口驱动程序的波次接收器使用此接口读取合成器生成的波次数据。

若要使用 DMus 端口驱动程序的波次接收器,DMus 微型端口驱动程序应使用两种类型的引脚定义 DirectMusic 筛选器:

  • DirectMusic 输入引脚或 MIDI 输入引脚。 此引脚是包含 MIDI 消息的呈现流的接收器。

  • 波次输出引脚。 此引脚是包含 PCM 样本的呈现流的源。

下图显示了包含合成器节点 (KSNODETYPE_SYNTHESIZER) 的 DirectMusic 筛选器。 此筛选器会提供 DirectMusic 输入引脚和波次输出引脚,从而满足内核模式软件合成器的上述要求。 (此外,支持旧 MIDI 合成的 DMus 微型端口驱动程序还可以提供 MIDI 输入引脚。)

Diagram illustrating a DirectMusic filter for a kernel-mode software synthesizer with DirectMusic input pin and wave output pin.

在图的左侧,MIDI 流通过 DirectMusic 输入引脚进入筛选器。 此引脚具有向端口驱动程序公开的 IMXF 接口。 端口驱动程序会调用 IMiniportDMus::NewStream 方法来获取此接口。 端口驱动程序会调用 IMXF::PutMessage 方法来将 MIDI 消息馈送到引脚。

在该图右侧,波次流通过波次输出引脚退出筛选器,并流向端口驱动程序的波次接收器。 端口驱动程序通过其 ISynthSinkDMus 接口与引脚通信。 端口驱动程序首先调用 IMiniportDMus::NewStream 来获取具有 IMXF 接口的流对象,然后查询其 ISynthSinkDMus 接口的对象,从而获取此接口。 波次接收器会调用 ISynthSinkDMus::Render 方法来从引脚拉取波次数据。

尽管硬件合成器原则上可以依赖端口驱动程序的波次接收器来进行渲染,但对 ISynthSinkDMus::Render 的调用会为 MIDI 流添加足够的延迟,使得它对许多交互式应用程序没有吸引力。 为了减少流延迟,硬件合成器可能会与混合和波次呈现硬件建立内部连接,而不是使用端口驱动程序的波次接收器。 这种类型的合成器会将上图右侧的波次输出引脚替换为硬件混音器的硬接线连接(表示为桥接引脚)。

ISynthSinkDMus 接口提供了通过波次接收器呈现波次数据的方法,从引用时间转换为采样时间并返回引用时间,并同步到主时钟:

ISynthSinkDMus::RefTimeToSample

ISynthSinkDMus::Render

ISynthSinkDMus::SampleToRefTime

ISynthSinkDMus::SyncToMaster

ISynthSinkDMus 继承自 IMXF 接口。 有关详细信息,请参见 ISynthSinkDMus

上图中的 DMus 微型端口驱动程序标识其 DirectMusic 输入引脚和波次输出引脚,如下所示:

  • 为了标识其 DirectMusic 输入引脚,微型端口驱动程序定义了引脚的数据范围,使其具有类型为 KSDATAFORMAT_TYPE_MUSIC 的主要格式和类型为 KSDATAFORMAT_SUBTYPE_DIRECTMUSIC 的子格式。 此组合表示引脚接受带时间戳的 MIDI 流。 数据范围描述符是 KSDATARANGE_MUSIC 类型的结构。 (有关示例,请参阅 DirectMusic 流数据范围。)微型端口驱动程序会将引脚的数据流方向定义为 KSPIN_DATAFLOW_IN。 (PCPIN_DESCRIPTOR 结构的 KsPinDescriptor.DataFlow 成员指示数据流方向。)调用 IMiniportDMus::NewStream 以为此引脚创建流对象时,端口驱动程序会将 StreamType 参数设置为 DMUS_STREAM_MIDI_RENDER。

  • 为了标识其波次输出引脚,微型端口驱动程序定义了引脚的数据范围,使其具有类型为 KSDATAFORMAT_TYPE_AUDIO 的主要格式和类型为 KSDATAFORMAT_SUBTYPE_PCM 的子格式。 此组合表示引脚发出包含 PCM 样本的波次音频流。 数据范围描述符是 KSDATARANGE_AUDIO 类型的结构。 (请参阅 PCM 流数据范围中的示例。)微型端口驱动程序会将引脚的数据流方向定义为 KSPIN_DATAFLOW_OUT。 调用 IMiniportDMus::NewStream 以为此引脚创建流对象时,端口驱动程序会将 StreamType 参数设置为 DMUS_STREAM_WAVE_SINK。

此外,如果驱动程序支持合成器的 MIDI 输入引脚,其定义将类似于 DirectMusic 输入引脚的定义,但引脚定义将指定类型为 KSDATAFORMAT_SUBTYPE_MIDI 的子格式,并且引脚将接受原始 MIDI 流,而不是带时间戳的 MIDI 流。