多くの人にあなたを邪魔した後、私はリンゴの人と話していました。マルチスレッド、サンプリング、基本的なソフトウェアの問題
私はリアルタイムでオーディオを扱い、バッファを読み込み、DSP(FFT)を実行して決定を下します。 私はその決定を主な場面(またはメインスレッド)に送り、物事を並行して行う必要があります。 これで、オーディオバッファを取得し、リアルタイムで決定に耳を傾けます。
問題は、オーディオコールバック関数、objC関数、または決定が下されたときに他のクラスへの通知を送信するなど、時間がかかるその他のことができないことです。
は、それが漏れた新しいデータ - のメインスレッドに通知することで、コールバックNSNotificationを置く:私はまだ試してみました何
グローバル変数(シングルトン)に決定し、メインスレッドからvarをスケジュールします。これは悪い考えです(NSTimerは50ms未満になります)。
コールバックから別のクラスの別の関数にコールするだけで、そこに物事を実装することができます。たとえそこにNSLOGがあってもリークが発生します。
(-theメモリが急速に成長していることを意味する!)、まだ、オーディオコールバック関数から呼び出し、他にObjC機能でリークを別のスレッドを作成
ことを行うには正しい方法を見つけるカント。 UIの実行ループで
static OSStatus recordingCallback(void *inRefCon,
AudioUnitRenderActionFlags *ioActionFlags,
const AudioTimeStamp *inTimeStamp,
UInt32 inBusNumber,
UInt32 inNumberFrames,
AudioBufferList *ioData)
{
AudioBuffer buffer;
buffer.mNumberChannels = 1;
buffer.mDataByteSize = inNumberFrames * 2; //* sizeof(SInt16) ?
buffer.mData = NULL;// malloc(inNumberFrames * 2);
// Put buffer in a AudioBufferList
AudioBufferList bufferList;
bufferList.mNumberBuffers = 1;
bufferList.mBuffers[0] = buffer;
OSStatus status;
status = AudioUnitRender(audioUnit,
ioActionFlags,
inTimeStamp,
inBusNumber,
inNumberFrames,
&bufferList);
SInt16 *targetBuffer = (SInt16*)(&bufferList)->mBuffers[0].mData;
// got the buffer, here i have tried so many things to do with it ,in order to not leak the app. i need to send it somewhere to process the data, or save it somewhere else.
[globals sharedGlobals].bufBuf=targetBuffer;
return noErr;
}