【发布时间】:2017-04-25 07:47:59
【问题描述】:
我正在开发一个 Swift 应用程序,我在其中利用特定的 MIDI 信号并使用它。一个例子是:我想根据输入信号移动 NSSlider 的值。所以,我所做的是创建一个 MIDI 输入流(有效),我现在需要做的是获取该值并将其设置为 self.wave_mode_slider?.integerValue。
我的输入连接方法如下:
func makeInputSource() {
var midiClient : MIDIClientRef = 0
var inPort : MIDIPortRef = 0
var observer = UnsafeRawPointer(Unmanaged.passUnretained(self).toOpaque())
MIDIClientCreate("WobClient" as CFString, nil, nil, &midiClient)
MIDIInputPortCreate(midiClient, "WobClient_InPort" as CFString, {
(pktList: UnsafePointer<MIDIPacketList>, readProcRefCon: UnsafeMutableRawPointer?, srcConnRefCon: UnsafeMutableRawPointer?) -> Void in
let packetList : MIDIPacketList = pktList.pointee
var packet : MIDIPacket = packetList.packet
let mySelf = Unmanaged<Wob>.fromOpaque(readProcRefCon!).takeUnretainedValue()
for _ in 1...packetList.numPackets {
let bytes = Mirror(reflecting: packet.data).children
var params : [UInt64] = []
var i = packet.length
for (_, attr) in bytes.enumerated() {
let string = String(format: "%02X ", attr.value as! UInt8)
params.append(UInt64(strtoul(string, nil, 16)))
i -= 1
if (i <= 0) {
break
}
}
mySelf.wave_mode_slider?.integerValue = ("\(params[2])" as NSString).integerValue
packet = MIDIPacketNext(&packet).pointee
}
}, nil, &inPort)
MIDIPortConnectSource(inPort, self.source, &observer)
}
如你所见,我有这样的观察者变量:
var observer = UnsafeRawPointer(Unmanaged.passUnretained(self).toOpaque())
然后我将其传递给闭包并尝试像这样使用:
let mySelf = Unmanaged<Wob>.fromOpaque(readProcRefCon!).takeUnretainedValue()
mySelf.wave_mode_slider?.integerValue = ("\(params[2])" as NSString).integerValue
但是,这会导致 EXC_BAD_INSTRUCTION 在声明 mySelf 的行上。
我也尝试使用retained 变体,但这导致了相同的EXC_BAD_INSTRUCTION。
现在,我不是一个经验丰富的 swift 开发者,尤其是在涉及到这些东西时,所以我可能错过了一些明显的东西,所以有人知道为什么会发生这种情况吗?
谢谢
编辑----按照建议,我稍微更改了代码,
MIDIPortConnectSource(inPort, self.source, &observer)
成为
MIDIPortConnectSource(inPort, self.source, observer)
这也让我将 observer 变量更改为 UnsafeMutableRawPointer
【问题讨论】:
-
应该是
MIDIPortConnectSource(inPort, self.source, observer),没有&——正如我在stackoverflow.com/questions/43589188/… 建议的那样:) -
@MartinR 哈哈错过了!我会更新代码,因为问题仍然存在,
-
当然,如果你传递
observer的内容或者那个变量的地址会有所不同。 -
@MartinR 已编辑,:)
-
更改后问题仍然存在?
print(observer)和print(readProcRefCon!)是否显示相同的地址?
标签: swift macos cocoa midi coremidi