共用方式為


IDirectMusicSynth 和 IDirectMusicSynthSink

合成器和波接收器中所述,您可以實作自訂軟體合成器或波接收器,以使用者模式執行,並與 DirectMusic 通訊。 合成器物件必須具有 IDirectMusicSynth 介面。 波浪接收物件必須有 IDirectMusicSynthSink 介面。

DirectMusic 會透過其 IDirectMusicSynth 介面與軟體合成器通訊。 DirectMusic 支援 DirectX 6.1 和更新版本中的這個介面。 IDirectMusicSynth 支援下表所示的方法,可將方法組織成功能群組。

分組 方法名稱
啟用 IDirectMusicSynth::Activate
通道 IDirectMusicSynth::GetChannelPriority、IDirectMusicSynth::SetChannelPriority
檢測 IDirectMusicSynth::D ownload、IDirectMusicSynth::Unload
資訊 IDirectMusicSynth::GetAppend、IDirectMusicSynth::GetFormat、IDirectMusicSynth::GetLatencyClock、IDirectMusicSynth::GetPortCaps 、IDirectMusicSynth::GetRunningStats
播放 IDirectMusicSynth::P layBuffer、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::GetLatencyClockIDirectMusicSynth::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檔中說明,) 指定音訊輸出資料流程的取樣速率和通道數目。 合成器接著會將這些轉換成標準 WAVEATEX 結構,當波接收呼叫 IDirectMusicSynth::GetFormat 方法時,它會傳遞至波接收。

如需詳細資訊,請參閱 Windows SDK 檔中 IDirectMusicIDirectMusicPort 介面的描述。