Android 11 以降では、デバイス メーカーは、特定のオーディオ デバイスが音声キャプチャまたは再生用に選択されている場合、特定のオーディオ エフェクトを自動的にアタッチして有効にできます。主な改善点としては、オーディオ HAL の下に完全に実装されたオーディオパス(入力デバイスと出力デバイスの間の直接接続)に挿入されたオーディオ エフェクトを、オーディオ エフェクト フレームワークで制御できることが挙げられます。
この機能は主に自動車 OEM を対象としていますが、他の Android フォーム ファクタでも使用できます。サンプルアプリは、オーディオ DSP を介してスピーカーに直接接続されたとき、FM チューナー出力に音声強調エフェクトを挿入します。
前提条件
- その他のオーディオ エフェクトについては、ベンダー ライブラリによって実装し、
audio_effects.xml
構成ファイルにリストする必要があります。 - エフェクトのタイプは、前処理または後処理(
EffectDescriptor.flags
でフラグTYPE_PRE_PROC
またはTYPE_POST_PROC
を設定)である必要があります。 - エフェクトの実装が HW アクセラレーション(
EffectDescriptor.flags
でフラグHW_ACC_TUNNEL
を設定)の場合、HAL の下で完全に接続されたオーディオパスにアタッチできます(再生またはキャプチャ オーディオ ストリームをオーディオ HAL で開かない)。
デバイス エフェクトの作成と有効化
デバイス固有のオーディオ エフェクトは、次の 2 つの方法のいずれかを使用してインスタンス化できます。
オーディオ エフェクト構成ファイルを使用する
この方法では、シンクまたはソースとして指定したデバイスを選択して、任意のオーディオパスに体系的にアタッチして有効にするオーディオ エフェクトを静的に作成できます。
そのためには、次のように audio_effects.xml
ファイルに特定のセクションを追加します。
<deviceEffects> <devicePort type="AUDIO_DEVICE_IN_BUILTIN_MIC" address="bottom"> <apply effect="agc"/> </devicePort> </deviceEffects>
システム API を使用する
デバイス エフェクトを作成して有効にするための新しい @SystemApi コンストラクタが、android.media.audiofx.AudioEffect
クラスに追加されました。
AudioEffect(@NonNull UUID uuid, @NonNull AudioDeviceAttributes device);
一意のオーディオ エフェクト ID とオーディオ デバイス記述子を指定してエフェクトを作成した後、既存の AudioEffect API を使用してエフェクトを有効または無効にできます。
API を使用して、特定のデバイスとエフェクトの組み合わせを実装がサポートしいるかどうかを照会することもできます。
static boolean isEffectSupportedForDevice( @NonNull UUID uuid, @NonNull AudioDeviceAttributes device);
新しい HAL API
オーディオ エフェクト HAL
オーディオ エフェクト HAL V6.0 には createEffect()
メソッドの新しい署名が追加されており、デバイスにアタッチされるエフェクトを作成できます。
IEffectFactory::createEffect(Uuid uid, AudioSession session, AudioIoHandle ioHandle, AudioPortHandle device)
- 指定する
AudioSession
はAudioSessionConsts.DEVICE
である必要があります。 session
がAudioSessionConsts.DEVICE
の場合、AudioIoHandle
は無視されます。device
は、IDevice::createAudioPatch()
メソッドを使用してオーディオ HAL でデバイスが選択されたとき、オーディオ フレームワークによって割り当てられる一意のAudioPortHandle
によって識別されます。
オーディオ HAL
デバイス エフェクト機能をサポートするには、オーディオ HAL で IDevice::createAudioPatch()
API を使用して、オーディオ ルーティング コントロールを実装する必要があります。これは、true
をレポートする IDevice::supportsAudioPatches()
メソッドによって示されます。
IDevice::addDeviceEffect(AudioPortHandle device, uint64_t effectId)
と IDevice::removeDeviceEffect(AudioPortHandle device, uint64_t effectId)
という 2 つの新しい API メソッドは、特定のデバイスに対しデバイス エフェクトが有効または無効にされたことを HAL 実装に伝えます。
デバイスは、IDevice::createAudioPatch()
メソッドでオーディオ パッチを作成するときに使用される AudioPortHandle
ID によって識別されます。
オーディオ HAL API は、エフェクトを有効または無効にする際、オーディオ HAL とエフェクト HAL の間で調整が必要な場合に実装で使用できます。