2016-09-24 10 views
3

オーディオユニットのストリームが32ビット浮動小数点用に設定されている、レンダリングされたAudioBufferListからネイティブ[Float]配列を抽出しようとしています。SwiftのAudioBufferListからのデータの抽出3

var monoSamples = [Float]() 
    for i in 0..<Int(inNumberFrames) { 
     withUnsafePointer(to: &bufferList.mBuffers.mData, { 
      let ptr = $0 
      let newPtr = ptr + i 
      let sample = unsafeBitCast(newPtr.pointee, to: Float.self) 
      monoSamples.append(sample) 
     }) 
    } 

確かにない最速の方法、それが働いた:スウィフト1 & 2では、私はこれをしませんでした。 Swift 3では、これはエラーなしでコンパイルされますが、実行時にクラッシュします。

fatal error: can't unsafeBitCast between types of different sizes

これは少し驚きです。 SwiftのFloatは32ビットで、ストリームのデータは32ビットです。

私は何をしたいのですが、単純です:

withUnsafeMutablePointer(to: &bufferList.mBuffers.mData, { 
     let monoSamples = [Float](UnsafeBufferPointer(start: $0, count:Int(inNumberFrames))) 
    }) 

しかし、私はコンパイルエラーが出ます:

Expression type '[Float]' is ambiguous without more context

これを行うための正しい方法は何ですか?

+0

:スウィフト3にコードを変換するときは、これを試してみてください

すぎ

を変更した可能性/ 4d55cd1ec55a5f71246780f4819c94b3 –

答えて

4

コードをSwift 2に変換していないと、機能しません。 gist.github.com/anonymous:ここスウィフト遊び場で(まあ、_should_コンパイル)をコンパイル要旨です

var monoSamples = [Float]() 
let ptr = bufferList.mBuffers.mData?.assumingMemoryBound(to: Float.self) 
monoSamples.append(contentsOf: UnsafeBufferPointer(start: ptr, count: Int(inNumberFrames))) 
+0

これは機能します!ありがとう! –

0

お試しください。

ええ、あなたは$0として入力する必要がありますUnsafePointer。任意のタイプのUnsafePointerイニシャライザを選択し、その値をここで渡します。ここでは説明のためにbitPatternを使用しています。

UnsafeBufferPointer<Float>(start: UnsafePointer(bitPattern: i), count: Int(inNumberFrames)) 
+0

愛がありません。エラーは次のようになります。「式のタイプ 'UnsafeBufferPointer 'はコンテキストがなくてもあいまいです」 –

+0

ありがとうございますが、私はまだ混乱しています。私たちはwithUnsafeMutablePointerクロージャーの中にいます、はい? $ 0はどこに行くの? 'monoSamples = [Float](UnsafePointer($ 0)、count:Int(inNumberFrames)))'はまだ別のエラーを生成しています(UnsafeBufferPointer )。 –

+0

スウィフトプレイグラウンドでコンパイルする(うまくコンパイルする)要点は次のとおりです。https://gist.github.com/anonymous/4d55cd1ec55a5f71246780f4819c94b3 –

関連する問題