ファームウェアで見る Pixel の空間オーディオ
はじめに
この記事は、元々 Android 14 QPR1 Beta 1 がリリースされた際、Pixel Tablet が空間オーディオに対応したことをファームウェアで確認していく記事だった。現在は Android 14 QPR1 が正式リリースされ、空間オーディオにも正式対応したことから、Pixel の空間オーディオ解説記事として転向することにした。
この記事では、空間オーディオに対応したことをファームウェア上でどのように確認したかだけでなく、そもそも Android の空間オーディオとは一体何なのか、それに対応することで何が嬉しいのか、などについても解説する。
Android の QPR とは
Quarterly Platform Releases の略で、Android のメジャーアップデート後、四半期ごとに行われる中規模アップデート。メジャーアップデート (8月~10月頃) → QPR1 (12月頃) → QPR2 (3月頃) → QPR3 (6月頃) → メジャーアップデート (8月~10月頃) → … という流れになっている。
「マイナーアップデート」と言わず、あえて「中規模アップデート」と言ったのは、QPR のアップデートでは基本的に Android バージョンは上がらないため。例外として、Android 12 QPR1 → QPR2 のタイミングでは、バージョンが Android 12.0.0 から Android 12.1.0 (Android 12L) に上がっていた。
解説に入る前に理解しておいていただきたいこととして、Pixel は Google が開発している Android 端末とはいえ、Android のリファレンス端末だった Nexus とは違い、いわゆる素の Android が搭載されているわけではない。Pixel には Pixel 独自のカスタマイズが入っている。
また、そもそも Android の空間オーディオは、OS 側がバーチャライザーやヘッドトラッカーのようなオーディオエフェクトを提供するわけではない。こうした部分に関しては引き続き Dolby Atmos や 360 Reality Audio などに委ねられており、何をどう実装するかは端末メーカー次第となっている。
では Android 側は一体何をやっているのかというと、Dolby Atmos や 360 Reality Audio などを、従来よりももっと高度に活用するための環境整備や、各メーカーが何をどのように実装したとしても同じ動きができるようにするための標準規格の策定などである。
Pixel の空間オーディオは、Android の空間オーディオの仕様に沿うよう実装された、Pixel 独自のシステムである。Google による実装ではあるものの、あくまで実装例の一つでしかなく、リファレンスというわけではない。
build.prop
build.prop とは、ファームウェアに絡む様々な情報が記載されたファイルである。OS バージョン、ビルド番号、機種名、型番といった基本的な情報から、空間オーディオ含め個別の機能に関する情報まで、ありとあらゆる情報が記載されている。
build.prop は同名のファイルが複数の場所に分散しており、どのファイルに空間オーディオ絡みの情報が載っているかは、端末メーカーにより異なるが、Pixel の場合は /vendor/build.prop に記載される。
Android 14 QPR1 Beta 1 の Pixel Tablet では /vendor/build.prop に空間オーディオ関連の定義がいくつか追記されていた。以下、それぞれ紹介する。
ro.audio.spatializer_enabled
これは、端末が空間オーディオに対応しているかどうかを示すものである。対応している場合は、ここの値が true
になっている。
1. 次のように、
device.mk
ファイルで空間オーディオ サポートを宣言します。PRODUCT_PROPERTY_OVERRIDES += \
ro.audio.spatializer_enabled=trueこれにより、
空間オーディオとヘッド トラッキング | Android オープンソース プロジェクト | Android Open Source ProjectAudioService
はスペーシャライザ サポートを初期化します。
Android 14 QPR1 Beta 1 の Pixel Tablet では、以下の定義が追加されていた。
ro.audio.spatializer_enabled=true
これにより、空間オーディオに対応したことがわかる。
ちなみに、検証した限りではここの値が false
になっている端末はなく、空間オーディオに非対応の場合、そもそもこの定義自体が存在していない。
(しばし余談)
ファームウェアが入手できないなどの理由により、実機で空間オーディオに対応しているかどうかを確認する場合、設定画面に空間オーディオの項目が存在していれば一目瞭然だが、そうでないものも存在する。
実機では build.prop は基本的に root 権限がないと開けないし、getprop
コマンドでは ro.audio.spatializer_enabled
の値を取得できないことが多い。そこで、以下のコマンドで確認することを推奨する。
adb shell "dumpsys audio | grep mHasSpatializerEffect"
対応の場合:
mHasSpatializerEffect:true (effect present)
非対応の場合:
mHasSpatializerEffect:false (effect present)
Android 12 以下の端末では何も返らない。
この mHasSpatializerEffect
は内部的に ro.audio.spatializer_enabled
の値を参照している。
AudioService.java – Android Code Search より:
mHasSpatializerEffect = SystemProperties.getBoolean("ro.audio.spatializer_enabled", false);
ちなみに、先程使用した dumpsys
コマンドでは、空間オーディオの設定が有効かどうかも確認できる。これを使用することで、設定が分かりづらい端末でも、どれが空間オーディオの設定なのかを探ることもできる。
adb shell "dumpsys audio | grep isSpatializerEnabled"
有効の場合:
isSpatializerEnabled:true (routing dependent)
無効 or 非対応の場合:
isSpatializerEnabled:false (routing dependent)
こちらも、 Android 12 以下の端末では何も返らない。
(主に開発者向け、API の詳細は Android Developers 参照)
先程の isSpatializerEnabled
はおそらく Spatializer
クラスの isEnabled
メソッドで取得した情報を出力しており、空間オーディオを提供するアプリでは、これによって同様の情報を取得することができる。また、isAvailable
メソッドを使用すれば、現在の出力先に対し空間オーディオが利用可能かどうか (例えばモノラルスピーカーでは利用不可) も取得可能。
そして、これらの状態の変化は、OnSpatializerStateChangedListener
で監視することも可能。これにより、「空間オーディオが利用可能な場合には空間オーディオ用の音声を取得し、そうでない場合はステレオ音声を取得する」といった切り替えを、リアルタイムで行うことが可能。空間オーディオのダウンミックスは通信容量がもったいないし、単純なダウンミックスは制作者の意図と乖離している場合もある。この制御は実際に YouTube で利用されている。
更に、Android の空間オーディオでは、アプリ側が空間オーディオの情報を取得するだけでなく、逆にアプリ側が空間オーディオに絡む情報を端末側に伝えたり、アプリ側で空間オーディオの動作を制御したり、といったこともできる。
例えば、音源が既にバーチャライズされているかどうかを指定する setIsContentSpatialized
メソッドを使用すれば、以下のような問題を解決できる。
話がかなり脱線してしまったが、空間オーディオの実装がどのようなものであっても、実装ごとに独自の API を使い分ける必要はなく、Android 共通の API でアプリとシステムが連携できるのは、Android の空間オーディオの特徴の一つである。
persist.bluetooth.a2dp_offload.cap
この値は、Bluetooth の A2DP プロファイル (音声伝送方式の一種) で利用可能なコーデックを示すものである。
空間オーディオとは直接的な関係はないため、この定義自体は Android 14 Beta 5.3 でも存在している。
persist.bluetooth.a2dp_offload.cap=sbc-aac-aptx-aptxhd-ldac
Android 14 QPR1 Beta 1 の Pixel Tablet では、末尾に Opus が追加されている。
persist.bluetooth.a2dp_offload.cap=sbc-aac-aptx-aptxhd-ldac-opus
Opus は YouTube 等で使用されている音声コーデックだが、遅延が少ないようで (エンコード? 伝送? 両方?)、Pixel Buds Pro 等でヘッドトラッキングを行う際のコーデックとしても使用されている。
通常、Bluetooth で Opus が使用されるのはヘッドトラッキング有効時のみである。
コーデックの切り替え
ダイナミック空間オーディオとヘッド トラッキングがオンになっている場合は、Opus などの低レイテンシ コーデックを使用します。非空間オーディオ コンテンツを再生する場合は、Advanced Audio Coding(AAC)などの低電力コーデックを使用します。
高品質の空間オーディオとヘッド トラッキングの実装 | Android オープンソース プロジェクト | Android Open Source Project
コーデック自動切り替えなどを含め、システムレベルでヘッドトラッキングの低遅延化が図られている点も、Android の空間オーディオの特徴の一つである。
Android 13 は、オーディオ パイプラインで可能な限り低いレベルで空間オーディオ処理を提供することで、空間オーディオとヘッド トラッキングを最適化し、可能な限り低いレイテンシを実現します。
高品質の空間オーディオとヘッド トラッキングの実装 | Android オープンソース プロジェクト | Android Open Source Project
Android の空間オーディオにおいて、実はヘッドトラッキングへの対応は必須ではない。しかし、Pixel Tablet は Bluetooth で Opus に対応したことから、ヘッドトラッキングにも対応しようとしていることが伺える。
なお、ヘッドトラッキングで Opus を使用することは、推奨はされているが必須というわけではない。
推奨事項
OEM は、実装時に次のガイドラインを使用することをお勧めします。
空間オーディオとヘッド トラッキング | Android オープンソース プロジェクト | Android Open Source Project
- 可能な場合は LE オーディオを使用して、相互運用性を容易にし、遅延の目標を達成します。
- 優れた UX を実現するには、センサーの動きの検出からヘッドフォンで受信される音声までの往復遅延が 150 ミリ秒未満である必要があります。
- Advanced Audio Distribution Profile (A2DP) を使用した Bluetooth (BT) Classic の場合:
- Opusなどの低遅延コーデックを使用します。
- オーディオ HALでレイテンシ制御関数を実装します。これにより、ヘッド トラッキングがオフのときに電力とパフォーマンスの最適化が可能になり、最適でない状態ではヘッド トラッキングが無効になります。
そのため、Bluetooth で Opus に対応していない機種でも、ヘッドトラッキングに対応していないとは言い切れない。
(また余談)
ヘッドトラッキングに対応しているかどうかを実機で確認する場合、設定画面で確認するには基本的にヘッドトラッキング対応のヘッドホンを用意する必要がある。しかし、先程の dumpsys
コマンドを使用すれば、対応ヘッドホンを用意せずとも確認することができる。
adb shell "dumpsys audio | grep mIsHeadTrackingSupported | sed 's/^\t//'"
対応の場合:
mIsHeadTrackingSupported:true
非対応の場合:
mIsHeadTrackingSupported:false
Android 12 以下の端末では何も返らない。
従来のヘッドトラッキングは同一メーカー / ブランド縛りは当たり前だったが、Android の空間オーディオではヘッドトラッキングのセンサー用プロトコル (通信の仕様) が定められており、これに対応することで異なるメーカー / ブランドの組み合わせであってもヘッドトラッキングが利用可能となっている。
ヘッド トラッカー ヒューマン インターフェース デバイス(HID)プロトコルは、Android 13 以降を搭載しているデバイスで利用でき、ヘッド トラッキング デバイスを USB または Bluetooth 経由で Android デバイスに接続することを可能にします。また、センサー フレームワークを通じて Android フレームワークとアプリに公開されます。このプロトコルは、オーディオ バーチャライザー効果(3D オーディオ)の制御に使用されます。
ヘッド トラッカー HID プロトコル | Android オープンソース プロジェクト | Android Open Source Project
実際に Pixel 6 と WF-1000XM5 の組み合わせで、ヘッドトラッキングが利用できることを確認している。
これにより、ヘッドホンを作っていない Android 端末メーカーでもヘッドトラッキングに対応しやすくなるし、Android 端末を作っていないオーディオ機器メーカーがヘッドトラッキング対応ヘッドホンを作ることも可能になる。
こういったところも、Android が空間オーディオの標準仕様を策定することのメリットである。
persist.vendor.audio.spatializer.speaker_enabled
Android の空間オーディオにおいて、ヘッドホンでの再生は「バイノーラルモード (binaural mode)」と呼び、内蔵スピーカーでの再生は「トランスオーラルモード (transaural mode)」と呼ぶ。
SpatializationMode.aidl – Android Code Search より
/** The spatializer supports binaural mode (over headphones type devices). */
SPATIALIZER_BINAURAL = 0,
/** The spatializer supports transaural mode (over speaker type devices). */
SPATIALIZER_TRANSAURAL = 1,
このうち、トランスオーラルモードへの対応は必須ではない。
スピーカーでのレンダリング
スピーカーでのオーディオの空間化(トランスオーラル モード)のサポートは必須ではありません。
高品質の空間オーディオとヘッド トラッキングの実装 | Android オープンソース プロジェクト | Android Open Source Project
トランスオーラルモードはそもそもモノラルスピーカーでは実現できないが、ステレオスピーカーであっても対応する必要はないようだ。現に、Pixel 6、6 Pro、7、7 Pro はステレオスピーカー搭載だが、トランスオーラルモードには対応していない。
persist.vendor.audio.spatializer.speaker_enabled
は、トランスオーラルモードに対応しているかどうかを示す、恐らく Pixel 独自の項目。
トランスオーラルモードに対応している Pixel Fold ではこの値が true
になっており、非対応の Pixel ではこの定義は存在しない。
Android 14 QPR1 Beta 1 の Pixel Tablet では、以下の定義が追加されていた。
persist.vendor.audio.spatializer.speaker_enabled=true
このことから、Pixel Tablet はトランスオーラルモードに対応しているということがわかる。
なお、Pixel Fold には以下の定義が存在しているが、Pixel Tablet では見当たらなかった。
ro.audio.spatializer_transaural_enabled_default=false
おそらくトランスオーラルモードのオン / オフ設定のデフォルト値だと思われるが、なぜこれが Pixel Fold にはあって Pixel Tablet にないのかは不明。
関連するソースコード (AudioService.java) を読むと、上記フラグのバイノーラル版 (ro.audio.spatializer_binaural_enabled_default
) も用意されているようだが、これが定義されている端末は Pixel シリーズでもそれ以外でも見かけたことがない。
final boolean binauralEnabledDefault = SystemProperties.getBoolean(
"ro.audio.spatializer_binaural_enabled_default", true);
final boolean transauralEnabledDefault = SystemProperties.getBoolean(
"ro.audio.spatializer_transaural_enabled_default", true);
ro.vendor.dolby.dax.version
DAX は Dolby Audio Experience の略で、Android 端末や Windows PC に “Dolby Atmos” や “Dolby Audio” などのブランドで搭載されている音響技術の総称。
かつて存在していた携帯電話向け音響技術パッケージの Dolby Mobile や、Windows PC 向け音響技術パッケージの Dolby PC Entertainment Experience (PCEE) の後継的な存在である。そのため、Dolby Audio Experience には Dolby Atmos や Dolby Audio の再生機能以外にも、内蔵スピーカーの音質改善や音源ごとの音量調整などのエフェクトも含まれている。
Dolby Audio Experience は現状 Dolby Surround (DS1)、Dolby Audio X2 (DAX2)、Dolby Audio X3 (DAX3) の3世代が存在し、内包されている機能別に Dolby Atmos や Dolby Audio などのエディションが存在する。
ここで言う Dolby Surround (DS1) は、VHS や LaserDisc 等で使用されていたマトリックスエンコード / デコードの方式 (民生用 Dolby Stereo) のことではないし、Dolby Atmos 対応の AV アンプやサウンドバーに搭載されているアップミキサー (Dolby Surround Upmixer とも) のことでもない。
それぞれの違い (Android 版のみ) の詳細は下記の表を参照。なお、この表は公式なものではなく、個人的に調査・検証した結果であり、不正確な情報が含まれている可能性がある。後日、もう少し詳しい記事を執筆予定。
技術名称・略称 | ブランド | 登場時期 (把握分のみ) |
デコーダー | ポストプロセッシング | Android 13〜の 空間オーディオ |
|||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
Unified Decoder Converter (UDC) (DDPlus Unified Decoder Simulation) |
Dolby AC-4 decoder |
Dolby TrueHD (MLP FBA) |
Dolby Audio Processing (DAP) | |||||||||
Dolby Digital (AC-3) ~5.1ch |
Dolby Digital Plus (E-AC-3) ~7.1ch |
Dolby Digital Plus JOC (E-AC-3 JOC) Dolby Atmos |
Dolby AC-4 Immersive Stereo (AC-4 IMS) Dolby Atmos |
基本機能 | 追加機能 | 新機能 (Android 11〜) | ||||||
ステレオ ワイドニング & リバーブを 除去 |
Dolby Head Tracking |
|||||||||||
Dolby Audio X3 (DAX3) | Dolby Atmos | 2018/03~現在 | ◯ | ◯ | ◯ | ◯ | – | ◯ | ◯ | ◯ | 任意 | 任意 |
Dolby Audio | 2022/09~現在 | ◯ | ◯ | 5.1ch ~ 7.1ch ダウンミックス |
– | – | ◯ | – | ◯ | 任意 | 任意 | |
Dolby Audio X2 (DAX2) | Dolby Atmos | 2014/09~2018/09 | ◯ | ◯ | ◯ | – | – | ◯ | ◯ | – | – | – |
Dolby Surround (DS1) | Dolby Audio | 2014/02~2021/10 | ◯ | ◯ | 5.1ch ~ 7.1ch ダウンミックス |
– | – | ◯ | – | – | – | – |
Dolby Digital Plus | 2012/09~2014/11 | ◯ | ◯ | 5.1ch ~ 7.1ch ダウンミックス |
– | – | ◯ | – | – | – | – | |
Dolby Processing | 2015/05~2015/12 | – | – | – | – | – | ◯ | – | – | – | – | |
Dolby Audio (UDC 非搭載版) |
2014/05~2014/11 | – | – | – | – | – | ◯ | – | – | – | – |
Android 向け Dolby Surround のバージョンは DS1 (Android 8.x 以降) あるいは DAX1 (Android 7.x 以前) から始まり、Dolby Audio X2 のバージョンは DAX2 から始まり、Dolby Audio X3 のバージョンは DAX3 から始まる。
詳細:
Android 14 QPR1 Beta 1 の Pixel Tablet では、以下の定義が追加されている。
ro.vendor.dolby.dax.version=DAX3_G_3.7.3.0_r1
このことから、Dolby Audio X3 を搭載していることがわかる。Pixel Tablet に限らず、Pixel シリーズでは空間オーディオの音声の処理には Dolby Audio X3 を使用している。
Pixel が Dolby Audio X3 を搭載しだしたのは、Pixel シリーズ (当時は Pixel 6 / 6 Pro) に初めて空間オーディオが実装された Android 13 QPR1 Beta 1 のタイミングである。また、Dolby Audio X3 を搭載している Pixel は、空間オーディオ対応機種のみとなっている。
そして、Pixel において Dolby Audio X3 は空間オーディオの再生にのみ使用されており、先程述べたようなオーディオエフェクト (上記の表の Dolby Audio Processing の大半の機能) をステレオ音声に適用したりといったことはできない。
これらの理由から、Pixel Tablet が Dolby Audio X3 を搭載したのは、空間オーディオに対応するためであるということが分かる。
Pixel 5a (5G)、6a、7a が空間オーディオに対応していないのは、Dolby Audio X3 のライセンス費用的な理由だと思われる。なぜ Pixel Tablet が後から対応するようになったのかは不明。
「はじめに」でも書いたように、Android の空間オーディオには Dolby Audio X3 が付属しているわけではないし、かと言って空間オーディオに対応するには必ずしも Dolby Audio X3 を搭載しないといけないわけでもない。
例えば Xperia 1 V や 5 V は Dolby Audio X3 を搭載しているが、空間オーディオの実装は 360 Reality Audio 側でのみ行われているし、一部の Xiaomi 端末 (国内で発売されているものだと Xiaomi 13T と 13T Pro) は Dolby Audio X3 の空間オーディオを実装しつつ、独自の空間オーディオも実装している。
Android の空間オーディオでは、どこの誰が音声の処理をしているのかを気にすることなく、標準 API で様々な連携が行えるというところが特徴である。
audio.spatializer.effect.util_clamp_min
Android 14 QPR1 Beta 1 の Pixel Tablet では、以下の定義が追加されている。
audio.spatializer.effect.util_clamp_min=300
Pixel Tablet に限らず、空間オーディオ対応の Pixel にはこの定義があるが、正直何のパラメーターなのかは不明。(時間の設定であることは分かるが…)
この定義のコメントには optimize spatializer effect としか書かれていない。
device-felix.mk – Android Code Search より (felix は Pixel Fold のコードネームだが、他機種でも同様の記述あり)
# optimize spatializer effect PRODUCT_PROPERTY_OVERRIDES += \ audio.spatializer.effect.util_clamp_min=300
audio_policy_configuration.xml
これは、おそらく音声入出力関連のファイルだと思われる。Android の空間オーディオに対応している場合、このファイルに空間オーディオ用の出力が記載されている。
2. 次のように、
audio_policy_configuration.xml
で空間オーディオ ミックス専用の出力を宣言します。空間オーディオとヘッド トラッキング | Android オープンソース プロジェクト | Android Open Source Project<audioPolicyConfiguration> <modules> <module> <mixPorts> <mixPort name="spatializer" role="source" flags="AUDIO_OUTPUT_FLAG_SPATIALIZER"> <profile name="sa" format="AUDIO_FORMAT_PCM_FLOAT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
Android 14 QPR1 Beta 1 の Pixel Tablet では /vendor/etc/audio_policy_configuration.xml に以下の記述が追加されている。
<mixPort name="immersive_out" role="source" flags="AUDIO_OUTPUT_FLAG_SPATIALIZER">
<profile name="" format="AUDIO_FORMAT_PCM_32_BIT"
samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
</mixPort>
例とは表記が異なるものの、audio_policy_configuration.xml からも空間オーディオに対応しているということが分かる。
上記の他にも、何箇所か変更されている。
Bluetooth の A2DP プロファイルのコーデックは、従来は AAC (AUDIO_FORMAT_AAC
) と SBC (AUDIO_FORMAT_SBC
) だけだったが、新たにヘッドトラッキング用の Opus (AUDIO_FORMAT_OPUS
) が追加されている。
<devicePort tagName="BT A2DP Out" type="AUDIO_DEVICE_OUT_BLUETOOTH_A2DP" role="sink"
encodedFormats="AUDIO_FORMAT_OPUS AUDIO_FORMAT_AAC AUDIO_FORMAT_SBC">
<profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
samplingRates="44100 48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
</devicePort>
/vendor/build.prop の persist.bluetooth.a2dp_offload.cap
にあった aptX、aptX HD、LDAC はここでは確認できない。
上記では tagName="BT A2DP Out"
のみ抜粋したが、tagName="BT A2DP Headphones"
と tagName="BT A2DP Speaker"
にも同様の定義が存在している。
以下の出力先に、immersive_out
が追加されている。
Speaker
BT A2DP Out
BT A2DP Headphones
BT A2DP Speaker
USB Device Out
USB Dock
USB Headset Out
<route type="mix" sink="Speaker"
sources="primary output,deep buffer,raw,compressed_offload,mmap_no_irq_out,voip_rx,ultrasound output,immersive_out"/>
<route type="mix" sink="Speaker Safe"
sources="primary output,deep buffer,raw,compressed_offload,mmap_no_irq_out,voip_rx,ultrasound output"/>
<route type="mix" sink="BT A2DP Out"
sources="primary output,deep buffer,compressed_offload,voip_rx,raw,mmap_no_irq_out,immersive_out"/>
<route type="mix" sink="BT A2DP Headphones"
sources="primary output,deep buffer,compressed_offload,voip_rx,raw,mmap_no_irq_out,immersive_out"/>
<route type="mix" sink="BT A2DP Speaker"
sources="primary output,deep buffer,compressed_offload,voip_rx,raw,mmap_no_irq_out,immersive_out"/>
<route type="mix" sink="USB Device Out"
sources="primary output,deep buffer,raw,compressed_offload,mmap_no_irq_out,voip_rx,hifi_playback,immersive_out"/>
<route type="mix" sink="USB Dock"
sources="primary output,deep buffer,compressed_offload,mmap_no_irq_out,voip_rx"/>
<route type="mix" sink="USB Headset Out"
sources="primary output,deep buffer,raw,compressed_offload,mmap_no_irq_out,voip_rx,hifi_playback,immersive_out"/>
<route type="mix" sink="BT SCO"
sources="primary output,deep buffer,compressed_offload,voip_rx,raw,mmap_no_irq_out"/>
<route type="mix" sink="BT SCO Headset"
sources="primary output,deep buffer,compressed_offload,voip_rx,raw,mmap_no_irq_out"/>
<route type="mix" sink="BT SCO Car Kit"
sources="primary output,deep buffer,compressed_offload,voip_rx,raw,mmap_no_irq_out"/>
ここでもトランスオーラルモードに対応していることが分かる。
このうち、USB Dock
は Pixel Tablet にしか存在していない 出力先であるため、付属の充電スピーカー ホルダーのことを指している可能性がある (USB 接続ではなくポゴピンだが)。
/vendor/etc/audio_policy_configuration_a2dp_offload_disabled.xml にもこれらと同様の記述変更が見られた。
audio_platform_configuration.xml
先程のファイルと名前が似ているが、こちらは policy ではなく platform。こちらも音声入出力に関連するファイルのようだ。
Android 14 QPR1 Beta 1 の Pixel Tablet では /vendor/etc/audio_platform_configuration.xml にも空間オーディオ絡みでいくつか追記されている。
<usecase_attr>
<!-- for output with flag AUDIO_OUTPUT_SPATIALIZER -->
<usecase id="UC_IMMERSIVE_PLAYBACK" dev1="3" dyn_path="true" dsp_vol="false" mmap="false" period="10" period_num="3"/>
</usecase_attr>
<dsp_latency>
<usecase id="UC_IMMERSIVE_PLAYBACK" type="playback">
<be_cfg be_id="OUT_A2DP_BE_CFG" latency="100000"/>
</usecase>
</dsp_latency>
<xlate_id>
<item component="TUNING_COMPONENT_STEREO_SPATIALIZER" id="26"/>
</xlate_id>
<external_module>
<module libname="audio_waves_aoc.so" argu="Sink=SPK:1,USB_DOCK:4,USB_HP:4 Extensions=StereoSpatializer"/>
</external_module>
正直空間オーディオに対応したということぐらいしかわからない。
audio_effects.xml
これは、端末が対応しているオーディオエフェクトが記載されているファイルである。Android の空間オーディオに対応している場合、ここに Spatializer エフェクトが登録されている。
3. 次のように、
audio_effects.xml
で Spatializer エフェクト ライブラリを宣言します。空間オーディオとヘッド トラッキング | Android オープンソース プロジェクト | Android Open Source Project<audio_effects_conf> <libraries> <library name="spatializer_lib" path="libMySpatializer.so"/> … </libraries> <effects> <effect name="spatializer" library="spatializer_lib" uuid="myunique-uuid-formy-spatializereffect"/>
Android 14 QPR1 Beta 1 の Pixel Tablet では /vendor/etc/audio_effects.xml に以下の記述が追加されている。
<libraries>
<library name="spatializer" path="libspatialaudio.so"/>
</libraries>
<effects>
<effect name="spatializer" library="spatializer" uuid="cc4677de-ff72-11eb-9a03-0242ac130003"/>
</effects>
audio_effects.xml からも、空間オーディオに対応しているということが分かる。なお、audio_effects.xml の記述は空間オーディオの実装により異なる。
media_codecs_dolby_c2.xml
media_codecs*.xml は、端末が対応しているコーデックが記載されているファイル。最近は一つのファイルに全てのコーデックが記載されることは少なく、複数のファイルに分けて記載されていることが多い。
media_codecs_dolby_c2.xml は、Codec 2.0 で実装された Dolby の音声デコーダーについて記載されているファイル。これによると、Android 14 QPR1 Beta 1 の Pixel Tablet の Dolby 関連の音声仕様は以下の通り。
- Dolby Digital (AC-3): 5.1ch まで対応
- Dolby Digital Plus (E-AC-3): 7.1ch まで対応
- Dolby AC-4: 非対応
これは他の空間オーディオ対応 Pixel と共通の仕様。
Pixel シリーズは「Dolby 〇〇 対応」と謳ってはいないが、あえて呼ぶとするならば「Dolby Audio 対応」と呼ぶのが適切。Dolby Audio は、Dolby Atmos には対応していないものの、何かしらの Dolby の音響技術を採用している製品や音声等に付与されるブランドである。
Dolby Audio が指すものは幅広い上、Android の Dolby Audio でも中身は Dolby Surround (DS1) の場合もあるため、個人的に Android の Dolby Audio のことは「Dolby Audio (DS1)」や「Dolby Audio (DAX3)」と呼んでいる。
むしろ、Dolby Audio 仕様の Dolby Audio X3 の搭載を確認しているのは Pixel シリーズのみであり、先程「Pixel の Dolby Audio X3 はデコーダー周りが特殊」と言ったのは、そのためである。
同様に、Dolby Atmos も色々な箇所でそのブランドが使用されているため、Android の Dolby Atmos は個人的に「Dolby Atmos (DAX2)」「Dolby Atmos (DAX3)」と呼ぶことが多い。
なお、空間オーディオ対応の Pixel シリーズは Dolby Atmos のライセンスはないが、Dolby Digital Plus (E-AC-3) デコーダーを持っているため、Dolby Digital Plus による Dolby Atmos (E-AC-3 JOC) は 5.1ch ~ 7.1ch ダウンミックスで再生できるはずである。
だが、Pixel 6 / 6 Pro に最初に空間オーディオが実装された Android 13 QPR1 Beta 1 から現在最新の Android 14 QPR2 Beta 3 に至るまで、Dolby Atmos (E-AC-3 JOC) を再生するとエラーになるという不具合がずっと続いている。Google に不具合報告して受理されているが、一向に治る気配がない。
Android の空間オーディオを Dolby Audio X3 で実装している端末において、空間オーディオとして扱える音声フォーマットは Dolby Atmos や Dolby Audio だけなのかというと、実はそうではない。同様に、Xperia のように 360 Reality Audio で実装している場合でも、360 Reality Audio Music Format だけというわけではない。
確かに、従来の Dolby Audio X3 や 360 Reality Audio 等では、サラウンド / イマーシブサウンドとして扱えるのは自らのフォーマットのみで、AAC 等のマルチチャンネル音声は 2.0ch ダウンミックスされた後の音声をアップミックスしたりしているだけだった。(ごく一部の特殊な例外 を除く)
今まではデコーダーとバーチャライザーが紐づいていたためこのようなことになっていたが、Android の空間オーディオではそれらが分離されたことによって、バーチャライザーだけを様々なフォーマットに対して使用することが可能になった。
新しいモデルでは、スペーシャライザーはオーディオ フレームワークの一部であり、デコーダーから分離されています。 Spatializer は混合オーディオ コンテンツを取り込み、ステレオ ストリームをオーディオ HAL にレンダリングします。 Spatializer をデコーダーから切り離すことで、OEM はデコーダーと Spatializer に異なるベンダーを選択し、ヘッド トラッキングに必要なラウンドトリップ レイテンシーを実現できます。この新しいモデルには、ヘッド トラッキング用のセンサー フレームワークへのフックも含まれています。
空間オーディオとヘッド トラッキング | Android オープンソース プロジェクト | Android Open Source Project
Android の空間オーディオに対応した端末は、最低限 AAC とリニア PCM の 5.1ch 音声はバーチャライズできるようになっている。
オーディオ形式
空間オーディオが有効であり、レンダリング デバイスが有線または Bluetooth ヘッドセットである場合、次のオーディオ形式はスペイシャライザー エフェクトでレンダリングされなければなりません。
- AAC、5.1 チャンネル
- Raw PCM、5.1 チャンネル
優れたユーザー エクスペリエンスを実現するために、次の形式 / チャンネル構成をサポートすることを強くおすすめします。
高品質の空間オーディオとヘッド トラッキングの実装 | Android オープンソース プロジェクト | Android Open Source Project
- ドルビー デジタル プラス
- 5.1.2、7.1、7.1.2、7.1.4 チャンネル
この他、FLAC や Opus 等に関しても、端末のデコーダーがマルチチャンネルに対応していればバーチャライズすることも可能。
Android の空間オーディオまとめ
- OS 標準で特定の空間オーディオのフォーマットに対応するわけではない
- どのフォーマットに対応し、どこのバーチャライザーやヘッドトラッカーを搭載するかはメーカー次第
- リニア PCM や AAC 等のマルチチャンネル音声もバーチャライズ可能
- 複数のバーチャライザーを共存することも可能
- どのような実装であっても Android 標準 API が利用可能
- システムレベルでのヘッドトラッキングの低遅延化
- ヘッドトラッキングのメーカー / ブランド縛りからの開放
Pixel の空間オーディオまとめ
- 空間オーディオの実装には Dolby Audio X3 (DAX3) を採用
- AAC 5.1ch や リニア PCM 5.1ch の他、最大 5.1ch までの Dolby Digital、最大 7.1ch までの Dolby Digital Plus に対応
- Dolby Atmos (E-AC-3 JOC) は不具合により再生不可
- ヘッドトラッキング対応
- Opus による低遅延なヘッドトラッキングも対応
- Pixel Fold、Pixel Tablet は内蔵スピーカーでの空間オーディオ (トランスオーラルモード) にも対応
(参考) dumpsys audio の空間オーディオ関係部分
Pixel 6、内蔵スピーカー (空間オーディオ利用不可)
Spatial audio: mHasSpatializerEffect:true (effect present) isSpatializerEnabled:false (routing dependent) SpatializerHelper: mState:3 mSpatLevel:0 mCapableSpatLevel:1 mIsHeadTrackingSupported:true supported head tracking modes:HEAD_TRACKING_MODE_RELATIVE_WORLD mDesiredHeadTrackingMode:HEAD_TRACKING_MODE_RELATIVE_WORLD mActualHeadTrackingMode:HEAD_TRACKING_MODE_DISABLED headtracker available:false supports binaural:true / transaural:false mSpatOutput:0
Pixel 8 Pro、内蔵スピーカー (空間オーディオ利用不可)
Spatial audio: mHasSpatializerEffect:true (effect present) isSpatializerEnabled:false (routing dependent) SpatializerHelper: mState:3 mSpatLevel:0 mCapableSpatLevel:1 mIsHeadTrackingSupported:true supported head tracking modes:HEAD_TRACKING_MODE_RELATIVE_WORLD mDesiredHeadTrackingMode:HEAD_TRACKING_MODE_RELATIVE_WORLD mActualHeadTrackingMode:HEAD_TRACKING_MODE_DISABLED headtracker available:false supports binaural:true / transaural:false mSpatOutput:0
Pixel 6 + Pixel Buds Pro (空間オーディオ:オン、ヘッドトラッキング:オン)
Spatial audio: mHasSpatializerEffect:true (effect present) isSpatializerEnabled:true (routing dependent) SpatializerHelper: mState:5 mSpatLevel:1 mCapableSpatLevel:1 mIsHeadTrackingSupported:true supported head tracking modes:HEAD_TRACKING_MODE_RELATIVE_WORLD mDesiredHeadTrackingMode:HEAD_TRACKING_MODE_RELATIVE_WORLD mActualHeadTrackingMode:HEAD_TRACKING_MODE_DISABLED headtracker available:true supports binaural:true / transaural:false mSpatOutput:141
Pixel 8 Pro + Pixel Buds Pro (空間オーディオ:オン、ヘッドトラッキング:オン)
Spatial audio: mHasSpatializerEffect:true (effect present) isSpatializerEnabled:true (routing dependent) SpatializerHelper: mState:5 mSpatLevel:1 mCapableSpatLevel:1 mIsHeadTrackingSupported:true supported head tracking modes:HEAD_TRACKING_MODE_RELATIVE_WORLD mDesiredHeadTrackingMode:HEAD_TRACKING_MODE_RELATIVE_WORLD mActualHeadTrackingMode:HEAD_TRACKING_MODE_DISABLED headtracker available:true supports binaural:true / transaural:false mSpatOutput:213