OpenSL ES を使用して Android 6.0.1 を実行している Nexus 6 で低遅延のストリーミング オーディオ再生を実装しようとすると、奇妙な問題が発生します。
私の最初の試みは飢餓の問題に苦しんでいるようだったので、バッファ完了コールバック関数にいくつかの基本的なタイミング ベンチマークを追加しました。私が見つけたのは、アプリが開いているときに画面をタップし続けるとオーディオが正常に再生されることですが、数秒間そのままにしておくと、コールバックに時間がかかり始めます。この動作を一貫して再現できます。注意すべき点がいくつかあります。
- 「数秒」 ~= 3 ~ 5 秒、画面の変更をトリガーするのに十分な長さではありません
- 私のアプリケーションのアクティビティは FLAG_KEEP_SCREEN_ON を設定するので、とにかく画面の変更は発生しません
- 私は、オーディオ コールバック スレッドの優先度を上げるための措置を講じていません。Android がこれらのスレッドに対してすでに高い優先度を予約しているという印象を受けていたからです。
- この動作は Nexus 6 (Android 6.0.1) で発生しますが、Galaxy S6 (Android 5.1.1) でも発生しません。
私が見ている症状は、電話との対話がない状態が数秒間続くと、OS がオーディオ スレッドの優先順位を下げるように見えます。これは正しいですか?この動作を回避する方法はありますか?