我正在监控remoteIO渲染回调中的麦克风。
我运行一个简单的算法来检测是否检测到音频信号。
如果是,我开始记录到缓冲区中,直到再次静默。
一旦再次检测到静默,我需要告诉我的应用程序有一个准备好处理的声音缓冲区。然后,应用程序将执行处理。
这是必须的,这是在不同的线程上完成的!( remoteIO渲染回调线程不能被阻塞,它是一个实时线程,它会使系统卡顿)。
我天真地认为我可以从我的渲染回调中发送一个NSNotification,然后它会在不同的线程上被拾取。但这不会发生!它在同一个线程上执行。
完成此任务的整洁方法是什么?
我的感觉是,我可能应该产生一个单独的线程。甚至在主线程上进行处理似乎也有点小问题……这可能也需要四分之一秒,这将足以造成一些UX人工制品。
发布于 2011-12-06 18:01:03
我已经做了类似的事情,简单的答案是我创建一个串行调度队列,然后在音频单元渲染回调中获取数据,并使用dispatch_async将新的音频数据传递到串行队列。我使用二级队列,因为音频单元需要你在回调中花费尽可能少的时间-而且你不应该malloc内存或产生中断之类的。
在这里,lockData和unlockData获取预先分配的NSMutableData对象,然后将其存储在一个锁定/解锁的数组中。
//在init方法中
self.captureQueue = dispatch_queue_create("AudioCaptureQueue", NULL);在渲染回调中:
__block NSMutableData * audiodata = [audioIO lockData];
status = AudioUnitRender(audioIO.audioUnit,
ioActionFlags,
inTimeStamp,
inBusNumber,
inNumberFrames,
&auBufferList);
dispatch_async(audioIO.captureQueue, ^{
[audioIO.sampleCaptureDelegate audioComponent:audioIO
hasSampleBuffer:audiodata];
[audioIO unlockData:audiodata];
});在串行队列中是我对音频数据进行所有数据处理的地方,然后当串行队列检测到它正在寻找的东西时,它可以使用
dispatch_async(dispatch_get_main_queue(), ^{
[[NSNotificationCenter defaultCenter] postNotificationName:kAPPAudioQueueDidDetect
object:nil];
});dispatch_get_main_queue意味着它是在主线程上执行的,所以你可以做UI更新之类的事情!
https://stackoverflow.com/questions/8397594
复制相似问题