音樂技術 GUID
MIDI 或 DMus 迷你埠驅動程式必須指定每個針腳能夠處理的資料流程格式範圍。 如 Pin Factory中所述,驅動程式會將這項資訊指定為一或多個資料範圍描述元的陣列,每一個都是類型 KSDATARANGE_MUSIC的結構。 此結構的 Technology 成員指出 MIDI 或 DirectMusic 裝置所使用的合成器技術類型。 迷你埠驅動程式可以將 Technology 成員設定為下表所示的其中一個 GUID 值, (左資料行) 。
KSDATARANGE_MUSIC技術 GUID | MIDIOUTCAPS wTechnology Value | 意義 |
---|---|---|
KSMUSIC_TECHNOLOGY_PORT |
MOD_MIDIPORT |
裝置是 MPU-401 裝置。 |
KSMUSIC_TECHNOLOGY_SYNTH |
MOD_SYNTH |
裝置是合成器。 |
KSMUSIC_TECHNOLOGY_SQSYNTH |
MOD_SQSYNTH |
裝置是平方波合成器。 |
KSMUSIC_TECHNOLOGY_FMSYNTH |
MOD_FMSYNTH |
裝置是 FM 合成器。 |
KSMUSIC_TECHNOLOGY_MAPPER |
MOD_MAPPER |
裝置是 Microsoft MIDI 對應程式。 |
KSMUSIC_TECHNOLOGY_WAVETABLE |
MOD_WAVETABLE |
裝置是硬體可波浪合成器。 |
KSMUSIC_TECHNOLOGY_SWSYNTH |
MOD_SWSYNTH |
裝置是軟體合成器。 |
midiOutGetDevCaps函式會將它從驅動程式收到的技術 GUID 轉譯為它寫入至其輸出給呼叫端之 MIDIOUTCAPS 結構的wTechnology成員的索引。 上表顯示對應至每個技術 GUID 的 wTechnology 值 (中心資料行) 。 如需midiOutGetDevCaps和 MIDIOUTCAPS 的詳細資訊,請參閱Microsoft Windows SDK檔。
列舉裝置時,使用 Windows 多媒體 midiOut 或 midiIn API 的 MIDI 應用程式可以看到 MIDI 針腳,但看不到 DirectMusic 針腳。 DirectMusic 應用程式可以看到 MIDI 和 DirectMusic 針腳。 MIDI 或 DMus 迷你埠驅動程式會將針腳資料範圍中的子類型 GUID 設定為 KSDATAFORMAT_SUBTYPE_MIDI,以識別 MIDI 針腳。 DMus 迷你埠驅動程式會將子類型 GUID 設定為 KSDATAFORMAT_SUBTYPE_DIRECTMUSIC,以識別 DirectMusic 針腳。 如需 MIDI 和 DirectMusic 針腳的資料範圍範例,請參閱 MIDI 資料流程資料範圍 和 DirectMusic Stream 資料範圍。
如 MIDI 和 DirectMusic Filters中所述,配接器驅動程式會呼叫 PcNewMiniport 函式,在 Portcls.sys 中建立其中一個系統提供的迷你埠驅動程式實例。 呼叫端會指定下表中的其中一個驅動程式 GUID,以指定要具現化的迷你埠驅動程式。
驅動程式 GUID | 技術 GUID |
---|---|
CLSID_MiniportDriverDMusUART |
KSMUSIC_TECHNOLOGY_PORT |
CLSID_MiniportDriverDMusUARTCapture |
KSMUSIC_TECHNOLOGY_PORT |
CLSID_MiniportDriverFmSynth |
KSMUSIC_TECHNOLOGY_FMSYNTH |
CLSID_MiniportDriverFmSynthWithVol |
KSMUSIC_TECHNOLOGY_FMSYNTH |
CLSID_MiniportDriverUart |
KSMUSIC_TECHNOLOGY_PORT |
上表的右欄表示對應的迷你埠驅動程式在其針腳的資料範圍內所指定的技術 GUID。 例如,FmSynth 迷你埠驅動程式會將 GUID 技術指派給其針腳KSMUSIC_TECHNOLOGY_FMSYNTH。
有些可波浪合成器裝置會以 MPU-401 裝置的形式向應用程式公開, (技術 GUID KSMUSIC_TECHNOLOGY_PORT) 。 如果沒有外部合成器,他們就能夠透過可波浪合成器播放原始 MIDI 位元組資料流程。
不過,midiOut API 偏好在選取預設 (慣用) MIDI 播放裝置時,使用技術 GUID KSMUSIC_TECHNOLOGY_WAVETABLE) (波狀合成器裝置。 它會明確地避免選取 MPU-401 裝置作為預設裝置。
為了讓本身符合預設裝置的資格,可播放原始 MIDI 的波狀裝置應該將自己公開為可波浪裝置,而不是 MPU-401 裝置。 不過,如果配接器驅動程式使用系統提供的 MPU-401 迷你埠驅動程式 DMusUART 來管理其可波浪合成器裝置,該迷你埠驅動程式會以靜態方式將 GUI KSMUSIC_TECHNOLOGY_PORT D 技術指派給其針腳。
藉由呼叫 IMusicTechnology::SetTechnology 方法,配接器驅動程式可以覆寫迷你埠驅動程式資料範圍內的技術 GUID。 在下列程式碼範例中,配接器驅動程式會將 DMusUART 迷你埠驅動程式資料範圍中的技術 GUID 從預設值 KSMUSIC_TECHNOLOGY_PORT 變更為值KSMUSIC_TECHNOLOGY_WAVETABLE。 有了這個新的設定,MidiOut API 就有資格選取類似 MPU 的波浪裝置作為預設 MIDI 裝置。
// Create the miniport object.
PUNKNOWN miniport;
ntStatus = PcNewMiniport((PMINIPORT*)&miniport, CLSID_MiniportDriverDMusUART);
// Query the miniport driver for the IMusicTechnology interface.
IMusicTechnology* pMusicTechnology;
if (NT_SUCCESS(ntStatus))
{
ntStatus = miniport->QueryInterface(IID_IMusicTechnology, (PVOID*)&pMusicTechnology);
}
// Set the Technology members in the DirectMusic data-range entries
// for all the pins that are exposed by this miniport.
// SetTechnology should be called before initializing the miniport.
if (NT_SUCCESS(ntStatus))
{
ntStatus = pMusicTechnology->SetTechnology(&KSMUSIC_TECHNOLOGY_WAVETABLE);
}
如上述程式碼範例中的批註所示,配接器驅動程式應該先呼叫 SetTechnology ,再呼叫埠驅動程式的 Init
方法 (,接著呼叫迷你埠驅動程式的方法 Init
) 。 系統提供的 DMusUART 和 UART 迷你埠驅動程式都支援 IMusicTechnology 介面。 對於其他迷你埠驅動程式,IMusicTechnology 的支援是選擇性的。 如需詳細資訊,請參閱 Microsoft Windows Driver Kit (WDK) 中 DMusUART 範例音訊驅動程式中的 SetTechnology 方法實作。