Automotive Audio HAL の実装

自動車用オーディオの実装では、標準の Android Audio HAL に依存します。これには以下が含まれます。

  • IDevicehardware/interfaces/audio/2.0/IDevice.hal)。入出力ストリームの作成、マスター ボリュームとミュートの処理、および次のような処理を行います。
    • createAudioPatch を使用してデバイス間に外部間パッチを作成します。
    • IDevice.setAudioPortConfig() を使用して各物理ストリームのボリュームを提供します。
  • IStreamhardware/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 インスタンスは、Android AudioService への物理ストリームと見なされます。
  • 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 をご覧ください。