2016-09-18 76 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?或者是其他东西?