Android 11以降、デバイスメーカーは、特定のオーディオデバイスがオーディオのキャプチャまたは再生用に選択されたときに、特定のオーディオエフェクトを自動的に接続して有効にすることができます。大きな改善点の1つは、オーディオHAL(入力デバイスと出力デバイス間の直接接続)の下に完全に実装されたオーディオパスに挿入されたオーディオエフェクトを、オーディオエフェクトフレームワークで制御できることです。
この機能は主に自動車OEMを対象としていますが、他のAndroidフォームファクターでも使用できます。アプリの例は、オーディオDSPを介してスピーカーに直接接続されている場合に、FMチューナー出力に音声強調効果を挿入することです。
前提条件
- その他のオーディオエフェクトと同様に、エフェクトはベンダーライブラリによって実装され、
audio_effects.xml
構成ファイルにリストされてaudio_effects.xml
必要があります。 - エフェクトは、前処理または後処理のタイプである必要があります(
TYPE_PRE_PROC
設定されたフラグTYPE_PRE_PROC
またはEffectDescriptor.flags
)。 - エフェクトの実装がハードウェアアクセラレーションされている場合(
HW_ACC_TUNNEL
フラグHW_ACC_TUNNEL
設定されているEffectDescriptor.flags
)、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とオーディオデバイス記述子を指定してエフェクトを作成した後、既存のAudioEffectAPIで有効または無効にできます。
実装が特定のデバイス/エフェクトの組み合わせをサポートしているかどうかを照会するためのAPIも利用できます。
static boolean isEffectSupportedForDevice( @NonNull UUID uuid, @NonNull AudioDeviceAttributes device);
新しいHALAPI
オーディオエフェクトHAL
オーディオエフェクトcreateEffect()
は、 createEffect()
メソッドの新しい署名があり、デバイスにアタッチされたエフェクトを作成できます。
IEffectFactory::createEffect(Uuid uid, AudioSession session, AudioIoHandle ioHandle, AudioPortHandle device)
-
AudioSession
指定がなければなりませんAudioSessionConsts.DEVICE
。 -
session
がAudioSessionConsts.DEVICE
場合、AudioIoHandle
は無視されます。 -
device
は、IDevice::createAudioPatch()
メソッドをIDevice::createAudioPatch()
してオーディオHALでデバイスが選択されたときに、オーディオフレームワークによって割り当てられた一意のAudioPortHandle
によって識別されます。
オーディオHAL
デバイスエフェクト機能をサポートするには、オーディオHALはIDevice::createAudioPatch()
APIを使用してオーディオルーティング制御を実装する必要があります。これは、 true
報告するIDevice::supportsAudioPatches()
メソッドによって示されtrue
。
2つの新しいAPIメソッドIDevice::addDeviceEffect(AudioPortHandle device, uint64_t effectId)
とIDevice::removeDeviceEffect(AudioPortHandle device, uint64_t effectId)
はIDevice::removeDeviceEffect(AudioPortHandle device, uint64_t effectId)
のデバイスでデバイス効果が有効または無効になったことをHAL実装に通知します。
デバイスは、 AudioPortHandle
IDによって識別されます。これは、 IDevice::createAudioPatch()
メソッドを使用してオーディオパッチを作成するときに使用されます。
エフェクトが有効または無効になっているときにオーディオHALとエフェクトHALの間で調整が必要な場合は、実装でオーディオHALAPIを使用できます。