2016-11-30 19 views
1

私は本当に私がAVAudioPCMBufferDataを変換する必要があり ...愚かと一見単純な問題でおかしくなりそうです。UnsafeMutablePointer <_>にUnsafeMutablePointer <Float>

this questionを見ると、スウィフト3ですべてが変更されています。この呪われた言葉は絶えず変化しています(爆発で申し訳ありません)!

私はコード

let audioBuffer = AVAudioPCMBuffer(pcmFormat: audioFormat!, frameCapacity: UInt32(data.count)/(audioFormat?.streamDescription.pointee.mBytesPerFrame)!) 
audioBuffer.frameLength = audioBuffer.frameCapacity 
let channels = UnsafeBufferPointer(start: audioBuffer.floatChannelData, count: Int(audioFormat!.channelCount)) 
data.copyBytes(to: UnsafeMutablePointer<Float>(channels[0])) 

のこのスニペットを持っている。しかし、この最後の行は、私は、このエラーを与える:

Cannot convert value of type 'UnsafeMutablePointer<Float>' to expected 
argument type 'UnsafeMutablePointer<_>' 

月の誰かがこの解決策を持っていますか?

+0

3行目を 'UnsafeBufferPointer 'と宣言する必要がありますか? – sdasdadas

答えて

1

API Reference of Dataチェック、あなたはcopyBytesの3つのオーバーロードを見つけることができます。それらの

func copyBytes(to: UnsafeMutablePointer<UInt8>, count: Int)

func copyBytes(to: UnsafeMutablePointer<UInt8>, from: Range<Data.Index>)

func copyBytes<DestinationType>(to: UnsafeMutableBufferPointer<DestinationType>, from: Range<Data.Index>?)

いずれもそのto:引数としてUnsafeMutablePointer<Float>を取りません。

あなたは第三copyBytesを呼び出したい場合は、あなたがUnsafeMutableBufferPointer<DestinationType>を作成する必要があります(そして、あなたのコードでは、channels[0]の種類は、「何もしない」。UnsafeMutablePointer<Float>の初期化子に渡し、UnsafeMutablePointer<Float>さになります)あなたのケースではDestinationTypeFloatである必要があります。

_ = data.copyBytes(to: UnsafeMutableBufferPointer(start: channels[0], count: Int(audioBuffer.frameLength))) 

from:引数がこのcopyBytesではオプションであり、_ =をかけることなく、スウィフトは、結果の使用についてない文句を言います。)

あなたがcopyBytesの他のオーバーロードを使用する場合は、変換する必要がありUnsafeMutablePointer<Float>UnsafeMutablePointer<UInt8>。あなたはSOの他のいくつかの記事でそれを行う方法を見つけることができます。 count:from:(秒)はオプションではありません。

+0

正常に動作しますが、最終的に[UInt8]を受け取り、[Float32]に変換する必要があるため、手動でコピーを実行する必要がありました...ありがとう! – Massimo

+0

@Massimo手動でコピーを行った方法を表示して[UInt8]を[Float32]に変換できますか? – zzzel

+0

@zzzel私の問題では、n/2サンプル(サンプル2バイト)を含むデータがあり、各サンプル(2バイト)を1つのフロート(-1.0と1.0の間)で変換しなければなりませんでした。あなたの問題が同じであれば、これは私のコードです(サンプルは 'Data'オブジェクトです):' for i in 0 .. Massimo

関連する問題