【问题标题】:multi-threading, sampling and basic software issues多线程、采样和基本软件问题
【发布时间】:2012-05-01 13:49:00
【问题描述】:

在打扰了你们这么多次之后,我正在和苹果人交谈,我必须做出一个你可能比我更了解的决定。

我正在实时处理音频,读取缓冲区,DSP(FFT)并做出决定。 我必须将该决定发送到主场景(或主线程),以并行执行操作。 因此,获取音频缓冲区,并实时听取决策。

问题是:你不能放入音频回调函数,objC函数,或者其他需要时间的东西,比如在做出决定时向其他类发布通知。

我尝试过的:

  1. 将 NSNotification 放入该回调中,以通知主线程有新数据 - 它泄漏了。

  2. 将决定放入一个全局变量(单调)中,然后从主线程调度该变量 - 这似乎是个坏主意(而且 NSTimer 不能低于 50 毫秒)。

  3. 只需从回调调用另一个类中的另一个函数 - 在那里实现东西 - 导致泄漏 - 即使我只是 NSLOG 那里的东西。

  4. 在另一个 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;


}

【问题讨论】:

    标签: objective-c c core-audio


    【解决方案1】:

    UI 运行循环中的 NSTimer 将在 UI 可以更新时触发,因此如果决定由 UI 显示,只需在重复的计时器回调中轮询标志变量。如果另一个线程需要更频繁地更新某些内容,请在音频回调之外启动该线程,然后让该线程轮询或等待锁定。

    【讨论】:

      猜你喜欢
      • 2011-01-27
      • 2016-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-15
      • 2020-03-05
      • 2011-09-19
      • 1970-01-01
      相关资源
      最近更新 更多