0

ライブ音楽と一緒に(ステージ上または寝室で)再生できるiPad用のドラムコンピューターアプリを作成しました。セットアップは非常に基本的です。ボタンの1つを押すと、対応するサンプルが再生されます。すべてが非常にスムーズに機能しますが、残念ながら、指を下に置いてからサウンドが再生されるまでの間に、(煩わしいとはいえ)わずかな遅延があるように見えます。レイテンシーの量を(耳で)測定しようとしましたが、0.05〜0.1秒のようです。

オーディオ再生は、AudioToolboxフレームワーク(拡張オーディオファイルサービス、Audio Units)を使用して実装されています。サウンドは、デバイスに保存されているファイルからストリーミングされ、異なるサウンドバンク間のロード時間を防ぎます。サンプルは生のwav形式(線形PCM、16ビットリトルエンディアン符号付き整数、2チャネル、44100 Hz)であり、私が理解している限り、処理が最も速いはずです(mp3のように圧縮されたものとは対照的です)。

ボタンを押してから(UIButtonタッチイベント)、サンプルの最初のフレームがミキサーに配信されるまでの時間を測定しました(再生コールバックを介して)。非常に安定しており、0.02〜0.03秒です。私にはこれはかなり速いように見えますが、十分に速くないかもしれません。

それが問題なのか、それともタッチイベントの配信の遅延のようなものなのか。

アップデート:

Tillが提案したように、サンプルの読み込みを書き直しました。これらはすべてメモリにプリロードされるようになったため、ディスクIOは問題ではなくなりました。その上、私はエコー効果のためにかなりのmemcpyを実行していましたが、それを無効にしました。後でリンクリストのような解決策で修正します。

これにより待ち時間は短縮されますが、ボタンを押した->再生は0.005〜0.02秒の間で測定されます(ただし、多くの場合、0.02秒のようになります)。これはまだ目立ちます。これは、再生コールバックのバッファサイズ(現在は1024バイト)が原因である可能性があると考えています。

それを行う方法について何かアイデアはありますか?kAudioUnitProperty_MaximumFramesPerSliceの設定が機能していないようです。

4

2 に答える 2

2

オーディオセッションクックブックに記載されているように、優先ハードウェアI / Oバッファー期間を指定することで、レイテンシーの問題を解決しました。

NSTimeInterval preferredBufferDuration = 0.005;
[audioSession setPreferredIOBufferDuration:preferredBufferDuration error:&audioSessionError];

if (audioSessionError != nil) 
{
    NSLog (@"Error setting preferred buffer duration.");
    return;
}

バッファ期間を0.005に設定すると、アプリケーションは各サイクルで256バイト(44Khz)を供給するだけで済みます。これにより(明らかに)レイテンシーが0.02から0.005に減少しますが、オーディオはより高速で生成される必要があります。

iPad 2は、IOがディスクから読み取られた場合でも、この速度に完全に対応できます。残念ながら、第1世代のiPadは(ディスクIOの有無にかかわらず)十分な速度ではないため、2つを区別し、iPad1のレイテンシーを少し長くしてパフォーマンスを向上させる方法を見つけられるといいのですが。

于 2011-12-29T16:25:24.373 に答える
1

インストルメントをTimeProfiler(インストルメントに関するAppleドキュメンテーション)テンプレートとともに使用して、実行に多くの時間がかかるメソッドを正確に見つけることができます。実行中は、必ず[コールツリーの反転]オプションをオフにし、[システムライブラリを非表示]をオンにしてください。

于 2011-12-28T18:07:24.373 に答える