CRIWARE Unity Plugin Manual  Last Updated: 2024-04-24
サウンド再生遅延推測について
注意
  • SonicSYNC が有効な場合、本機能は利用できません
  • 可能な限りSonicSYNCを利用して再生遅延自体を軽減することをお勧めします

サウンド再生遅延推測とは

サウンド再生遅延とは

本項では「サウンド再生遅延」のことを、プログラムが再生指示を出してから実際に端末のスピーカーから発音されるまでの時間として説明します。
atom_about_start_latency.png
サウンド再生遅延の定義
Android端末の場合、全般的にサウンド再生遅延時間が大きく、さらに機種による差が激しいのが特徴です。

サウンド再生遅延がもたらす問題点

例えば音楽ゲームのように、音楽に合わせて画面を変化させる演出が必要な場合に問題が発生します。
サウンド再生遅延が大きいと、プログラムでは音楽再生の経過時刻に合わせて画面を動かしているにもかかわらず、聞こえてくる音楽と演出のタイミングが合わないことになります。
サウンド再生遅延の機種差が大きいと、見た目のタイミングを合わせるためにプログラムで音楽の経過時刻にゲタを履かせることも難しくなります。
タップ音(タップ操作SE)などユーザ操作に反応する音が遅れて聞こえるために気持ち悪いという問題もあります。
この問題は遅延時間の存在自体が問題のため、遅延時間を推測したとしても解消できません。
ADXではこの問題への対策として「 Android低遅延音声再生 」を提供していますので、参考にしてください。

ADXのサウンド再生遅延推測

ADXでは「サウンド再生遅延推測」機能によって、アプリが機種毎にタイミング調整する手間を簡略化したいと考えています。
プログラムでその端末のサウンド再生遅延時間を動的に取得できれば、音楽の経過時刻調整に端末ごとのデータベースを作る必要がなくなります。
ただし、ADXのサウンド再生遅延推測は、100%正しい結果を保証するものではありませんし、端末によっては実際の遅延時間と大きく異なる結果を返してしまう可能性もあります。
アプリケーションが機種ごとの調整をする際の参考値として使われることを想定していることをご了承ください。
なお、本機能のためにAndroidのマイク機能は使用しません。

バージョンによる結果の違い

SDK 3.08.00 より、本機能で得られる値が小さくなる傾向があります。
これは SonicSYNC の対応に追従して、
従来の非SonicSYNCでの一部再生処理や、遅延推測機能の動作仕様を修正したことによる変化です。

サウンド再生遅延推測の利用方法

サウンド再生遅延推測機能はデフォルトでは無効になっています。
利用するためにはスクリプト側で専用の関数呼び出しが必要です。以下の手順で利用します。
  1. CriWare.CriWareInitializer コンポーネントで CRI Atomライブラリを初期化する
  2. CriWare.CriAtomExLatencyEstimator.InitializeModule 関数をスクリプト内で呼んで、遅延推測処理を開始する
  3. 非同期実行される遅延推測処理に対して、CriWare.CriAtomExLatencyEstimator.GetCurrentInfo 関数で実行状態と遅延推測値を確認する
  4. 推測処理の実行状態が「完了("Done")」を示したら、遅延推測値(ミリ秒)をアプリケーションコードで記録する
  5. CriWare.CriAtomExLatencyEstimator.FinalizeModule 関数を呼んで、遅延推測処理を終了する
遅延推測処理を開始してから完了するまでに、2~3秒かかる場合があります。
上記手順の具体的な実装例として、 [CriAtom]Android端末の音声再生の遅延時間推測 サンプルがあります。ご確認ください。

プログラムでの推測結果の使用について

鳴っている音の時刻の計算

ADXの再生時刻取得関数は、遅延時間を考慮しない値を返します。
そのため、遅延時間を織り込んだ時刻計算はアプリケーション側で行う必要があります。
音楽に合わせて画面を動かす演出を行う場合、鳴っている音の時刻は次のように計算する事が出来ます。

atom_howto_use_latency.png
鳴っている音の時刻の計算式(例)
例えば遅延時間が200msecだった場合、「鳴っている音の時刻」は-200msecから始まります。
また、ADXから再生時刻を取得している場合は、音楽の尺よりも200msec短いところで再生時刻が止まります。
この計算式は一例ですが、これらを考慮してプログラム側の画面演出を調整してください。
ADXの遅延時間推測は完璧ではありませんので、音楽ゲームの場合はゲームを遊ぶ人がオプションでタイミングをさらに微調整できることが望ましいです。
その場合は、初めてアプリを起動した際の調整値のデフォルト値として遅延時間推測値を使うといいでしょう。

遅延時間を推測するタイミング

再生遅延時間の推測結果は、起動するたびにある程度の数値のばらつきが生じる場合があります。
ゲームで利用する場合は遅延時間を毎回推測しなおしてしまうとユーザーが混乱する可能性がありますので、一度推測値を記録したら以後は自動では更新しないようにするといいでしょう。

遅延推測がうまくいかないケース

ADXの遅延推測結果が実際の音と大きくずれてしまう可能性があることが分かっています。
既知の条件は次のようなものです。
  • ワイヤレスのイヤフォンを使用している場合、推測値よりも遅延が大きくなることが予想されます。
  • 端末側のサウンドオプションで特殊なサウンド演出機能がある場合、推測値よりも遅延が大きくなることが予想されます。
これらの事例は、遅延推測機能としての改善の目途はたっていません。ご了承ください。

遅延推測が失敗する要因

CriWare.CriAtomExLatencyEstimator.GetCurrentInfo 関数で取得可能な実行状態は、次のような要因で「エラー("Error")」に遷移する可能性があります。
  • OSの問題により音声再生が行えない。
  • 遅延が大きすぎて処理がタイムアウトした。
    遅延推測が失敗した場合を想定し、「アプリケーションの再起動を促す」「事前に用意したデフォルト値を用いる」等の対策を行ってください。

    エラー「E2015062623:failed to realize OpenSLES player.」が発生して遅延推測に失敗している場合、低遅延再生の利用によりOSが設定しているOpenSLESプレーヤの生成数上限に達している可能性があります。<BR> CRIWARE Library Initializer コンポーネントに指定している低遅延再生用ボイスプールの数を減らして問題が解消しないかご確認ください。