在多次打扰你们之后,我正在和苹果公司的人交谈,我必须做出一个你可能比我更了解的决定。
我正在实时处理音频,读取缓冲区,DSP(FFT)并做出决定。我必须将该决定发送到主场景(或主线程),以并行执行操作。因此,获取音频缓冲区,并实时听取决策。
问题是:您不能放入音频回调函数、objC 函数或其他需要时间的东西,例如在做出决定时向其他类发布通知。
我已经尝试过的:
将 NSNotification 放入该回调中以通知主线程有关新数据的信息——它会泄漏。
将决定放在一个全局变量(单音)中,然后从主线程调度该变量 - 这似乎是一个坏主意(并且 NSTimer 不能低于 50 毫秒)。
只需从回调调用另一个类中的另一个函数 - 在那里实现东西 - 导致泄漏 - 即使我只是 NSLOG 那里的东西。
在另一个 objC 函数中创建另一个线程,从音频回调函数中调用它,仍然泄漏(这意味着 - 内存正在快速增长!)
找不到正确的方法来做到这一点。
对于想要查看回调函数(每秒调用 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;
}