カーオーディオ サービスは Core Audio 動的オーディオ ポリシーを使用して車両のユースケースをサポートします。
各同乗者別のオーディオの再生。マルチゾーン オーディオ マルチゾーン オーディオと呼ばれ、各ゾーンで同時にサウンドを再生できます。
動的オーディオ ゾーン構成
同乗者プライマリ ゾーン オーディオ キャスト。
同乗者のオーディオ ミラーリング。
各ユースケースで、カーオーディオ サービスは動的オーディオ ポリシーを使用して、自動的にオーディオを指定された出力デバイスにルーティングします。
マルチゾーン オーディオ
マルチゾーン オーディオでは、複数のユーザーが同時に AAOS を操作できます。出力デバイスのセットはゾーンに関連付けられ、各ゾーンが音声フォーカスと音量レベルを管理します。同乗者は自分のオーディオを聞ける一方で、ドライバーはプライマリ ゾーン(通常メインのキャビン)で別のソースを聞けます。
マルチゾーン オーディオ アーキテクチャ
図 1. カーオーディオ サービス アーキテクチャ
カーオーディオ ゾーンはオーディオ出力、音声フォーカス、その他のオーディオ設定の抽象化であり、すべてを個別に管理できます。ルーティングのため、各ゾーンはオーディオ ポリシー構成で指定されたオーディオ出力バスデバイスのセットとして定義されます。デバイスは各オーディオ ゾーン定義ごとに異なります。図 1 では、バスデバイス 1 から 5 はゾーン 0、バスデバイス 6 から 8 はゾーン 1、バスデバイス 9 から 11 はゾーン 2 に属しています。
カーオーディオ構成
通常、出力デバイスは 1 つのオーディオ ゾーンに割り当てられます。各オーディオ ゾーンは car_audio_configuration.xml
で定義されます。次のコード スニペットは図 1 のカーオーディオ構成を示しています。
<carAudioConfiguration version="3">
<zones>
<zone name="Zone0" audioZneId="0" occupantZoneId="0">
<zoneConfigs>
<zoneConfig name="config0" isDefault="true">
<volumeGoups>
<group>
<device address="bus_1">
<context context="music"/>
</device>
</group>
<group>
<device address="bus_2">
<context context="navigation"/>
</device>
</group>
...
</volumeGroups>
</zoneConfig>
</zoneConfigs>
</zone>
<zone name="Zone1" audioZoneId="1" occupantZoneId="1">
<zoneConfigs>
<zoneConfig name="config0" isDefault="true">
<volumeGroups>
<group>
<device address="bus_6">
<context context="music"/>
</device>
</group>
<group>
<device address="bus_7">
<context context="navigation"/>
</device>
</group>
...
</volumeGroups>
</zoneConfig>
</zoneConfigs>
</zone>
...
...
</zones>
</carAudioConfiguration>
occupantZoneId
は CarOccupantZoneManager
で管理される車のサービス定義です。車内にいるユーザーの特定の座席へのマッピングを定義するために使用されます。CarOccupantZoneService
もまた、ユーザーがディスプレイにログイン後、乗員ゾーンとディスプレイ、その他の周辺機器、ユーザーとのマッピングを定義します。オーディオ ゾーンには次のものが含まれます。
オーディオ ゾーン ID と乗員ゾーン ID。
- オーディオ ゾーンを乗員ゾーン(座席、ディスプレイ、その他の周辺機器)にマッピングします。
- ログイン時にどのユーザー ID をオーディオ ゾーンに割り当てるかをマッピングします。
オーディオ構成のリスト。各オーディオ構成には音量グループのセットがあります。各音量グループにはオーディオ バスデバイスのセットがあります。
音量が変更されると、グループ内のすべてのオーディオ機器は同じようにコントロールされます。
各オーディオ機器はオーディオ属性のリストに割り当てられます。この情報を使用して、個別に割り当てられたオーディオ属性のオーディオ ポリシー ミックスを構築します。
この構成により、異なるオーディオ属性の用途が各ゾーンの別の出力デバイスにルーティングされるようになります。ユースケースに応じて、異なるサウンドを同時に再生できます。たとえば、メディア サウンドはすべてのスピーカーで再生し、ナビゲーション サウンドはドライバーに最も近いスピーカーでのみ再生するように、メインのキャビン(プライマリ ゾーン)を設定できます。サウンドが同時再生されると、メインのキャビンではメディアを引き続き聞きながら、ナビゲーションはドライバーに届きます。
マルチゾーン オーディオの同乗者ログイン ワークフロー
以下のシーケンス図は、同乗者がそれぞれのディスプレイにログインした際に、オーディオ ルーティングを有効にするフローを示しています。
図 2.
このシーケンスでは、ユーザー ログインは乗員ゾーンサービス経由でカーオーディオ サービスに伝播されます。
特定のオーディオ ゾーンのカーオーディオ サービスは
AudioPolicy#removeUserIdDeviceAffinity
API を使用して、ユーザー デバイス アフィニティを削除します。この API はユーザー ID を取ります。この場合は以前のゾーンのユーザーです。AudioPolicy#setUserIdDeviceAffinity
API は新しいユーザーをゾーンに割り当て、特定のゾーン構成のユーザー ID とすべてのデバイスを使用します。
動的ゾーン構成
Android 14 では動的ゾーン構成を導入し、OEM が同乗者のさまざまなデバイスセットを設定できるようにしています。これにより、たとえばリアシートの同乗者がリアシートのヘッドレスト スピーカーとリアシートのヘッドフォン周辺機器を切り替えられます。
この場合、2 つの構成が必要となります。リアシートのヘッドレストの構成とヘッドフォン周辺機器の構成がそれぞれ必要です。特定のユーザーのオーディオは同時に 1 つの構成にのみルーティングされます。
図 3. 動的ゾーン構成ワークフロー
図 3 は動的ゾーン構成ワークフローのアーキテクチャを示しています。オーディオ ゾーン 1 には Config 0
と Config 1
という 2 つの構成が含まれます。これらはそれぞれ出力デバイス スピーカーとヘッドレストに関連付けられています。
ログインをすると、ユーザーは自動的にデフォルトの構成に割り当てられます。ユーザーが構成の変更を選択すると、通常はシステム UI 経由で、カーオーディオ サービスが 2 つの構成の切り替えを行います。このようにして、出力デバイスは Z1 スピーカーと Z1 ヘッドセットの間で切り替えられます。
以下のコード スニペットはこの動的ゾーン構成のセットアップを示しています。
<carAudioConfiguration version="3">
<zones>
<zone name="Zone1" audioZoneId="1" occupantZoneId="1">
<zoneConfigs>
<zoneConfig name="Zone 1 Config 0" isDefault="true">
<volumeGroups>
<group>
<device address="bus_100">
<context context="music"/>
***
</device>
</group>
</volumeGroups>
</zoneConfig>
<zoneConfig name="Zone 1 Config 1">
<volumeGroups>
<group>
<device address="bus_101">
<context context="music"/>
***
</device>
</group>
</volumeGroups>
</zoneConfig>
</zoneConfigs>
</zone>
</zones>
オーディオ構成管理をサポートするため、カーオーディオ マネージャーは API を公開して、構成を管理します。
- ゾーンで利用可能なクエリ構成。
- ゾーンの構成が現在設定されているクエリ。
- 別の構成への切り替え。
図 4 で示すとおり、システム UI アプリまたはサービスはこれらの API を使用して、オーディオ ゾーンの構成を管理します。クエリ API は同乗者に 2 つを表示します。ユーザーは希望する構成のコマンドをタップして、別の構成を選択できます。
図 4. 動的ゾーン構成ワークフロー
プライマリ ゾーンの同乗者オーディオ キャスト
プライマリ ゾーンの同乗者オーディオ キャストは Android 14 で導入された機能で、同乗者が自分のメディア オーディオをプライマリ ゾーンでキャストできます。この方法では、同乗者のメディア オーディオがメインのキャビンにキャストされる一方、ドライバーによるフル コントロールを維持できます。
以下の図はプライマリ ゾーンの同乗者メディア オーディオ キャストのアーキテクチャを簡略化して示したものです。
図 5. 動的ゾーン構成ワークフロー
画像では、ドライバーのメディア出力デバイスが同乗者と共有されています。これは同乗者がプライマリ ゾーン モードにキャストしている場合のみ発生します。動的オーディオ ポリシーもドライバーのオーディオ ルーティングの管理に使用されますが、変更はドライバーのデバイス アフィニティには適用されません。同乗者の場合、出力デバイスのリストは次のように変更されます。
- 同乗者のメディア出力デバイスはデバイスのリストから削除されます。
- ドライバーのメディア出力デバイスがデバイスのリストに追加されます。
- 同乗者オーディオ ゾーンのそれ以外の出力デバイスはデバイスのリストに残ります。
この新しいデバイスのリストが AudioPolicy#setUserIdDeviceAffinity
API により同乗者に割り当てられます。API に渡されるパラメータはデバイスのリストと同乗者のユーザー ID です。オーディオ システムのオーディオ ポリシー サービスが、同乗者に関連付けられたメディア トラックで選択するオーディオ ミックスをクエリすると、プライマリ ゾーンに関連付けられたメディア オーディオ ミックスが選択されます。
プライマリ ゾーンのオーディオ キャストにおける主な要件は、プライマリ ゾーンのメディア出力デバイスを他のオーディオ属性の用途と分離することです。分離しないと、オーディオ ミックスの構築時に、他のオーディオ属性がミックスに追加されます。ミックスの選択がオーディオ システムで実行されると、ミックスにアタッチされたすべてのサウンドが、メインのキャビンでの再生で選択されます。
同乗者ゾーンのオーディオ ミラーリング
オーディオ ミラーリング機能を使って、同乗者はオーディオを共有できます。ミラーリング機能は各オーディオ ゾーンのオーディオ データを複製して、すべての同乗者が同じオーディオを聞けるようにします。この場合、音声フォーカスはオーディオ ミラーリングに関与している同乗者と共有されます。
オーディオ ミラーリングのルーティング
オーディオ ミラーリングを有効にするには、同乗者が 2 名以上必要です。そのため、少なくとも 2 つの同乗者オーディオ ゾーンのオーディオ構成が 1 つのミラーリング出力デバイスで必要となります。上記の定義を満たすと、2 つの同時ミラーリング セッションを開始できます。
以下の図は 2 名の同乗者間のマルチゾーン オーディオ ミラーリングを簡略化して示したものです。両方の同乗者からのオーディオがオーディオ ミラーリング デバイスの bus_1000
にルーティングされます。オーディオ HAL がソースゾーンへのシグナルを複製します。
図 6. 動的ゾーン構成ワークフロー
このルーティングは同乗者がミラーリング モードの場合のみ有効になります。ミラーリング モードでない場合、オーディオ ゾーンの対応デバイスは同乗者に割り当てられます。ミラーリングが最初に同乗者で有効にされたときに、AudioPolicy#setUserIdDeviceAffinity
API がルーティングを修正します。
- 同乗者のメディア出力デバイスはデバイスのリストから削除されます。
- ミラーリング出力デバイスがデバイスのリストに追加されます。
- 同乗者オーディオ ゾーンのそれ以外の出力デバイスはデバイスのリストに残ります。
デバイスのリストを使って、API が更新されたデバイスのリストと同乗者ユーザー ID で呼び出されます。以下の画像はオーディオ ミラーリング ワークフローのシーケンス図を示しています。
図 7. オーディオ ミラーリング ワークフロー
図 7 では、カーオーディオ マネージャーのオーディオ ミラーリングを管理する API は、Media System Service から呼び出されています。具体的には、ユーザー 1 とユーザー 2 のオーディオ ミラーリングを有効にする API は CarAudioManager#enableMirrorForAudioZones
です。
上記のとおり、カーオーディオ サービスが同乗者ユーザーのオーディオ ルーティングを構成します。または、カーオーディオ サービスはシグナルをオーディオ HAL に送信して、ミラーリング デバイスから対応するゾーンへのオーディオを構成して複製します。
上記の画像では、カーオーディオ サービスは mirroring_src=bus_1000;mirroring_dest=bus_10,bus_20
を送信しています。
ここで
bus_1000
はソースバスで、bus_10
と bus_20
は送信先バスです。
シーケンス図には示されていませんが、AudioManager#setParameters
API 経由でシグナルが送信され、オーディオ サービス経由で HAL に届きます。
オーディオ ミラーリングが無効化されると、mirroring_src=bus_1000;mirroring=off
というシグナルが送信されます。このシグナルを使用して、HAL はオーディオ ミラーリングが有効でない場合に、オーディオの複製を無効にできます。オーディオ ミラーリング デバイスを定義するには、以下のスニペットで示すとおり、カーオーディオ構成ファイルに mirroringDevices
という名前のセクションを含めます。
このスニペットでは、bus_1000
と bus_2000
という 2 つのミラーリング デバイスが定義されており、4 名の同乗者がオーディオ ミラーリングを使用できます。
<carAudioConfiguration version="3">
<mirroringDevices>
<mirroringDevice address="bus_1000"/>
<mirroringDevice address="bus_2000"/>
</mirroringDevices>
<zones>
....
</zones>
</carAudioConfiguration>