많은 사람들이 당신을 괴롭 히고 난 뒤에 사과 친구들과 이야기하고 있었고, 당신이 나보다 잘 알고있는 결정을해야합니다.멀티 스레딩, 샘플링 및 기본 소프트웨어 문제
나는 실시간으로 오디오를 다루고, 버퍼, DSP (FFT)를 읽고 결정을 내린다. 그 결정을 주요 장면 (또는 메인 스레드)에 보내야합니다. 그래서 오디오 버퍼를 가져 와서 실시간으로 결정을 듣습니다.
문제는 오디오 콜백 함수, objC 함수 또는 결정이 내려 졌을 때 다른 클래스에 알림을 게시하는 등의 시간이 걸리는 다른 것들을 넣을 수 없다는 것입니다. 나는 아직 시도 것을
: 그 콜백에서
넣어 NSNotification는 누수 새로운 데이터 -에 메인 쓰레드를 통지합니다.
전역 변수 (singletone)에 결정을 넣은 다음 주 스레드에서 var를 예약합니다. 나쁜 생각 인 것 같습니다. (NSTimer는 50ms 미만으로 나타납니다.)
콜백에서 다른 클래스의 다른 함수를 호출하면 누수가 생길 수 있습니다. 즉, NSLOG 만있는 경우에도 마찬가지입니다.
(년 - 메모리가 빠르게 성장하고 의미!), 여전히, 오디오 콜백 함수에서 호출, 누수를 다른 objC 기능에서 다른 스레드를 만들
것을 할 수있는 올바른 방법을 찾을 수 없습니다 .
(두 번째 1000의 배를 불리는) 콜백 함수에보고콜백 먹고 싶어 누군가를 위해
: 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;
}