gpt4 book ai didi

objective-c - 多线程、采样和基本软件问题

转载 作者:行者123 更新时间:2023-11-30 14:25:23 30 4
gpt4 key购买 nike

在多次打扰你们之后,我正在与苹果公司的员工交谈,我必须做出一个决定,你们可能比我更了解。

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

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

我已经尝试过:

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

  2. 将决策放入全局变量(单例)中,然后从主线程安排该 var - 这似乎是一个坏主意(并且 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;


}

最佳答案

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

关于objective-c - 多线程、采样和基本软件问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10398618/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com