オーディオ エフェクト

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)
  • 指定する AudioSessionAudioSessionConsts.DEVICE である必要があります。
  • sessionAudioSessionConsts.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 の間で調整が必要な場合に実装で使用できます。