Je travaille sur une application Swift, où j'utilise le signal MIDI d'un spécifique et de travailler avec elle. Un exemple est: Je veux déplacer la valeur d'un NSSlider autour du signal d'entrée. Donc, ce que j'ai fait était de créer un flux d'entrée MIDI (qui fonctionne) et ce que je dois faire maintenant, est de prendre la valeur et de le mettre à self.wave_mode_slider?.integerValue
.Casting auto à UnsafeMutablePointer <Void> résultats dans EXC_BAD_INSTRUCTION
Ma méthode d'où je fais la connexion d'entrée est la suivante:
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)
}
Comme vous pouvez le voir, j'ai la variable d'observateur fait comme ceci:
var observer = UnsafeRawPointer(Unmanaged.passUnretained(self).toOpaque())
Ce que je puis passer à la fermeture et j'essaie d'utiliser comme ceci:
let mySelf = Unmanaged<Wob>.fromOpaque(readProcRefCon!).takeUnretainedValue()
mySelf.wave_mode_slider?.integerValue = ("\(params[2])" as NSString).integerValue
Cependant, cela conduit à EXC_BAD_INSTRUCTION
sur la ligne où est déclaré mySelf
.
J'ai également essayé d'utiliser les variantes retained
, mais cela a conduit à la même EXC_BAD_INSTRUCTION
.
Maintenant, je ne suis pas un développeur rapide chevronné, et surtout pas quand il s'agit de ce genre de choses, donc il se peut que j'ai manqué quelque chose d'évident, alors quelqu'un sait-il pourquoi cela arrive?
Merci
---- Modifier Comme suggéré, j'ai changé le code légèrement,
MIDIPortConnectSource(inPort, self.source, &observer)
est devenu
MIDIPortConnectSource(inPort, self.source, observer)
Ce qui m'a fait changer la variable observer
à un UnsafeMutableRawPointer
Il devrait être 'MIDIPortConnectSource (InPort, self.source, observateur)', sans '' et - comme je l'ai suggéré à http://stackoverflow.com/questions/43589188/access-self-from- ac-style-pointeur # comment74230252_43589188 :) –
@MartinR Haha raté ça! Je mettrai à jour le code puisque le problème reste pour moi, –
Bien sûr, cela fait une différence si vous transmettez le contenu de 'observer' ou l'adresse de cette variable. –