如果我使用if
分支中的第一個方法獲取MIDIDestination
代碼,並且發送了MIDI數據,則給定以下代碼。如果我使用else
分支中的第二種方法,則不會發送數據。對CoreMIDI目標的混淆
var client = MIDIClientRef()
var port = MIDIPortRef()
var dest = MIDIEndpointRef()
MIDIClientCreate("jveditor" as CFString, nil, nil, &client)
MIDIOutputPortCreate(client, "output" as CFString, &port)
if false {
dest = MIDIGetDestination(1)
} else {
var device = MIDIGetExternalDevice(0)
var entity = MIDIDeviceGetEntity(device, 0)
dest = MIDIEntityGetDestination(entity, 0)
}
var name: Unmanaged<CFString>?
MIDIObjectGetStringProperty(dest, kMIDIPropertyDisplayName, &name)
print(name?.takeUnretainedValue() as! String)
var gmOn : [UInt8] = [ 0xf0, 0x7e, 0x7f, 0x09, 0x01, 0xf7 ]
var pktlist = MIDIPacketList()
var current = MIDIPacketListInit(&pktlist)
current = MIDIPacketListAdd(&pktlist, MemoryLayout<MIDIPacketList>.stride, current, 0, gmOn.count, &gmOn)
MIDISend(port, dest, &pktlist)
在這兩種情況下,打印設備名稱是正確的,並且每次通話的狀態是noErr
。
我注意到,如果我問了kMIDIManufacturerName
屬性,我得到不同的結果 - 特別是使用第一種方法,我得到Generic
,從USB MIDI接口,MIDI設備連接,並用第二種方法,我得到通過音頻MIDI設置應用程序配置的值Roland
。
我想用第二種方法是專門這樣我就可以過濾掉不具有所期望的製造商名稱設備,但如上述,我不能再獲得工作輸出的原因。
誰能解釋這兩種方法之間的區別,爲什麼後者不起作用,最好提供一個建議,我怎麼能解決呢?
你確定你正在得到正確的'實體'嗎?那麼'MIDIDeviceGetNumberOfEntities'呢? – Sulthan
@Sulthan是的。只有一個「實體」,根據上面的說法,顯示的名稱是相同的(並且是正確的)。但是,返回的唯一ID不一樣。 – Alnitak
好的,有趣的 - 如果我用'MIDIGetDevice(4)'而不是'MIDIGetExternalDevice(1)'代碼實際工作,並且我獲得相同的唯一ID,除非我仍然得到錯誤的製造商ID(即,一個用於實際的接口,而不是連接到它的單元)。該文檔不清楚「外部」設備和普通設備之間的差異,這裏:( – Alnitak