오디오 효과

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에서 열린 재생 또는 캡처 오디오 스트림이 없음).

기기 효과 생성 및 사용 설정

기기별 오디오 효과는 아래 두 가지 방법 중 하나를 사용하여 인스턴스화할 수 있습니다.

오디오 효과 구성 파일 사용

이 방법을 사용하면 지정된 기기를 싱크 또는 소스로 선택하는 모든 오디오 경로에 시스템적으로 연결되고 사용 설정된 오디오 효과를 정적으로 생성할 수 있습니다.

다음과 같이 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은 무시됩니다.
  • deviceIDevice::createAudioPatch() 메서드를 사용하여 오디오 HAL에서 기기가 선택될 때 오디오 프레임워크에 의해 할당된 고유한 AudioPortHandle 로 식별됩니다.

오디오 HAL

기기 효과 기능을 지원하려면 오디오 HAL이 IDevice::createAudioPatch() API를 사용하여 오디오 라우팅 제어를 구현해야 합니다. 이는 true를 보고하는 IDevice::supportsAudioPatches() 메서드에 의해 표시됩니다.

두 가지 새로운 API 메서드, IDevice::addDeviceEffect(AudioPortHandle device, uint64_t effectId) IDevice::removeDeviceEffect(AudioPortHandle device, uint64_t effectId) 는 지정된 기기에서 기기 효과가 사용 설정되거나 중지되었음을 HAL 구현에 알립니다.

기기는 AudioPortHandle 메서드를 사용하여 오디오 패치를 만들 때 사용되는 IDevice::createAudioPatch() ID로 식별됩니다.

오디오 HAL API는 효과가 사용 설정되거나 중지될 때 오디오 및 효과 HAL 간에 조정이 필요한 경우에 구현에서 사용할 수 있습니다.