2012-05-01 2 views
0

많은 사람들이 당신을 괴롭 히고 난 뒤에 사과 친구들과 이야기하고 있었고, 당신이 나보다 잘 알고있는 결정을해야합니다.멀티 스레딩, 샘플링 및 기본 소프트웨어 문제

나는 실시간으로 오디오를 다루고, 버퍼, DSP (FFT)를 읽고 결정을 내린다. 그 결정을 주요 장면 (또는 메인 스레드)에 보내야합니다. 그래서 오디오 버퍼를 가져 와서 실시간으로 결정을 듣습니다.

문제는 오디오 콜백 함수, objC 함수 또는 결정이 내려 졌을 때 다른 클래스에 알림을 게시하는 등의 시간이 걸리는 다른 것들을 넣을 수 없다는 것입니다. 나는 아직 시도 것을

: 그 콜백에서

  1. 넣어 NSNotification는 누수 새로운 데이터 -에 메인 쓰레드를 통지합니다.

  2. 전역 변수 (singletone)에 결정을 넣은 다음 주 스레드에서 var를 예약합니다. 나쁜 생각 인 것 같습니다. (NSTimer는 50ms 미만으로 나타납니다.)

  3. 콜백에서 다른 클래스의 다른 함수를 호출하면 누수가 생길 수 있습니다. 즉, NSLOG 만있는 경우에도 마찬가지입니다.

  4. (년 - 메모리가 빠르게 성장하고 의미!), 여전히, 오디오 콜백 함수에서 호출, 누수를 다른 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; 


} 

답변

2

NSTimer가 자주 약 발사됩니다 UI를 업데이트 할 수 있으므로 UI가 표시하도록 결정하면 반복 타이머 콜백에서 플래그 변수를 폴링하면됩니다. 다른 스레드가 더 자주 업데이트해야하는 경우 오디오 콜백 외부에서 해당 스레드를 시작하고 해당 스레드 폴링 또는 잠금을 기다리십시오.