После того, как вы много раз беспокоили вас, я разговаривал с яблоками, и мне нужно принять решение, которое вы, вероятно, знаете лучше меня.многопоточность, выборка и основные проблемы с программным обеспечением
Я занимаюсь аудио в реальном времени, читаю буферы, DSP (FFT) и принимаю решение. Я должен отправить это решение на основную сцену (или основной поток), чтобы делать материал параллельно. Итак, получите звуковые буферы и послушайте решение в режиме реального времени.
проблема заключается в следующем: вы не можете включить функцию обратного вызова звука, функции objC или другие вещи, требующие времени, например, после уведомления другого класса, когда решение было принято.
, что я попробовал еще:
положить NSNotification в этой функции обратного вызова, чтобы уведомить основной поток на новый данных- это просачивается.
принять решение в глобальной переменной (singleletone), а затем запланировать, что var из основного потока, который кажется плохой идеей (и NSTimer can not получить менее 50 мс).
просто звоните из обратного вызова в другую функцию в другом классе - чтобы реализовать что-то там, потому что утечка - даже если я просто 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;
}