与分配器对接的接口是 IMXF 和 IAllocatorMXF。 这些接口允许重复使用DMUS_KERNEL_EVENT结构 , 而无需分配和解除分配内存。 IMXF::PutMessage 为分配器提供一个结构,而 IAllocatorMXF::GetMessage 则从分配器中检索一个已初始化为零的 DMUS_KERNEL_EVENT 结构以便重复使用。 分配器被构建为在池中包含空的DMUS_KERNEL_EVENT结构,因此起始时不会为空。如下图所示,IRP(以DMUS_EVENTHEADER结构形式出现)从 dmusic.dll 传送到解包器。
解压缩程序调用 IAllocatorMXF::GetMessage 来检索空 DMUS_KERNEL_EVENT 结构。 解压缩程序从 IRP 检索DMUS_KERNEL_EVENT结构,填充这些结构(每个 MIDI 事件一个),并将其传递到序列器(使用其 MXF 接口)。 序列器根据时间戳对它们重新排序,并在它们到期时通过调用 IMXF::PutMessage 将它们传递给微型端口驱动程序。 微型端口驱动程序将 MIDI 数据从DMUS_KERNEL_EVENT结构中提取出来,以便它可以将其呈现为波形数据。 它使用另一个 IMXF::PutMessage 调用将已用 DMUS_KERNEL_EVENT 结构传回分配器。
捕获时会出现相反的情况。 MIDI 数据从硬件传入微型端口驱动程序,微型端口驱动程序调用 IAllocatorMXF::GetMessage 来获取空的 DMUS_KERNEL_EVENT 结构。 DMUS_KERNEL_EVENT结构会被填充时间戳和数据,然后通过IMXF::PutMessage传递到捕获接口。 如果微型端口驱动程序在DMUS_KERNEL_EVENT结构中设置DMUS_KEF_EVENT_INCOMPLETE标志,则每个结构可以传递多个消息。 DMus 端口驱动程序中的捕获汇解析此原始数据流,并生成包含时间戳 MIDI 消息(每个结构一条)的DMUS_KERNEL_EVENT结构。
微型端口驱动程序本身还可以向捕获接收器发出时间戳消息。 在这种情况下,驱动程序不会在 DMUS_KERNEL_EVENT 中设置 DMUS_KEF_EVENT_INCOMPLETE 位。 捕获汇将带时间戳的结构体直接传递给打包器,将消息打包入 IRP 中,并将其发送到 dmusic.dll。 DirectMusic 捕获仅用于 MIDI 录制。 对于波形录制,请使用 DirectSound 捕获。
当解包程序将数据从DMUS_KERNEL_EVENT结构中提取出来时,它使用IMXF::PutMessage将已用的DMUS_KERNEL_EVENT结构释放到分配器中。 当 IRP 缓冲区已满时,其内容将被传递到 dmusic.dll。 包装器从 dmusic.dll接收空的 IRP,进行填充后完成处理。 更多的 IRP 逐步下发,以便它总是有一个待处理。