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() を明示的に呼び出して AudioTrack 経由で再生されます。

外部ミキサーに対して専用のハードウェア接続があるソースやレイテンシ要件が極めて厳格なソースの場合は、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 を定義しています。ルートは、device bus0_phone_out への mixer_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 をご覧ください。