2017-01-25 1 views
2

Ich habe ein Midi Read Proc Callback Setup in einem Swift 3 Projekt. Ich möchte das Projekt in Swift ganz behalten, ohne auf Objective C zurückgreifen zu müssen, nur um das zu schaffen. Es gibt viele Artikel über Core Midi und Swift, aber da sich das Framework häufig ändert, gilt die Syntax in diesen Artikeln nicht mehr.Core Midi Read Callback nicht erlaubt in Swift 3

//Midi Message Callback 
func MIDIReadCallback (pktList :UnsafePointer<MIDIPacketList>, refCon :UnsafeMutableRawPointer?, srcConRef :UnsafeMutableRawPointer?) -> Void{ 

    let packet = pktList.pointee.packet 


    for _ in 0..<Int(pktList.pointee.numPackets) { 

     let mirrorData = Mirror(reflecting: packet.data) 

     var counter: UInt16 = 0 


     for(_, value)in mirrorData.children{ 

      let packetCount = packet.length 


      let n = value as! UInt8 

      let st = String(format: "%2X", n) 

      messageData.append(st) 

      counter += 1 

      if(value as! UInt8 == 247){ 
       processMidiMessage() 
       break} 

      if(packetCount == counter){break} 
     } 



    } 

} 

Ich habe diesen Rückruf in, wenn die Eingangs-Port wie folgt zu erstellen:

CheckError(error: MIDIInputPortCreate(client, "Input port" as CFString, MIDIReadCallback, &player, &inPort), 

Das gibt mir die folgende Ausnahme:

AC Funktionszeiger kann nur von einem Verweis auf eine gebildet werden 'func' oder eine wörtliche Schließung

Es ist mir unklar, was diese Ausnahme bedeutet. Die Signatur der Funktion entspricht der erwarteten Callback-Signatur und sieht nur wie eine Swift-Funktion aus.

Was muss ich ändern, damit der Compiler meine Swift-Funktion als richtigen c-Pointer-Callback annimmt?

+1

Der Rückruf darf keine Instanzmethode sein. Vergleichen Sie http://stackoverflow.com/questions/33260808/how-to-use-instance-method-as-callback-for-function-which-takes-only-func--lit für ein ähnliches Problem. –

Antwort

2

Ein normaler CoreMIDI-Callback kann keine Instanzmethode oder eine Closure sein, die andere Variablen im Bereich verwendet, weil sie der Semantik @convention(c) gehorchen müssen.

In CoreMIDI 1.3 können Sie jedoch stattdessen MIDIInputPortCreateWithBlock verwenden, was anstelle eines MIDIReadProc einen @escaping MIDIReadBlock Parameter erfordert.

Verwandte Themen