4

多数のループを同時に開始し、それらの同期を維持する必要があるアプリに取り組んでいます。

この問題に対する以前の素朴なアプローチ (AVAudioEngine を使用していない) を使用したところ、プログラムで多数のオーディオ プレーヤーを順番に起動すると、呼び出し間に十分な遅延が発生し、結果が役に立たなくなることがわかりました。ビートは明らかに同期していませんでした。

AVAudioEngine を使用してこの種の機能を実現できますか?

現在、AVAudioPlayerNodes をミキサーに配線しており、それらにバッファーを接続し、そこからの入力を制御しています。しかし、それらをすべて同時に開始することはできますか?

play を呼び出すまでノードがサウンドを生成し始めないようで、エンジンが始動する前にそれを行うことはできません...

4

3 に答える 3

0

同期が必要な AVAudioPlayerNode インスタンスをそれぞれループすることで、探していた効果を実現しました。

  1. 「プレイ」の呼び出し
  2. 適切なバッファを将来のある時点で開始するようにスケジュールする

コードは次のようになります。

    for (AVAudioPlayerNode *playerNode in playerNodes) {
        [playerNode play];
        [playerNode scheduleBuffer:loopBufferForThisPlayer atTime:startTime options:AVAudioPlayerNodeBufferLoops completionHandler:nil];
    }

startTime で指定された時間は、すべてのプレイヤー ノードがプレイできる状態であることを確認するために、近い将来 (300 ミリ秒程度) の時間です。startTime はホスト時間に基づく必要があります。サンプルの時間を基準にすると、物事が同期しなくなります。

質問で説明されているように、これらのノードはすべて AVAudioMixerNode に接続されていました。

私はこのように遅延を使用することに熱心ではありません。ノードがいつ準備ができたかを教えてくれたらいいのですが、これはうまくいきます。

于 2016-03-11T10:01:48.703 に答える