私のアプリケーション内でサウンドを処理しています。 DSPアルゴリズムはC++
で記述されています。データをC++
に渡し、その結果をSwift
のオーディオサブシステムに渡す必要があります。出力にそれだけでコピー今、入力を[[Float]]配列を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
あなたが見ることができるように:
は、私が書いたObjective-C++
クラスを
C++
にデータを渡します。
このメソッドの呼び出しは、MyClass
のプロパティとして説明されているMTAudioProcessingTapProcessCallback
クロージャ内で実行されます。 EffectsWrapper
もこのクラスのプロパティです。
は、「プロセス」のデータは、最初に、私はのように入力と出力アレイを作成するには、次の
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
内のデータは完全にゴミであるということです。時々、それは私に割り当てエラーを投げる。そして、私が作成するポインタが、必要とする配列の要素ではなく、メモリ内のいくつかのランダムな場所を指している理由はわかりません。
助けてください。
私は1D配列を使い、 '&'演算子を使ってポインタを渡すことに決めました。とにかく 'C++'はオーディオチャンネルを別々の配列として扱います。魅力のように動作します。 –