我在我的应用程序中处理声音。 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
闭包内完成的,闭包被描述为MyClass
的属性。 EffectsWrapper
也是此类的属性。
To&#34; process&#34;数据,首先,我创建输入和输出数组,如下所示:
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
内的数据是完全垃圾。有时甚至会给我一个分配错误。而且我不明白为什么我创建的指针指向内存中的一些随机位置而不是我需要它们指向的数组元素。
请帮忙。