多次讓人們感到困擾之後,我正在與蘋果公司交談,我必須得到一個你可能比我更瞭解的決定。多線程,採樣和基本軟件問題
我正在處理音頻實時,讀緩衝區,DSP(FFT)並得到一個決定。 我必須將這個決定發送到主場景(或主線程),並行執行。所以,獲得音頻緩衝區,並實時聽取決定。
問題是:您不能放入音頻回調函數,objC函數或其他需要時間的事情,比如在做出決定時向其他類發佈通知。
什麼,我還沒有嘗試過:
放NSNotification在回調,通知上的新數據 - 它泄漏的主線。
把決定放在一個全局變量(singletone)中,然後從主線程調度var,這似乎是一個壞主意(並且NSTimer不能達到50ms)。
只是從回調調用另一個類中的另一個函數 - 執行那裏的東西 - 導致泄漏 - 即使我只是NSLOG裏面的東西。
創建另一個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;
}