2012-05-01 2 views
0

После того, как вы много раз беспокоили вас, я разговаривал с яблоками, и мне нужно принять решение, которое вы, вероятно, знаете лучше меня.многопоточность, выборка и основные проблемы с программным обеспечением

Я занимаюсь аудио в реальном времени, читаю буферы, DSP (FFT) и принимаю решение. Я должен отправить это решение на основную сцену (или основной поток), чтобы делать материал параллельно. Итак, получите звуковые буферы и послушайте решение в режиме реального времени.

проблема заключается в следующем: вы не можете включить функцию обратного вызова звука, функции objC или другие вещи, требующие времени, например, после уведомления другого класса, когда решение было принято.

, что я попробовал еще:

  1. положить NSNotification в этой функции обратного вызова, чтобы уведомить основной поток на новый данных- это просачивается.

  2. принять решение в глобальной переменной (singleletone), а затем запланировать, что var из основного потока, который кажется плохой идеей (и NSTimer can not получить менее 50 мс).

  3. просто звоните из обратного вызова в другую функцию в другом классе - чтобы реализовать что-то там, потому что утечка - даже если я просто NSLOG что-то там.

  4. создать еще один поток в другой функции 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; 


} 

ответ

2

NSTimer в цикле UI выполнения будет срабатывать примерно так же часто, как пользовательский интерфейс может быть обновлен, поэтому, если решение должно быть отображено пользовательским интерфейсом, просто опросите переменную флага в повторяющемся обратном вызове таймера. Если другой поток должен обновлять что-то более часто, запустите этот поток вне обратного вызова звука и просто попробуйте этот опрос нитей или подождите блокировки.

Смежные вопросы