オーディオのウォームアップ

オーディオのウォームアップとは、デバイスのオーディオ アンプ回路の電源が完全に入り、通常の動作状態になるまでの時間です。オーディオ ウォームアップにかかる時間は、主に電源管理と回路を安定させる「de-pop」ロジックによって決まります。

このドキュメントでは、オーディオ ウォームアップ時間の測定方法と短縮方法について説明します。

出力ウォームアップの測定

AudioFlinger の FastMixer スレッドは自動的に出力ウォームアップを測定し、dumpsys media.audio_flinger コマンド出力の一部として通知します。ウォームアップ時、FastMixer は 2 つの write() 間の時間が予想の値に達するまで write() を繰り返し呼び出します。FastMixer は、Hardware Abstraction Layer(HAL)の write() が安定するまでにかかる時間を確認して、オーディオ ウォームアップの時間を決定します。

オーディオ ウォームアップを測定するには、内蔵スピーカーと有線ヘッドフォンが起動した後のさまざまな時点で次の手順を実行します。通常、ウォームアップ時間はデバイスの起動直後に発生し、出力デバイスごとに異なります。

  1. FastMixer が有効になっていることを確認します。
  2. デバイスで、[設定] > [サウンド] > [タッチ操作音] の順に選択して、タッチ音を有効にします。
  3. 音声が 3 秒以上オフであることを確認します。ただし、ハードウェア自体が電源ロジックを AudioFlinger の 3 秒を超えて保持する可能性もあるため、オフである時間は 5 秒以上である方が望ましいです。
  4. ホームボタンを押すと、クリック音が鳴ります。
  5. ウォームアップの測定値を受信するには、次のコマンドを実行します。
    adb shell dumpsys media.audio_flinger | grep measuredWarmup
    

    次のような出力が表示されます。

    sampleRate=44100 frameCount=256 measuredWarmup=X ms, warmupCycles=X
    

    measuredWarmup=X の X は、最初の HAL の write() セットが完了するまでにかかった時間をミリ秒で表したものです。

    warmupCycles=X は、write() の実行時間が予想時間と一致するまでにかかった HAL の書き込みリクエスト数です。

  6. 取得した 5 つの測定値を平均値とともに記録します。 測定値がほぼ同じでない場合、値が正しくない可能性があります。たとえば、音声をオフにした後に経過した時間が不十分だと、ウォームアップ時間が平均値よりも短くなります。

入力ウォームアップの測定

現在、オーディオの入力ウォームアップの測定ツールはありません。 ただし、startRecording() が返るまでに必要な時間を監視することで、入力ウォームアップ時間を見積もることができます。

ウォームアップ時間の短縮

ウォームアップ時間は、通常、次の条件を組み合わせることで短縮できます。

  • 適切な回路を設計する。
  • カーネル デバイス ドライバの遅延時間の正確さを保つ。
  • 独立したウォームアップ操作を順次実行するのではなく、同時に実行する。
  • 回路の電源をオンのままにするかクロックの再設定を行わない(アイドル状態の電力消費を増やす)。
  • コンピューティング パラメータをキャッシュする。

ただし、過度の最適化には注意が必要です。ウォームアップ時間が短縮する代わりに、電源遷移時のポッピングが減少し、トレードオフの状態となる場合があります。