私は、シリアル・ディスパッチ・キューを作成し、オーディオ・ユニットのレンダリング・コールバックでデータを取得し、新しいオーディオ・データをシリアル・キューに渡すために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のMEAを使用することができるために、そのが探しているものを検出し、それはメインスレッド上で実行されるので、UIの更新などを行うことができます。
[audioIO lockData]がロックを取得するのを待っている間にスレッドが停止することはありませんか? –
2つの関数lockとunlockは実際には 'ロック'ではなく、単にある配列から別の配列にポインタを移動するだけで、どのブロックに使用可能なデータがあるか、再利用できるかがわかります。私はそれが必要ではないと思って以来、コードを貼り付けていませんが、標準の 'ロックフリー'リングバッファです –