正确使用withMemoryRebound

时间:2018-10-12 20:05:44

标签: swift

我正在使用以下代码:

audioBuff.audioBuffer.floatChannelData![0].withMemoryRebound(to: DSPComplex.self, capacity: bufferSizePOT / 2) {dspComplexStream in
        vDSP_ctoz(dspComplexStream, 2, &output, 1, UInt(bufferSizePOT / 2))
    }

我想跳到一些进一步的示例:

audioBuff.audioBuffer.floatChannelData![1024].withMemoryRebound(to: DSPComplex.self, capacity: bufferSizePOT / 2) {dspComplexStream in
        vDSP_ctoz(dspComplexStream, 2, &output, 1, UInt(bufferSizePOT / 2))
    }

这样做时,我有一个EXC_BAD_ACCESS(代码= 1,地址= 0x0) 有人可以解释如何正确使用它?

我使用.withMemoryRebound是因为我最初尝试过:

vDSP_ctoz(audioBuff.audioBuffer.floatChannelData!, 2, &output, 1, UInt(bufferSizePOT / 2))

这给了我错误: 无法将类型'UnsafePointer>'的值转换为预期的参数类型'UnsafePointer'

我想做的是移入audioBuff.audioBuffer.floatChannelData!按块进行FFT

1 个答案:

答案 0 :(得分:1)

audioBuffer.floatChannelData![0]代表指向通道#0的样本的指针。

当缓冲区为非相关立体声时,您可以使用audioBuffer.floatChannelData![1]访问通道#1的样本。

但是,我相信Apple的任何声音硬件都不支持频道#1024。

当您要使用第1024个示例时,可能需要编写如下内容:

    audioBuffer.floatChannelData![0]
        .advanced(by: 1024)
        .withMemoryRebound(to: DSPComplex.self, capacity: bufferSizePOT / 2) {
    dspComplexStream in
        vDSP_ctoz(dspComplexStream, 2, &output, 1, UInt(bufferSizePOT / 2))
    }