AIDL 및 HIDL 오디오 HAL 비교

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.MMajor.Minor 버전을 나타냅니다. 모든 AIDL 인터페이스는 android.hardware.audio.core 패키지 내에 있습니다.

HIDL API 인터페이스 및 구성 파일 AIDL API 인터페이스
IDevicesFactory ServiceManagerIModule 등록
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.getAudioPort
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.getPresentationPositionIStreamIn.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.xmlaudio_policy_engine_configuration.xml)에서 정의된 시스템 전체 구성은 IConfig를 통해 제공되어야 합니다. 그러나 AIDL로의 전환을 용이하게 하기 위해 공급업체는 이전에 시스템 전체 구성을 설정하는 데 사용한 동일한 XML 파일을 계속 사용할 수 있습니다. IConfig의 참조 구현에는 AIDL 데이터 유형을 사용하여 XML 파일의 정보를 나타내는 데 필요한 코드가 포함되어 있어 XML에서 AIDL로 쉽게 전환할 수 있습니다.

HIDL 구성 파일 요소 AIDL API 인터페이스 메서드
<globalConfiguration>
<speaker_drc_enabled>1

<call_screen_mode_supported>
<engine_library>
다른 두 메서드로 구분됨:
ITelephony.getSupportedAudioModes
IConfig.getEngineConfig
<volumes> 또는
<volumeGroups>, <ProductStrategies>
IConfig.getEngineConfig
<surroundSound> IConfig.getSurroundSoundConfig

  1. 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에서 공급업체 확장 프로그램은 IDeviceIStream 인터페이스의 getParameters 또는 setParameters 메서드를 사용하여 구현됩니다. 이러한 메서드는 임의의 문자열을 허용합니다. AIDL API에는 getVendorParameters 또는 setVendorParameters와 같은 상응하는 메서드가 있으며 ParcelableHolders 내에서 캡슐화를 사용하여 임의의 Parcelable 인스턴스를 사용합니다.

기타 변경사항

기타 일반 변경사항은 다음과 같습니다.

  1. HAL API의 테스트 가능성을 개선하기 위해 AIDL 버전에서는 VTS 테스트에서 사용하고 ModuleDebug parcelable을 통해 사용할 수 있는 디버깅 옵션을 도입합니다. 이러한 옵션은 수동 개입과 외부 테스트 장비 사용이 필요한 특정 기능(예: 외부 기기 연결)을 에뮬레이션하라고 HAL에 지시합니다.

  2. 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.MMajor.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