如果我使用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