Google は、黒人コミュニティに対する人種平等の促進に取り組んでいます。取り組みを見る
このページは Cloud Translation API によって翻訳されました。
Switch to English

オーディオエフェクト

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
  • sessionAudioSessionConsts.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を使用できます。