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)
- 지정된
AudioSession
은AudioSessionConsts.DEVICE
여야 합니다. session
이AudioSessionConsts.DEVICE
이면AudioIoHandle
은 무시됩니다.device
는IDevice::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 간에 조정이 필요한 경우에 구현에서 사용할 수 있습니다.