2012-05-01 23 views
0

多くの人にあなたを邪魔した後、私はリンゴの人と話していました。マルチスレッド、サンプリング、基本的なソフトウェアの問題

私はリアルタイムでオーディオを扱い、バッファを読み込み、DSP(FFT)を実行して決定を下します。 私はその決定を主な場面(またはメインスレッド)に送り、物事を並行して行う必要があります。 これで、オーディオバッファを取得し、リアルタイムで決定に耳を傾けます。

問題は、オーディオコールバック関数、objC関数、または決定が下されたときに他のクラスへの通知を送信するなど、時間がかかるその他のことができないことです。

  1. は、それが漏れた新しいデータ - のメインスレッドに通知することで、コールバックNSNotificationを置く:私はまだ試してみました何

    グローバル変数(シングルトン)に決定し、メインスレッドからvarをスケジュールします。これは悪い考えです(NSTimerは50ms未満になります)。

  2. コールバックから別のクラスの別の関数にコールするだけで、そこに物事を実装することができます。たとえそこにNSLOGがあってもリークが発生します。

  3. (-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; 


} 

答えて

2

アンNSTimerは、できるだけ頻繁にについて発生します。(二千の回呼び出された)コールバック関数に

コールバックを見てみたい人のため

UIを更新することができます。そのため、UIによって表示する場合は、繰り返しタイマーコールバックでフラグ変数をポーリングするだけです。別のスレッドが何かを頻繁に更新する必要がある場合は、そのスレッドをオーディオコールバックの外で起動し、そのスレッドをポーリングしたり、ロックを待ってください。