2017-04-25 8 views
0

私は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) 

+0

それは '&'なし 'MIDIPortConnectSource(のInport、self.source、オブザーバー)'でなければなりません - 私はhttp://stackoverflow.com/questions/43589188/access-self-from-で示唆したようにACスタイルのポインタ#comment74230252_43589188 :) –

+0

@MartinRハハはそれを逃した!私は問題が残っているのでコードを更新します –

+0

もちろん、オブザーバの内容やその変数のアドレスを渡すと違いがあります。 –

答えて

0

オンスイフト4(受信CC):

@objc func receiveMIDI(_ sender: UIButton) { 

    let observer = UnsafeMutableRawPointer(Unmanaged.passUnretained(self).toOpaque()) 
    MIDIClientCreate(s, nil, nil, &midiClient); 
    MIDIInputPortCreate(midiClient, p, { 
    (pktList: UnsafePointer<MIDIPacketList>, 
     readProcRefCon: UnsafeMutableRawPointer?, srcConnRefCon: UnsafeMutableRawPointer?) in 
      // callback block 
      let packetList:MIDIPacketList = pktList.pointee 
      var packet:MIDIPacket = packetList.packet 

      for _ in 1...packetList.numPackets{ 
       let bytes = Mirror(reflecting: packet.data).children 
       var dumpStr = "" 


       var i = packet.length 
       for (_, attr) in bytes.enumerated(){ 
         dumpStr += String(format:"%02d ", attr.value as! UInt8) 
         i -= 1 
         if (i <= 0) 
         { 
          break 
         } 
       } 
       let midi = dumpStr.split(separator: " ", maxSplits: 2, omittingEmptySubsequences: true) 
       var midiIntValues = [Int(midi[0]),Int(midi[1]),Int(midi[2].trimmingCharacters(in: .whitespaces))] 
       if let src = srcConnRefCon{ 
        let mySelf = Unmanaged<DetailViewController>.fromOpaque(src).takeUnretainedValue() 
        if let v = midiIntValues[2]{ 
         // print("control \(midiIntValues[1]) has \(v) value") 
        } 

       } 
       packet = MIDIPacketNext(&packet).pointee 
      } 
      // end callback block 
     }, nil, &inputPort); 

    let sourceCount = MIDIGetNumberOfSources() 
    print("source count \(sourceCount)") 

    for srcIndex in 0 ..< sourceCount { 
     var source = MIDIGetSource(srcIndex) 
     let status = MIDIPortConnectSource(inputPort,source,observer) 
     if status == noErr { 
      print("Connected to inputPort") 
     } else { 
      print("There was an error connecting the ports!") 
     } 
    } 
} 
関連する問題