自動車用オーディオの実装では、標準の Android Audio HAL に依存します。これには以下が含まれます。
IDevice
(hardware/interfaces/audio/2.0/IDevice.hal
)。入出力ストリームの作成、マスター ボリュームとミュートの処理、および次のような処理を行います。createAudioPatch
を使用してデバイス間に外部間パッチを作成します。IDevice.setAudioPortConfig()
を使用して各物理ストリームのボリュームを提供します。
IStream
(hardware/interfaces/audio/2.0/IStream.hal
)。入力と出力のバリアントとともに、オーディオ サンプルとハードウェア間のストリーミングを管理します。
車載デバイスのタイプ
次のデバイスタイプは自動車プラットフォームに関連しています。
デバイスのタイプ | 説明 |
---|---|
AUDIO_DEVICE_OUT_BUS |
Android からのプライマリ出力(これは Android からのすべてのオーディオが車両に配信される方法です)。各コンテキストのストリームを明確にするためのアドレスとして使用されます。 |
AUDIO_DEVICE_OUT_TELEPHONY_TX |
伝送のためにセル無線通信にルーティングされるオーディオに使用されます。 |
AUDIO_DEVICE_IN_BUS |
特に分類されていない入力に使用されます。 |
AUDIO_DEVICE_IN_FM_TUNER |
ブロードキャスト ラジオ入力にのみ使用されます。 |
AUDIO_DEVICE_IN_TV_TUNER |
テレビデバイスに使用されます(存在する場合)。 |
AUDIO_DEVICE_IN_LINE |
AUX 入力ジャックに使用されます。 |
AUDIO_DEVICE_IN_BLUETOOTH_A2DP |
Bluetooth 経由で受信した音楽。 |
AUDIO_DEVICE_IN_TELEPHONY_RX |
通話に関連付けられたセル無線通信から受信したオーディオに使用されます。 |
オーディオ ソースのルーティング
ほとんどのオーディオ ソースは、AudioRecord
または関連する Android メカニズムを使用してキャプチャする必要があります。その後、このデータは AudioAttributes が割り当てられ、デフォルトの Android ルーティング ロジックに依存するか、AudioRecord
または AudioTrack
オブジェクトで setPreferredDevice()
を明示的に呼び出して AndroidTrack
経由で再生されます。
外部ミキサーに対して専用のハードウェア接続があるソースやレイテンシ要件が極めて厳格なソースの場合は、createAudioPatch()
と releaseAudioPatch()
を使用して外部デバイス間のルートをアクティブ化および非アクティブ化できます(サンプルのトランスポートに AudioFlinger
は含めない)。
オーディオ デバイスの構成
Android に表示されるオーディオ デバイスは /audio_policy_configuration.xml
で定義する必要があります。これには以下のコンポーネントが含まれます。
- module name。 「primary」(自動車のユースケースに使用)、「A2DP」、「remote_submix」、「USB」をサポートします。モジュール名と対応するオーディオ ドライバは、
audio.primary.$(variant).so
にコンパイルする必要があります。 - devicePorts。 このモジュールからアクセス可能なすべての入出力デバイス(永続的に接続されているデバイスやリムーバブル デバイスを含む)のデバイス記述子のリストを含みます。
- 出力デバイスごとに、最小値 / 最大値 / デフォルト値 / ステップ値(ミリベル単位)で構成されるゲイン コントロールを定義できます(1 ミリベル = 1/100 デシベル = 1/1,000 ベル)。
devicePort
インスタンスのアドレス属性は、AUDIO_DEVICE_OUT_BUS
と同じデバイスタイプのデバイスが複数ある場合でも、デバイスの検出に使用できます。
- mixPorts。 オーディオ HAL によって公開されるすべての入出力ストリームのリストを含みます。各
mixPort
インスタンスは、AndroidAudioService
への物理ストリームと見なされます。 - routes。 入力デバイスと出力デバイス間、またはストリームとデバイス間の可能な接続のリストを定義します。
次の例では、mixer_bus0_phone_out
によってすべての Android オーディオ ストリームがミックスされる出力デバイス bus0_phone_out
を定義しています。ルートは、mixer_bus0_phone_out
から device bus0_phone_out
への出力ストリームを取得します。
<audioPolicyConfiguration version="1.0" xmlns:xi="http://www.w3.org/2001/XInclude"> <modules> <module name="primary" halVersion="3.0"> <attachedDevices> <item>bus0_phone_out</item> <defaultOutputDevice>bus0_phone_out</defaultOutputDevice> <mixPorts> <mixPort name="mixport_bus0_phone_out" role="source" flags="AUDIO_OUTPUT_FLAG_PRIMARY"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/> </mixPort> </mixPorts> <devicePorts> <devicePort tagName="bus0_phone_out" role="sink" type="AUDIO_DEVICE_OUT_BUS" address="BUS00_PHONE"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/> <gains> <gain name="" mode="AUDIO_GAIN_MODE_JOINT" minValueMB="-8400" maxValueMB="4000" defaultValueMB="0" stepValueMB="100"/> </gains> </devicePort> </devicePorts> <routes> <route type="mix" sink="bus0_phone_out" sources="mixport_bus0_phone_out"/> </routes> </module> </modules> </audioPolicyConfiguration>
devicePorts の指定
自動車プラットフォームは、Android に入出力される物理ストリームごとに devicePort
インスタンスを指定する必要があります。出力の場合、各 devicePort
インスタンスは、タイプが AUDIO_DEVICE_OUT_BUS
である必要があり、整数(バス 0、バス 1 など)でアドレス指定される必要があります。mixPort
インスタンスは、devicePort
インスタンスに対して 1 対 1 の関係で作成され、各バスにルーティングできるデータ形式の指定を許可する必要があります。
自動車の実装では、FM_TUNER
(ブロードキャスト ラジオ入力用に予約)、MIC
(マイク入力を処理するデバイス)、TYPE_AUX_LINE
(アナログライン入力を表す)を含む、複数の入力デバイスタイプを使用できます。他のすべての入力ストリームは AUDIO_DEVICE_IN_BUS
に割り当てられ、AudioManager.getDeviceList()
呼び出しでデバイスを列挙することにより検出されます。個々のソースは AudioDeviceInfo.getProductName()
で区別できます。
また、外部デバイスをポートとして定義してから、(新しい CarAudioManager
エントリ ポイントを介して公開される)Audio HAL の IDevice::createAudioPatch
メソッドでこれらのポートを使用して外部のハードウェアとやり取りできます。
バスベースのオーディオ ドライバが存在する場合は、audioUseDynamicRouting
フラグを true
に設定する必要があります。
<resources> <bool name="audioUseDynamicRouting">true</bool> </resources>
詳細については、device/generic/car/emulator/audio/overlay/packages/services/Car/service/res/values/config.xml
をご覧ください。