2017-01-25 12 views
2

私は、スウィフト3プロジェクトでMIDI読み込みprocコールバックを設定しています。私はこの作業を行う目的だけでObjective Cに頼らなくても、プロジェクトをスウィフトにしておきたいと思っています。 Core Midiと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} 
     } 



    } 

} 

私はこのような入力ポートを作成するときにこのコールバックを置く:

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

は、これは私に次の例外を与える:

AC関数ポインタにのみへの参照から形成することができます。 'func'またはリテラルクロージャ

この例外が何を意味するのかは私には不明です。関数のシグネチャは予想されるコールバックシグネチャと一致し、Swift関数のように見えます。

コンパイラがSwift関数を適切なCポインタコールバックとして受け入れるためには、何を変更する必要がありますか?

+1

コールバックをインスタンスメソッドにすることはできません。類似の問題についてはhttp://stackoverflow.com/questions/33260808/how-to-use-instance-method-as-callback-for-function-which-takes-only-func-or-litを比較してください。 –

答えて

2

普通のCoreMIDIコールバックは、@convention(c)セマンティクスに従わなければならないため、インスタンスメソッドまたはスコープ内の他の変数を使用するクロージャーにすることはできません。

ただし、CoreMIDI 1.3では、代わりにMIDIReadProcの代わりに@escaping MIDIReadBlockパラメータを使用するMIDIInputPortCreateWithBlockを使用できます。

関連する問題