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.h
の DeviceTypeSet
という名前のクラスが使用されます(audio_devices_t
の std::set
コンテナ)。このクラスは、ベンダーが利用可能な libaudiofoundation
ライブラリで宣言されています。C コードで複数のオーディオ デバイスタイプを表すには、audio_devices_t
の配列またはリストを使用できます。
単一のデバイスタイプが指定されたカテゴリに属するかどうかを確認するには、/system/media/audio/include/system/audio.h
のヘルパー関数 audio_is_.*_device
を使用します。複数のオーディオ デバイスタイプの場合は、libaudiofoundation
のヘルパー関数を使用します。たとえば、特定のオーディオ デバイスタイプがすべて同じタイプであるかどうかを確認するには、AudioContainers.h
の areAllOfSameDeviceType (DeviceTypeSet, std::function
を使用します。
実装
OEM は、オーディオ デバイスタイプのビットフィールド表現をオーディオ HAL 実装から削除する必要があります。
- ビット フィールドに割り当てられたデバイスのストレージをすべて削除します。
複数のオーディオ デバイスタイプを表すのに
audio_devices_t
を使用しないでください。代わりに、リストまたはベクトルを使用してください。 - デバイスタイプの比較にビット演算を使用するのをやめてください。
Android 11 より前では、オーディオ デバイスタイプをビットフィールドとして使用できます。その場合、デバイスタイプの比較にビット演算を使用するのが一般的です。列挙型の新しいオーディオ デバイスタイプを追加すると、ビット演算によって予期しない結果が生じることがあるため、代わりにヘルパー関数を使用してください。オーディオ デバイスタイプが 1 つしかない場合は、直接比較により 2 つの値を比較します。オーディオ デバイスタイプが指定されたカテゴリに属しているかどうかを確認するには、
/system/media/audio/include/system/audio.h
のヘルパー関数を使用します。たとえば、audio_is_output_device(audio_devices_t device)
です。 - オーディオ デバイスタイプのグループに対して事前定義済みの値を使用するのをやめてください。
system/media/audio/include/system/audio-base-utils.h
には、オーディオ デバイスタイプのグループ(AUDIO_DEVICE_OUT_ALL
)に対して事前定義済みの値がいくつかあります。これらの値はすべて予約されていますが、新しい列挙型オーディオ デバイスタイプが追加されると正しくない値になるため、非推奨となる可能性があります。audio-base-utils.h
には、オーディオ デバイスタイプの新しいグループが定義されています。これはAUDIO_DEVICE_OUT_ALL_ARRAY
などのオーディオ デバイスタイプの配列です。 - ルーティングには、
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 ファイルで確認できます。