将 AVAudioPCMBuffer.floatChannelData 从 Swift 传递到 Obj-C (C++)

问题描述 投票:0回答:1

我有以下函数来处理 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++)?

编辑:错别字

c++ swift objective-c
1个回答
0
投票

这里的问题是 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

不安全指针 不安全指针

© www.soinside.com 2019 - 2024. All rights reserved.