我最近一直在探索 macOS 和 Windows 上可用的 MIDI API(分別為 Core MIDI 和 Windows Multimedia)并注意到:
在 MacOS 上,查詢可用源的數量后,可以通過檢查 property 的值來唯一kMIDIPropertyUniqueID標識每個源。
在 Win32 上,我找不到明確的替代方案 - 輸入設備的“ID”似乎只是連接設備串列中的索引,隨著新設備的連接和斷開,它可能隨時更改。可以從設備請求的功能結構中的資訊也不是特別獨特,因為同時使用兩個相同的 MIDI 鍵盤會導致兩個相同的功能集,直到產品名稱。
有沒有辦法在 WinMM 中唯一標識這些設備?
uj5u.com熱心網友回復:
簡短的回答是否定的。
WinMM 中的設備 ID 確實只是設備串列中的一個索引。因此,如果您拔下一臺設備并插入另一臺具有相同屬性(例如名稱)的設備,您將無法確定您使用的設備是舊設備還是新設備。當然,名稱可以相同,所以這不是一個選項。
因此,從編程方面來說,在 Windows 中無法區分兩個具有相同屬性的 MIDI 設備。在應用程式中,您可以提供像“重繪 設備”或“測驗設備”這樣的按鈕,以便與當前設備保持同步,并能夠確定 GUI 中的哪個物件對應于 MIDI 設備。
至于 macOS,kMIDIPropertyUniqueID是一個選項,但有細微差別。從有關常量的檔案中:
系統為所有物件分配唯一 ID。您可以在虛擬端點上設定此屬性;但是,如果 ID 不是唯一的,這樣做可能會失敗。
所以在某些情況下你可以獲得不唯一的價值。在我看來,在 macOS 中識別設備最可靠的方法是使用它的參考。例如,當您獲得源設備時,MIDIGetSource您會得到MIDIEndpointRef結果。事實上,這是一個UInt32在系統范圍內真正獨一無二的數字。
所以我在我的 .NET 庫中DryWetMIDI依靠MIDIEndpointRef來區分 macOS 中的 MIDI 設備。也可以提供 MIDI 設備觀看(添加/洗掉)。但不幸的是,對于 Windows,這是不可能的。
uj5u.com熱心網友回復:
不幸的是,在 WinMM 中沒有等價物。
您能做的最好的事情就是打開設備以獲取它的句柄。句柄將是唯一的,并且始終指向打開的設備,即使添加和洗掉了其他設備。
獲得句柄后,您可以使用midiInGetID()或midiOutGetID()獲取 ID,以防它發生變化。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/453667.html
上一篇:批量創建.png檔案
