IDirectMusicSynth 和 IDirectMusicSynthSink
如合成器和波形接收器中所述,可以实现在用户模式下运行并与 DirectMusic 通信的自定义软件合成器或波形接收器。 合成器对象必须具有 IDirectMusicSynth 接口。 波形接收器对象必须具有 IDirectMusicSynthSink 接口。
DirectMusic 通过其 IDirectMusicSynth 接口与软件合成器通信。 DirectMusic 在 DirectX 6.1 及更高版本中支持此接口。 IDirectMusicSynth 支持下表中显示的方法,将这些方法整理为功能组。
组 | 方法名称 |
---|---|
激活 | IDirectMusicSynth::Activate |
渠道 | IDirectMusicSynth::GetChannelPriority、IDirectMusicSynth::SetChannelPriority |
乐器 | IDirectMusicSynth::Download、IDirectMusicSynth::Unload |
信息 | IDirectMusicSynth::GetAppend、IDirectMusicSynth::GetFormat、IDirectMusicSynth::GetLatencyClock、IDirectMusicSynth::GetPortCaps、IDirectMusicSynth::GetRunningStats |
播放 | IDirectMusicSynth::PlayBuffer、IDirectMusicSynth::Render |
端口 | IDirectMusicSynth::Open、IDirectMusicSynth::Close、IDirectMusicSynth::SetNumChannelGroups |
其他参数 | IDirectMusicSynth::SetMasterClock、IDirectMusicSynth::SetSynthSink |
大多数应用程序不需要直接调用 IDirectMusicSynth 接口中的方法;DirectMusic 端口通常管理合成器。 但是,应用程序可以在开发和测试过程中直接连接到合成器。
合成器在未连接到波形接收器的情况下是不完整的,该接收器表示为具有 IDirectMusicSynthSink 接口的对象。 波形接收器将合成器音频输出流连接到音频呈现模块,例如 DirectSound、DirectShow 或 Windows 多媒体 waveOut API。
默认情况下,DirectMusic 使用其内部 IDirectMusicSynthSink 实现来处理软件合成器生成的波形数据。 此波形接收器将数据馈送到 DirectSound。
在激活合成器之前,必须先创建波形接收器并通过调用 IDirectMusicSynth::SetSynthSink 连接到合成器。 这应该是创建合成器后的第一次调用,因为许多与计时相关的调用(包括 IDirectMusicSynth::GetLatencyClock 和 IDirectMusicSynth::SetMasterClock)实际上传递到 IDirectMusicSynthSink 上的等效调用。
只有 DirectX 6.1 和 DirectX 7 支持使用 IDirectMusicSynthSink 接口实现自定义用户模式波形接收器。 IDirectMusicSynthSink 支持下表中显示的方法,将这些方法整理为功能组。
组 | 方法名称 |
---|---|
初始化 | IDirectMusicSynthSink::Activate、IDirectMusicSynthSink::GetDesiredBufferSize |
IDirectMusicSynthSink::Init、IDirectMusicSynthSink::SetDirectSound | |
定时 | IDirectMusicSynthSink::GetLatencyClock、IDirectMusicSynthSink::RefTimeToSample |
IDirectMusicSynthSink::SampleToRefTime、IDirectMusicSynthSink::SetMasterClock |
在 DirectX 8 及更高版本中,DirectMusic 始终使用其内部波形接收器和用户模式合成器。 这些更高版本的 DirectMusic 不支持 IDirectMusicSynthSink 的自定义实现。
但是,在 DirectX 6.1 和 DirectX 7 中,你可以随意实现自己的 IDirectMusicSynthSink 对象,并用它来以任何方式管理合成器音频输出流。 例如,可以将波形数据馈送到 DirectShow 或 waveOut API。 如果创建波形流对象,它必须具有 IDirectMusicSynthSink 接口才能插入 IDirectMusicSynth 对象中。
除了管理波次流外,波形接收器还负责控制合成器的时间。 波形接收器通过调用 IDirectMusicSynth::SetMasterClock 来接收主时钟,后者通过对 IDirectMusicSynthSink::SetMasterClock 的相同调用传递主时间源。 由于主时钟不是从与波次流相同的晶体生成的,因此波形接收器必须通过补偿时钟偏移来使其保持同步。
此外,为了使合成器可以适当跟踪时间,它提供两个调用,用于从主时钟时间转换为采样时间(及反向转换):
IDirectMusicSynthSink::RefTimeToSample
IDirectMusicSynthSink::SampleToRefTime
波形接收器会生成延迟时钟,因为它实际上管理通过调用 IDirectMusicSynth::Render 编写样本的时间。 当 DirectMusic 在 DirectMusic 端口上调用 IDirectMusicSynth::GetLatencyClock 时,它只需回转并调用 IDirectMusicSynthSink::GetLatencyClock 即可。
首次打开软件合成器时,DirectMusic 会为合成器提供一个 DMUS_PORTPARAMS 结构(如 Microsoft Windows SDK 文档中所述),该结构会指定音频输出流的采样率和声道数。 然后,合成器会将这些转换为标准 WAVEFORMATEX 结构,当波形接收器调用 IDirectMusicSynth::GetFormat 方法时,该结构会将其传递给波形接收器。
有关详细信息,请参阅 Windows SDK 文档中的 IDirectMusic 和 IDirectMusicPort 接口说明。