2012-05-01 36 views
0

多次讓人們感到困擾之後,我正在與蘋果公司交談,我必須得到一個你可能比我更瞭解的決定。多線程,採樣和基本軟件問題

我正在處理音頻實時,讀緩衝區,DSP(FFT)並得到一個決定。 我必須將這個決定發送到主場景(或主線程),並行執行。所以,獲得音頻緩衝區,並實時聽取決定。

問題是:您不能放入音頻回調函數,objC函數或其他需要時間的事情,比如在做出決定時向其他類發佈通知。

什麼,我還沒有嘗試過:

  1. 放NSNotification在回調,通知上的新數據 - 它泄漏的主線。

  2. 把決定放在一個全局變量(singletone)中,然後從主線程調度var,這似乎是一個壞主意(並且NSTimer不能達到50ms)。

  3. 只是從回調調用另一個類中的另一個函數 - 執行那裏的東西 - 導致泄漏 - 即使我只是NSLOG裏面的東西。

  4. 創建另一個objC功能另一個線程,從音頻回調函數調用它,不過,泄漏(這意味着-the內存正在快速增長!)

不能找到這樣做的正確方法。

的人誰願意採取回調函數一看(這被稱爲1000的次),

回調:

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可以更新,所以如果要由UI顯示該決定,只需在重複定時器回調中輪詢一個標誌變量即可。如果另一個線程需要更頻繁地更新某些內容,請在音頻回調之外啓動該線程,然後讓該線程輪詢或等待鎖定。