2016-09-18 77 views
1

我的代碼:轉換C指針斯威夫特3

let data = Data(bytes: UnsafePointer<UInt8>(audioBuffer.mData), count: Int(bufferSize)) 

let u16 = UnsafePointer<Int32>(audioBuffer.mData).pointee 

這兩者工作雨燕2.3,但不是在斯威夫特3.如何轉換他們,使他們採取行動等效? (以及爲什麼?)

+0

可能http://stackoverflow.com/questions/38983277/how-to-get-bytes-out-of-an-unsafemutablerawpointer,它回答瞭如何從Swift 3的Core Audio mData緩衝區中獲取答案樣本。 – hotpaw2

回答

1

要斯威夫特3讀取音頻單元回調緩衝器的16位音頻樣本,我使用:

let bufferPointer = UnsafeMutableRawPointer(mBuffers.mData) 
if var bptr = bufferPointer { 
    for i in 0..<(Int(frameCount)) { 
    let oneSampleI16 = bptr.assumingMemoryBound(to: Int16.self).pointee 
    // do something with the audio sample 
    bptr += 1 
    } 
} 

音頻會話和音頻單元代碼的其餘部分是在這個要點:https://gist.github.com/hotpaw2/630a466cc830e3d129b9

+0

' ++'操作符已經從Swift中移除了3.似乎你的代碼在編寫時沒有使用'++',我相信你可以在這個答案中改進你的代碼片段。 – OOPer

+0

@OOPer:謝謝。從舊版本複製粘貼錯誤修復。 – hotpaw2

0

檢查the latest reference of Data.init(bytes:count:)

參數bytes的類型是UnsafeRawPointer,它接受UnsafeMutableRawPointer。並且AudioBuffer.mData的類型是UnsafeMutableRawPointer?。您無需使用初始值設定項進行轉換。

let data = Data(bytes: audioBuffer.mData!, count: Int(bufferSize)) 

(你只需要明確地解開mData,因爲它導入爲可空類型,UnsafeMutableRawPointer?,但你需要通過非空UnsafeRawPointer(或UnsafeMutableRawPointer)。


第二個例子,你最好檢查一下UnsafeMutableRawPointer有哪些方法可用,你可以找到load(fromByteOffset:as:)的方法,並且可以這樣使用它

let i32 = audioBuffer.mData!.load(as: Int32.self) 

`負載(

1

我不能說我明白了這口井,nor have I read the document,但它看起來像swift3指針強制類型轉換作用域爲避免或限制走樣,所以你無法(容易)有兩種不同同一段記憶的意見,或至少不是很長時間。這意味着您必須複製演員數據或在演員回調中做任何您需要做的事情。

爲什麼要消除混疊?我想這會讓編譯器更快樂。

對於Data

// [NS]Data. probably copying the data 
Data(bytes: audioBuffer.mData!, count: Int(audioBuffer.mDataByteSize)) 

對於數字數組:

// cast the data to Int32s & (optionally) copy the data out 
let umpInt32 = audioBuffer.mData!.assumingMemoryBound(to: Int32.self) 

let frameCount = Int(audioBuffer.mDataByteSize/4) 
var u32 = [Int32](repeating: 0, count: frameCount) 

// copy data from buffer 
u32.withUnsafeMutableBufferPointer { 
    $0.baseAddress!.initialize(from: umpInt32, count: frameCount) 
} 

P.S.你的代碼有一些混亂。是u16應該是數組Int32 s?或UInt16 s?或者是其他東西?