Android 14부터 파트너와 SoC 공급업체는 현재 HIDL HAL 구현을 AIDL HAL 구현으로 교체하는 것이 좋습니다.
HIDL 오디오 HAL에서 AIDL 오디오 HAL로의 원활한 전환을 용이하게 하기 위해 일부 주요 차이점이 이 페이지에 강조 표시되어 있습니다. 이 페이지에는 오디오 HAL용 AIDL 및 HIDL 인터페이스 간의 매핑도 나와 있습니다.
AIDL과 HIDL 오디오 HAL 구현의 차이점
HIDL 구조와 AIDL 구조의 주요 차이점은 다음과 같습니다.
AIDL 오디오 핵심 HAL에서
IConfig
인터페이스는 HIDL HAL에서 XML 파일의 시스템 전체 매개변수를 대체하기 위해 도입되었습니다. 프레임워크는 공급업체 구성 파일 대신 핵심 HAL에서 이러한 매개변수를 읽습니다. 예를 들어 사용자 제어를 위해 표시되는 서라운드 형식 목록은 핵심 HAL의IConfig.getSurroundSoundConfig
메서드에서 제공됩니다.AIDL 오디오 효과 HAL에서 HIDL 효과 HAL의 XML 파일에 정의된
effectProxy
로직이 오디오 프레임워크로 이동됩니다. 오디오 프레임워크는IFactory.queryEffects
를 사용하여 시스템에서 모든 효과 인스턴스를 쿼리하고IFactory.queryProcessing
을 사용하여 모든 효과 처리를 쿼리합니다.오디오 기기 유형의 기기라는 용어를 사용할 때 혼동을 피하기 위해 HIDL 오디오 HAL의
IDevice
를 AIDL 오디오 HAL의IModule
로 이름을 바꿨습니다.IPrimaryDevice
가 AIDL 오디오 HAL에서 대체됩니다. 현재 오디오 모드와 화면 회전에 관한 업데이트는 모든IModule
인스턴스로 전송됩니다. 블루투스 동기식 연결 지향(BT SCO) 및 핸즈프리 프로필(HFP)과 관련된 매개변수는 전용IBluetooth
인터페이스에서 처리됩니다. 전용ITelephony
인터페이스는 전화 통신 관련 컨트롤을 제공합니다. 이러한 두 인터페이스의 인스턴스는IModule
인터페이스의 기본 인스턴스에서 가져올 수 있습니다. 자세한 내용은 핵심 HAL 및 기능 관련 기능의 비교 표를 참고하세요.IDevicesFactory
는 중복 방지를 위해 AIDL 오디오 HAL에서 삭제됩니다. HAL 모듈(즉,IModule
인터페이스 인스턴스)은 이제bluetooth
또는r_submix
와 같은 인스턴스 이름에 해당 이름을 사용하여 서비스 관리자에 직접 등록됩니다. 유일한 예외는 인스턴스 이름default
로 등록하는primary
모듈입니다.
AIDL 및 HIDL 오디오 HAL 매핑
다음 섹션의 표는 HIDL 및 AIDL 오디오 HAL 인터페이스 간 매핑을 보여줍니다. 디렉터리 구조에 관한 자세한 내용은 오디오 HAL 리드미 파일을 참고하세요.
핵심 HAL
모든 HIDL 인터페이스는 android.hardware.audio@N.M
패키지 내에 있으며 여기서 N.M
은 Major.Minor 버전을 나타냅니다. 모든 AIDL 인터페이스는 android.hardware.audio.core
패키지 내에 있습니다.
HIDL API 인터페이스 및 구성 파일 | AIDL API 인터페이스 |
---|---|
IDevicesFactory |
ServiceManager 에 IModule 등록 |
IDevice |
IModule |
IPrimaryDevice |
ITelephony IBluetooth |
IStream IStreamIn
IStreamOut |
StreamDescriptor IStreamIn
IStreamCommon
IStreamOut |
audio_policy_configuration.xml
audio_policy_engine_configuration.xml |
IConfig IModule |
구성 가능한 오디오 정책 파일 | Android 14의 HIDL 구현 사용 |
오디오 포트, 동적 프로필, 경로, 패치
이 표에서 XML 파일 요소는 꺾쇠괄호를 사용하여 지정됩니다.
HIDL API 인터페이스 메서드 및 구성 파일 요소 | AIDL API 인터페이스 메서드 |
---|---|
<attachedDevices>
<defaultOutputDevice>
<mixPorts>
<devicePorts> |
IModule.getAudioPorts |
IDevice.getAudioPort
IDevice.setConnectedState |
IModule.connectExternalDevice
IModule.disconnectExternalDevice |
IStream.getSupportedProfiles |
IModule.connectExternalDevice |
<routes > |
IModule.getAudioRoutes |
IDevice.createAudioPatch
IDevice.updateAudioPatch
IDevice.releaseAudioPatch
IStream.getDevices
IStream.setDevices
IDevice.openInputStream 의 기기 사양
IDevice.openOutputStream |
IModule.setAudioPatch
IModule.setAudioPortConfig
IModule.resetAudioPatch |
오디오 포트 구성 및 스트림
HIDL API 인터페이스 메서드 | AIDL API 인터페이스 메서드 |
---|---|
IStream.getAudioProperties
IStream.setAudioProperties
IStreamIn.getAudioSource |
IModule.getAudioPortConfigs
IModule.setAudioPortConfig |
IDevice.openInputStream
IDevice.openOutputStream
IStreamIn.prepareForReading
IStreamOut.prepareForWriting
IStream.createMmapBuffer |
IModule.openInputStream
IModule.openOutputStream |
IStream.close |
IStreamCommon.close |
IStreamIn.updateSinkMetadata
IStreamOut.updateSourceMetadata |
IStreamIn.updateMetadata
IStreamOut.updateMetadata |
IStream.standby |
StreamDescriptor.Command.standby |
IStream.pause IStream.resume
IStream.start IStream.stop |
StreamDescriptor.Command.pause .start
.start .drain |
IStreamOut.drain IStreamOut.flush |
StreamDescriptor.Command.drain .flush |
IStreamOut.setCallback
IStreamOut.clearCallback |
IModule.openOutputStream
IStreamCommon.close |
IStreamOut.getPresentationPosition 및 IStreamIn.getCapturePosition
IStreamOut.getLatency
IStream.getMmapPosition
IStreamIn.getInputFramesLost |
StreamDescriptor.Reply.observable
StreamDescriptor.Reply.latencyMs
StreamDescriptor.Reply.hardware
StreamDescriptor.Reply.xrunFrames |
IDevice.getInputBufferSize
IStreamOut.getLatency
IStream.getBufferSize
IStream.getFrameSize
IStream.getFrameCount |
IModule.setAudioPatch , 명목 지연 시간, 최소 버퍼 크기는 HAL에서 반환된 AudioPatch 구조의 일부입니다.
프레임의 실제 버퍼 크기는 프레임 크기(바이트)와 함께 StreamDescriptor 구조의 일부입니다. 버퍼 크기(바이트)는 이 두 숫자를 곱하여 계산할 수 있습니다. |
오디오 효과 연결
HIDL API 인터페이스 메서드 | AIDL API 인터페이스 메서드 |
---|---|
IDevice.addDeviceEffect
IDevice.removeDeviceEffect |
IModule.addDeviceEffect
IModule.removeDeviceEffect |
IStream.addEffect
IStream.removeEffect |
IStreamCommon.addEffect
IStreamCommon.removeEffect |
시스템 전체 구성
이전에 오디오 정책 XML 구성 파일(즉, audio_policy_configuration.xml
및 audio_policy_engine_configuration.xml
)에서 정의된 시스템 전체 구성은 IConfig
를 통해 제공되어야 합니다.
그러나 AIDL로의 전환을 용이하게 하기 위해 공급업체는 이전에 시스템 전체 구성을 설정하는 데 사용한 동일한 XML 파일을 계속 사용할 수 있습니다. IConfig
의 참조 구현에는 AIDL 데이터 유형을 사용하여 XML 파일의 정보를 나타내는 데 필요한 코드가 포함되어 있어 XML에서 AIDL로 쉽게 전환할 수 있습니다.
HIDL 구성 파일 요소 | AIDL API 인터페이스 메서드 |
---|---|
<globalConfiguration>
<speaker_drc_enabled> <call_screen_mode_supported>
<engine_library> |
다른 두 메서드로 구분됨:
ITelephony.getSupportedAudioModes
IConfig.getEngineConfig |
<volumes> 또는
<volumeGroups> , <ProductStrategies>
|
IConfig.getEngineConfig |
<surroundSound> |
IConfig.getSurroundSoundConfig |
-
speaker_drc_enabled
는 구성 파일에서 삭제됩니다. 이 구성 항목이 시스템 내에서 사용되지 않기 때문입니다. 모든 기기에는 DRC가 사용 설정되어 있어야 합니다. <ahref="#fnref1" rev="footnote"> </ahref="#fnref1">
기능 관련 기능
HIDL API 인터페이스 메서드 | AIDL API 인터페이스 |
---|---|
IDevice.setMasterVolume
IDevice.getMasterVolume
IDevice.setMicMute
IDevice.getMicMute
IDevice.setMasterMute
IDevice.getMasterMute |
IModule.\* |
IPrimaryDevice.getTtyMode
IPrimaryDevice.setTtyMode
IPrimaryDevice.getHacEnabled
IPrimaryDevice.setHacEnabled
IPrimaryDevice.setVoiceVolume |
ITelephony.TelecomConfig.\* |
IPrimaryDevice.setBtScoHeadsetDebugName
IPrimaryDevice.getBtScoNrecEnabled
IPrimaryDevice.setBtScoNrecEnabled
IPrimaryDevice.getBtScoWidebandEnabled
IPrimaryDevice.setBtScoWidebandEnabled,
IPrimaryDevice.getBtHfpEnabled
IPrimaryDevice.setBtHfpEnabled
IPrimaryDevice.setBtHfpSampleRate
IPrimaryDevice.setBtHfpVolume |
IBluetooth.ScoConfig.\*
IBluetooth.HfpConfig.\* |
IPrimaryDevice.setMode
IPrimaryDevice.updateRotation |
ITelephony.switchAudioMode
IModule.updateAudioMode
IModule.updateScreenRotation |
IDevice.setScreenState
IDevice.getMicrophones |
IModule.updateScreenState
IModule.getMicrophones |
IDevice.getHwAvSync
IStream.setHwAvSync |
IModule.generateHwAvSyncId
IStreamCommon.updateHwAvSyncId |
IStreamIn.setGain IStreamIn.setMicrophoneDirection IStreamIn.setMicrophoneFieldDimension |
IStreamIn.setHwGain IStreamIn.setMicrophoneDirection IStreamIn.setMicrophoneFieldDimension |
IStreamOut.getDualMonoMode
IStreamOut.setDualMonoMode
IStreamOut.getPlaybackRateParameters
IStreamOut.setPlaybackRateParameters
IStreamOut.selectPresentation
IStreamOut.getAudioDescriptionMixLevel
IStreamOut.setAudioDescriptionMixLevel
IStreamOut.setLatencyMode
IStreamOut.getRecommendedLatencyModes |
IStreamOut.\* |
IStreamOut.setEventCallback
IStreamOut.setLatencyModeCallback |
IModule.openOutputStream (콜백이 IStreamOutEventCallback 으로 결합됨) |
IDevice.get/setParameters
IStream.get/setParameters |
IModule.get/setVendorParameters
IStreamCommon.get/setVendorParameters |
더 이상 사용되지 않는 메서드
HIDL API 인터페이스 메서드 | 비고 |
---|---|
IDevice.initCheck IDevice.close |
HAL 모듈은 성공적인 초기화 시에만 ServiceManager 를 사용하여 자체적으로 게시됩니다. 이 시점에서 영구적인 것으로 간주되며 닫을 수 없습니다. |
IDevice.supportsAudioPatches
IStreamOut.supportsPauseAndResume
IStreamOut.supportsDrain |
패치, 일시중지, 재개, 소모를 지원해야 합니다. |
IStreamOut.getRenderPosition
IStreamOut.getNextWriteTimestamp |
더 이상 사용되지 않음 |
공급업체 확장 프로그램
HIDL API에서 공급업체 확장 프로그램은 IDevice
및 IStream
인터페이스의 getParameters
또는 setParameters
메서드를 사용하여 구현됩니다. 이러한 메서드는 임의의 문자열을 허용합니다.
AIDL API에는 getVendorParameters
또는 setVendorParameters
와 같은 상응하는 메서드가 있으며 ParcelableHolders
내에서 캡슐화를 사용하여 임의의 Parcelable
인스턴스를 사용합니다.
기타 변경사항
기타 일반 변경사항은 다음과 같습니다.
HAL API의 테스트 가능성을 개선하기 위해 AIDL 버전에서는 VTS 테스트에서 사용하고
ModuleDebug
parcelable을 통해 사용할 수 있는 디버깅 옵션을 도입합니다. 이러한 옵션은 수동 개입과 외부 테스트 장비 사용이 필요한 특정 기능(예: 외부 기기 연결)을 에뮬레이션하라고 HAL에 지시합니다.HAL 서비스는 시스템 속성
sys.audio.restart.hal
값이1
로 설정되면 다시 시작해야 합니다.audioserver.rc
를 통해 다시 시작할 수 있습니다. HAL을 구현하는 동안audioserver.rc
파일에 나열된 적절한 HAL 서비스 이름을 사용하세요. Android 14에서는 이름vendor.audio-hal-aidl
이 HAL의 AIDL 버전을 위해 특별히 추가됩니다.
효과 HAL
모든 HIDL 인터페이스는 android.hardware.audio.effect@N.M*
패키지 내에 있으며 여기서 N.M
은 Major.Minor 버전입니다. 모든 AIDL 인터페이스는 android.hardware.audio.effect
패키지 내에 있습니다.
HIDL API 인터페이스 및 구성 파일 | AIDL API 인터페이스 |
---|---|
IEffectsFactory |
IFactory |
IEffect |
IEffect |
audio_effects.xml |
IEffect |
효과 팩토리
HIDL API 인터페이스 (android.hardware.audio.effect@X.X) |
AIDL API 인터페이스 (android.hardware.audio.effect) |
---|---|
IEffectsFactory.getAllDescriptors |
null UUID 매개변수가 포함된 IFactory.queryEffects |
IEffectsFactory.getDescriptor |
UUID 매개변수가 포함된 IFactory.queryEffects |
IEffectsFactory.createEffect |
IFactory.createEffect |
audio_effects.xml |
IFactory.queryProcessing
IFactory.queryEffects |
효과 인터페이스
HIDL API 인터페이스 (android.hardware.audio.effect@X.X) |
AIDL API 인터페이스 (android.hardware.audio.effect) |
---|---|
IEffect.init |
IEffect.open |
IEffect.setConfig |
IEffect.setParameter |
IEffect.enable |
IEffect.command(CommandId::START) |
IEffect.disable |
IEffect.command(CommandId::STOP) |
IEffect.reset |
IEffect.command(CommandId::RESET) |
IEffect.getDescriptor |
IEffect.getDescriptor |
IEffect.command |
기존 HIDL 명령어 유형에 따라 IEffect.command ,IEffect.setParameter 또는IEffect.getParameter 에 매핑됨
|
N/A | IEffect.getState |
IEffect.setParameter |
IEffect.setParameter |
IEffect.getParameter |
IEffect.getParameter |
효과 명령어
HIDL API 인터페이스 (android.hardware.audio.effect@X.X) |
AIDL API 인터페이스 (android.hardware.audio.effect) |
---|---|
EFFECT_CMD_INIT |
IEffect.open |
EFFECT_CMD_RESET |
CommandId.RESET |
EFFECT_CMD_ENABLE |
IEffect.command(CommandId::START) |
EFFECT_CMD_DISABLE |
IEffect.command(CommandId::STOP) |
EFFECT_CMD_SET_PARAM_DEFERRED |
효과 AIDL HAL에서 지원 중단됨 |
EFFECT_CMD_SET_PARAM_COMMIT |
효과 AIDL HAL에서 지원 중단됨 |
EFFECT_CMD_SET_CONFIG
EFFECT_CMD_SET_PARAM
EFFECT_CMD_SET_DEVICE
EFFECT_CMD_SET_VOLUME
EFFECT_CMD_SET_AUDIO_MODE
EFFECT_CMD_SET_CONFIG_REVERSE
EFFECT_CMD_SET_INPUT_DEVICE
EFFECT_CMD_SET_FEATURE_CONFIG
EFFECT_CMD_SET_AUDIO_SOURCE
| IEffect.setParameter |
EFFECT_CMD_GET_PARAM
EFFECT_CMD_GET_CONFIG
EFFECT_CMD_GET_CONFIG_REVERSE
EFFECT_CMD_GET_FEATURE_SUPPORTED_CONFIGS
EFFECT_CMD_GET_FEATURE_CONFIG
VISUALIZER_CMD_MEASURE
EFFECT_CMD_FIRST_PROPRIETARY
( VISUALIZER_CMD_CAPTURE 와 동일)
| IEffect.getParameter |
EFFECT_CMD_OFFLOAD |
지원 중단됨
AIDL에서 오프로드 및 비 오프로드 모드 전환은 프레임워크에서 처리됩니다. |
EFFECT_CMD_DUMP |
내장 바인더 트랜잭션 AIBinder_dump 로 처리됩니다. |
공통 효과 매개변수 정의
HIDL 정의 (android.hardware.audio.effect@X.X) |
AIDL 정의 |
---|---|
Types.hal |
Flags.aidl
Parameter.aidl
|
특정 효과 정의
HIDL API 인터페이스 (android.hardware.audio.effect@X.X) |
AIDL API 인터페이스 (android.hardware.audio.effect) |
---|---|
I$EffectType$.hal |
$EffectType$.aidl |