私はSwiftアプリケーションで作業しています。ここで特定のMIDI信号を利用しています。たとえば、入力信号に基づいてNSSliderの値を移動したいとします。だから、私がやったのはMIDI入力ストリームを作っていて、今は何をすればいいのですか?値をとり、それをself.wave_mode_slider?.integerValue
に設定します。UnsafeMutablePointerへの自己キャスト<Void>の結果はEXC_BAD_INSTRUCTIONになります
私は次のように入力接続があることを確認どこから私の方法:
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
ただし、mySelf
が宣言されている行でEXC_BAD_INSTRUCTION
になります。
また、retained
の亜種を使用しようとしましたが、これは同じEXC_BAD_INSTRUCTION
につながりました。
私は熟練した迅速な開発者ではなく、特にこのようなものではないので、明らかに何かを見逃している可能性があります。
おかげ
編集----示唆したように、私はなった
MIDIPortConnectSource(inPort, self.source, &observer)
少しのコードを、変更も私はUnsafeMutableRawPointer
observer
変数を変更作ら
MIDIPortConnectSource(inPort, self.source, observer)
それは '&'なし 'MIDIPortConnectSource(のInport、self.source、オブザーバー)'でなければなりません - 私はhttp://stackoverflow.com/questions/43589188/access-self-from-で示唆したようにACスタイルのポインタ#comment74230252_43589188 :) –
@MartinRハハはそれを逃した!私は問題が残っているのでコードを更新します –
もちろん、オブザーバの内容やその変数のアドレスを渡すと違いがあります。 –