デバイスタイプの上限

Android オーディオでは、audio_devices_t を使用してオーディオ デバイスのタイプを表します。これは、オーディオ ソースコードで、1 つ以上の指定されたデバイスをフィルタまたは選択するためのビットフィールドとして広く使用されています。Android 11 より前のバージョンでは、オーディオ入出力デバイスタイプ数の上限が 30 で、新しいオーディオ デバイスタイプを追加する予備のスロットがありませんでした。新しいオーディオ デバイスタイプを追加できるように、オーディオ デバイスタイプ数の上限を撤廃しました。

オーディオ デバイスタイプ数の上限を撤廃するにあたり、オーディオ デバイスタイプがビットマスクではなく列挙値になりました。

既存のすべてのオーディオ デバイスタイプはそのまま保持されます。AUDIO_DEVICE_BIT_IN は、入力デバイスと出力デバイスの識別に引き続き使用されます。新しいオーディオ デバイスタイプを追加する場合、それらは既存の値の間にあるギャップの列挙値になります。

OEM は audio_devices_t をビットマスクとして使用しないでください。新しい列挙型のオーディオ デバイスタイプを追加した際に、予期しない結果が発生する可能性があります。

例とソース

Android 11 より前では、オーディオ デバイスタイプをビットマスクとして使用する一般的な方法が 2 つありました。

  • audio_devices_t 値を使用して複数のオーディオ デバイスを表す。
  • audio_devices_t 値に、指定されたカテゴリのオーディオ デバイスタイプが含まれているかどうかを確認する。

複数のオーディオ デバイスタイプを表すために、/libaudiofoundation/include/media/AudioContainers.hDeviceTypeSet という名前のクラスが使用されます(audio_devices_tstd::set コンテナ)。このクラスは、ベンダーが利用可能な libaudiofoundation ライブラリで宣言されています。C コードで複数のオーディオ デバイスタイプを表すには、audio_devices_t の配列またはリストを使用できます。

単一のデバイスタイプが指定されたカテゴリに属するかどうかを確認するには、/system/media/audio/include/system/audio.h のヘルパー関数 audio_is_.*_device を使用します。複数のオーディオ デバイスタイプの場合は、libaudiofoundation のヘルパー関数を使用します。たとえば、特定のオーディオ デバイスタイプがすべて同じタイプであるかどうかを確認するには、AudioContainers.hareAllOfSameDeviceType (DeviceTypeSet, std::function) を使用します。

実装

OEM は、オーディオ デバイスタイプのビットフィールド表現をオーディオ HAL 実装から削除する必要があります。

  1. ビット フィールド上のデバイスのすべてのストレージを削除します。

    複数のオーディオ デバイスタイプを表すのに audio_devices_t を使用しないでください。代わりに、リストまたはベクトルを使用してください。

  2. デバイスタイプの比較にビット演算を使用するのをやめてください。

    Android 11 より前では、オーディオ デバイスタイプをビットフィールドとして使用できます。その場合、デバイスタイプの比較にビット演算を使用するのが一般的です。列挙型の新しいオーディオ デバイスタイプを追加すると、ビット演算によって予期しない結果が生じることがあるため、代わりにヘルパー関数を使用してください。オーディオ デバイスタイプが 1 つしかない場合は、直接比較により 2 つの値を比較します。オーディオ デバイスタイプが指定されたカテゴリに属しているかどうかを確認するには、/system/media/audio/include/system/audio.h のヘルパー関数を使用します。たとえば、audio_is_output_device(audio_devices_t device) です。

  3. オーディオ デバイスタイプのグループに対して事前定義済みの値を使用するのをやめてください。

    オーディオ デバイスタイプのグループには、いくつかの事前定義済みの値(system/media/audio/include/system/audio-base-utils.hAUDIO_DEVICE_OUT_ALL)があります。これらの値はすべて予約されていますが、新しい列挙型オーディオ デバイスタイプが追加されると正しくない値になるため、サポート終了となる可能性があります。audio-base-utils.h で定義されたオーディオ デバイスタイプの新しいグループがあります。これは AUDIO_DEVICE_OUT_ALL_ARRAY などのオーディオ デバイスタイプの配列です。

  4. ルーティング用に、set_parameters の代わりに create_audio_patch() メソッドと release_audio_patch() メソッドを実装します。

    set_parameters メソッドはオーディオ デバイスタイプをビットフィールドとして使用するため、新しい列挙型オーディオ デバイスタイプを追加すると、予期しない結果が生じる可能性があります。

    現在、次の 2 種類のオーディオ パッチが必要です。

    • ミックスからデバイスへのパッチ(再生用)
    • デバイスからミックスへのパッチ(録音用)

    後続のアップデートでは、デバイスからデバイスへのパッチが追加で必要となる可能性があります。

    オーディオ パッチを作成する際にパッチハンドルが指定されていない場合、オーディオ パッチを識別できる一意のパッチハンドルを生成するためにオーディオ HAL が必要です。それ以外の場合、オーディオ HAL は指定されたオーディオ パッチ ハンドルを使用してオーディオ パッチを更新する必要があります。

    以前のオーディオ HAL と AOSP HIDL ラッパーを使用している場合、以前のオーディオ HAL の HAL のメジャー バージョンを 3.0 に設定する必要があります。

    オーディオ パッチ機能を有効にするには、オーディオ HAL の HAL のメジャー バージョンを 3.0 以上に設定する必要があります。詳細については、デフォルトの HIDL 実装Device::supportsAudioPatches() をご覧ください。これは Cuttlefish のオーディオ HAL でも確認できます。

カスタマイズ

この機能をオフにしたり、オーディオ デバイスタイプを追加できるようにフレームワーク内でオーディオ デバイスのリファクタリングを元に戻したりすることはできません。

追加されたすべてのオーディオ デバイスタイプでは、単一のビットセットでデバイスタイプを表すことができるため、現在の HAL 実装は引き続き機能します。

新しいオーディオ デバイスタイプが追加され、OEM がそれらを使用したい場合は、オーディオ HAL 実装をアップグレードして HIDL バージョン 6.0 以上に移行する必要があります。set_parameters を使用してストリームをルーティングすると、新しいオーディオ デバイスタイプが追加されたときに予期しない結果が生じる可能性があるため、HAL のメジャー バージョンを 3.0 にアップグレードして create_audio_patch メソッドと release_audio_patch メソッドを実装することが必須です。

検証

OEM に必要な作業は、HAL 実装の更新です。オーディオ HAL の VTS を使用して、実装が意図したとおりに機能するか検証できます。すべてのテストは VTS ファイルで確認できます。