包含合成器微型端口驱动程序的大多数适配器驱动程序也包含 DirectSound 硬件加速。 这提出了合成器语音与硬件加速 DirectSound 缓冲区之间的语音分配问题。
DirectMusic合成器(无论是硬件还是软件)应支持多个实例,以最大化支持并发客户端的数量。 合成器设计者可能倾向于将音色静态分配给合成器,但应该考虑将所有可用的合成器实例视为从一个通用的动态音色池中调用。 然后,每个实例将报告可用语音数量为池中可用的总数。
以这种方式实现时,即使是具有有限物理语音的硬件合成器也可以支持许多合成器实例。 实时,STATS 调用通知客户端每个实例当前使用的语音数。 如果动态池已耗尽,并且合成器实例需要新的语音,则该合成器实例必须实现语音窃取方案,以便从该实例中释放语音。
以下分配方案基于合成器使用的语音比 DirectSound 缓冲区更容易共享的想法,因为驱动程序可以控制语音中哪些数据,并且可以做出有关语音窃取的决定(DLS 级别 1 规范中概述)。
微型端口驱动程序(硬件、软件或硬件和软件的某种组合)提供的所有语音分为两个池。 第一个池(免费池)由未分配到任何地方的语音组成。 第二个池(动态池)由供合成器实例使用的语音资源组成。 合成器实例可能当前未使用这些语音。 动态池的大小是由任何合成器实例请求的最大语音数决定的,但受到空闲池的当前状态的约束。 分配后,DirectSound 缓冲区将从免费池中删除,并在解除分配时返回。
下表包含一个语音分配示例序列,用于说明实际方案。
| 时间 | 请求 | 免费池 | 动态池 | 微型端口驱动程序操作 |
|---|---|---|---|---|
T0 |
启动 |
64 |
0 |
初始化。 |
T1 |
DSound (4) | 六十 |
0 |
将四个语音通道静态分配给 DirectSound 缓冲区。 |
T2 |
合成器 (32) | 28 |
32 |
将动态池增加到 32 个声部。 |
T3 |
合成器 (24) | 28 |
32 |
无操作。 动态池中已经有 24 个以上的语音。 |
T4 |
DSound (24) | 4 |
32 |
将 24 个语音静态分配给 DirectSound 缓冲区。 |
T5 |
合成器 (48) | 0 |
36 |
将动态池增加到 36 个音色。 (创建端口的方法返回S_FALSE并设置DMUS_PORTPARAMS。dwVoices = 36.) |
T6 |
DSound (10) | 0 |
36 |
失败。 免费池中没有语音。 |
T7 |
DSound (-5) | 5 |
36 |
五种语音免费。 请注意,即便最后一个请求(时间 T5)所需数量超出授予数量,这些请求也不会返回到动态池中。 |
请注意,DirectSound 缓冲区实际上是逐个分配的,并组合在表中以实现可读性。
在创建合成器引脚实例后立即,不应基于该实例分配任何语音。 创建后不久,会收到 KSPROPERTY_SYNTH_PORTPARAMETERS 属性项。 此属性项指示要与此实例关联的语音数,等等。 此项目还使微型端口驱动程序有机会报告动态池的实际新大小,以防无法分配所有请求的语音。