无法将[[Float]]数组传递到Objective-C ++

伊戈尔·安德烈耶夫(Igor Andreev)

我正在处理我的应用程序中的声音。DSP算法用编写C++我需要将数据传递到C++,然后将结果传递到中的音频子系统Swift

要将数据传递给C++我,我编写了一个Objective-C++类:

#define BufferSize 10240

@interface EffectsWrapper : NSObject
-   (void) processBuffer: (float * _Nonnull *_Nonnull) dataIn ofSize: (int) dataSize intoOutputBuffer: (float * _Nonnull *_Nonnull) dataOut;
@end

@implementation EffectsWrapper
-   (void) processBuffer: (float * _Nonnull *_Nonnull) dataIn ofSize: (int) dataSize intoOutputBuffer: (float * _Nonnull *_Nonnull) dataOut
{
    for(int channel = 0; channel < 2; channel ++)
    {
        for(int i = 0; i < dataSize; i ++)
        {
            float data =  dataIn[channel][i];
            dataOut[channel][i] = data;
        }
    }
}
@end

如您所见,现在它只是将输入复制到输出中。

该方法的调用在MTAudioProcessingTapProcessCallback闭包内部完成,这被描述为的属性MyClassEffectsWrapper也是此类的一个属性。

为了“处理”数据,首先,我创建输入和输出数组,如下所示:

var dataIn: [[Float]] = Array(repeating: Array(repeating: 0.0, count: framesCount), count: 2)
var dataOut: [[Float]] = Array(repeating: Array(repeating: 0.0, count: framesCount), count: 2)

其次,我用数据填充输入数组。然后我EffectsWrapper.process像这样调用方法:

let dataInPtr = UnsafeMutablePointer(mutating: [UnsafeMutablePointer(mutating: dataIn[0]), UnsafeMutablePointer(mutating: dataIn[1])])
let dataOutPtr = UnsafeMutablePointer(mutating: [UnsafeMutablePointer(mutating: dataOut[0]), UnsafeMutablePointer(mutating: dataOut[1])])
myClass.effectsWrapper.processBuffer(dataInPtr, ofSize: Int32(framesCount), intoOutputBuffer: dataOutPtr)

问题在于里面的数据EffectsWrapper是完全垃圾。有时甚至会抛出分配错误。而且我不明白为什么我创建的指针指向内存中的某些随机位置,而不是指向它们需要的数组元素。

请帮忙。

阿纳托利P

这里的问题是这样的代码

let dataInPtr = UnsafeMutablePointer(mutating: [UnsafeMutablePointer(mutating: dataIn[0]), UnsafeMutablePointer(mutating: dataIn[1])])

使用隐式桥接UnsafePointer从数组创建这些指针被(间接)保存以供以后使用,这是未定义的行为。UnsafePointerUnsafeMutablePointer在文档https://developer.apple.com/documentation/swift/unsafepointerhttps://developer.apple.com/documentation/swift/unsafemutablepointer如此处所述,

通过隐式桥接实例或数组元素而创建的指针仅在被调用函数执行期间有效。函数执行后转义要使用的指针是未定义的行为。特别是,在调用UnsafePointer初始化程序时不要使用隐式桥接

在尝试以可行的方式解决此问题之前,应该探索编写包装器的可能性,即在Swift和包装器之间传递的输入或输出缓冲区是内存中所有通道数据连续存储的区域。这样就不必将缓冲区视为指针数组,并且在Objective-C(++)和Swift之间传递浮点数数组会更加容易。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章