我有以下函数来处理 Obj-C 中的音频数据(然后在 C++ 中更深入):
- (void) audioProcess: (int) numChannels
numSamples: (int) numSamples
stride: (int) stride
data: (float * const *) data;
此签名是处理存储在连续内存中的音频缓冲区数据的经典签名。它可以交错或不交错,具体取决于缓冲区。
然后在 Swift 中,我想像这样处理音频缓冲区:
let buffer = ... // get AVAudioPCMBuffer from somewhere
if let floatChannelData = buffer.floatChannelData {
audioProcess(Int32(buffer.format.channelCount),
numSamples: Int32(buffer.frameLength),
stride: Int32(buffer.stride),
data: floatChannelData)
}
我收到以下编译错误:
'UnsafePointer<UnsafeMutablePointer<Float>>'
的值转换为预期的参数类型 'UnsafePointer<UnsafeMutablePointer<Float>?>'
注意
UnsafeMutablePointer<Float>
的可选性差异。
如何将 floatChannelData 从 Swift 传递到 Obj-C (C++)?
编辑:错别字
这里的问题是 Objective-C 允许空指针,而 Swift 对可选和非可选指针有严格的类型。
由于 floatChannelData 是 UnsafePointer 类型
if let floatChannelData = buffer.floatChannelData {
// Convert the pointer to the expected form
let data = UnsafePointer<UnsafeMutablePointer<Float>?>(floatChannelData)
audioProcess(Int32(buffer.format.channelCount),
numSamples: Int32(buffer.frameLength),
stride: Int32(buffer.stride),
data: data)
}
Swift 和 Objective-C/C++ 的不同 UnsafePointer
不安全指针