C++ Can';t将[[Float]]数组传递到Objective-C++;
我正在我的应用程序中处理声音。DSP算法是用C++ Can';t将[[Float]]数组传递到Objective-C++;,c++,arrays,swift,pointers,C++,Arrays,Swift,Pointers,我正在我的应用程序中处理声音。DSP算法是用C++编写的。我需要将数据传递到C++,然后将结果传递到Swift中的音频子系统 为了将数据传递到C++中,我编写了一个Objective-C++类: #define BufferSize 10240 @interface EffectsWrapper : NSObject - (void) processBuffer: (float * _Nonnull *_Nonnull) dataIn ofSize: (int) dataSize into
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
其次,我用数据填充输入数组。然后我调用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
中的数据完全是垃圾。有时它甚至会给我一个分配错误。我不明白为什么我创建的指针指向内存中的一些随机位置,而不是我需要它们指向的数组元素
请帮助。这里的问题是这样的代码
let dataInPtr = UnsafeMutablePointer(mutating: [UnsafeMutablePointer(mutating: dataIn[0]), UnsafeMutablePointer(mutating: dataIn[1])])
使用隐式桥接从数组创建UnsafePointer
s。这些指针(间接地)保存以供以后使用,这是未定义的行为。请参见和处的UnsafePointer
和unsafemeutablepointer
文档。如前所述
通过实例或对象的隐式桥接创建的指针
数组的元素仅在被调用的
功能。在执行后转义要使用的指针
函数是未定义的行为。特别是,不要使用隐式
调用UnsafePointer
初始值设定项时桥接
在试图以一种有效的方式解决这个问题之前,应该探索以这样一种方式编写包装器的可能性,即在Swift和包装器之间传递的输入或输出缓冲区是内存中所有通道数据连续存储的区域。这样,缓冲区就不需要被视为指针数组,在Objective-C(++)和Swift之间传递浮点数组就更容易了。我决定使用1D数组,并将指针传递给使用
和运算符的对象C++
stuff将音频通道视为单独的阵列。工作起来很有魅力。
let dataInPtr = UnsafeMutablePointer(mutating: [UnsafeMutablePointer(mutating: dataIn[0]), UnsafeMutablePointer(mutating: dataIn[1])])