Android의 오디오 하드웨어 추상화 계층(HAL)은 android.media
에 있는 상위 수준의 오디오별 프레임워크 API를 기본 오디오 드라이버와 하드웨어에 연결합니다. 오디오 HAL은 오디오 서비스에서 호출하는 표준 인터페이스를 정의합니다. 오디오 하드웨어가 제대로 작동하려면 오디오 HAL을 구현해야 합니다.
이 페이지에서는 오디오 HAL에 관해 간략하게 설명하고 API 및 구현 요구사항의 세부정보를 제공합니다.
오디오 HAL 인터페이스
오디오 HAL 인터페이스는 아래와 같이 .hal
파일의 HIDL 및 구성 파일의 XSD 스키마를 사용하여 정의됩니다.
그림 1. 오디오 HAL 인터페이스
구성 파일
오디오 정책과 오디오 효과 XML 구성 파일은 오디오 HAL 인터페이스의 일부로 간주됩니다. 이러한 파일은 자체 스키마를 준수해야 하며 준수 여부는 VTS 테스트를 통해 확인됩니다.
오디오 HAL 구현의 일환으로 오디오 토폴로지를 설명하는 오디오 정책 구성 파일을 생성해야 합니다. 오디오 HAL 기능은 프레임워크에 사용되려면 audio_policy_configuration.xml
파일에서 선언되어야 합니다.
오디오 HAL API
오디오 HAL에는 다음 API가 포함됩니다.
- 핵심 HAL
- 효과 HAL
- 공통 HAL
이러한 각 API는 다음 섹션에 설명되어 있습니다.
핵심 HAL
핵심 HAL은 AudioFlinger에서 오디오 재생과 오디오 라우팅 제어를 위해 사용하는 기본 API입니다. 몇 가지 주요 인터페이스는 다음과 같습니다.
IDeviceFactory.hal
은 API로 들어가는 진입점입니다.IDevice.hal
및IPrimaryDevice.hal
에는setMasterVolume
또는openInputStream
같은 메서드가 포함되어 있습니다.- 스트림은 단방향이며 AudioFlinger가
IStream.hal
,IStreamOut.hal
,IStreamIn.hal
을 통해 HAL과 오디오를 주고받는 데 사용됩니다.
다음 표에는 유용한 핵심 HAL 구성요소의 위치가 나와 있습니다.
핵심 HAL 구성요소 | 위치 |
---|---|
최신 버전의 API | /hardware/interfaces/audio/6.0
|
최신 핵심 HAL API와 관련된 유형 | /hardware/interfaces/audio/6.0/types.hal
|
오디오 정책 구성 파일 XSD 스키마 | /hardware/interfaces/audio/6.0/config/audio_policy_configuration.xsd
|
핵심 HAL API(/hardware/interfaces/audio/core/all-versions/default/
)의 기본 구현은 기존 공유 라이브러리를 사용한 pre-Treble HAL 구현의 래퍼입니다.
커널 드라이버와 직접 상호작용하는 새 버전의 오디오 HAL을 구현할 경우 기본 구현을 참조로도 간주할 수 있습니다.
효과 HAL
효과 HAL API는 효과 프레임워크에서 오디오 효과를 제어하는 데 사용됩니다. 효과 HAL API를 통해 자동 게인 컨트롤 및 노이즈 제거와 같은 전처리 효과도 구성할 수 있습니다.
다음 표에는 유용한 효과 HAL 구성요소의 위치가 나와 있습니다.
효과 HAL 구성요소 | 위치 |
---|---|
최신 버전의 API | /hardware/interfaces/audio/effect/6.0/
|
효과 구성 파일 XSD 스키마 | /hardware/interfaces/audio/effect/6.0/xml/audio_effects_conf.xsd
|
자세한 내용은 오디오 효과 섹션과 효과 HAL API(/hardware/interfaces/audio/effect/all-versions/default/
)의 샘플 구현을 참고하세요.
공통 HAL
공통 HAL은 핵심 HAL API와 효과 HAL API에 사용되는 공통 데이터형의 라이브러리입니다. 데이터 구조만 정의하므로 인터페이스가 없으며 연결된 VTS 테스트도 없습니다. 공통 HAL API에는 다음이 포함됩니다.
- 핵심 API 및 효과 API를 통해 공유된 정의(
/hardware/interfaces/audio/common/6.0/types.hal
) - 구현, 클라이언트 및 테스트를 위해 HIDL API에 코딩을 지원하는 데 사용되는 유틸리티(
/hardware/interfaces/audio/common/all-versions
)
요구사항
오디오 HAL을 구현하고 오디오 정책 구성 파일을 만드는 것 외에도 다음 HAL 요건을 준수해야 합니다.
- 사운드 트리거 캡처(핫워드 DSP 버퍼에서 캡처)가 하나의 입력 프로필에서 지원되는 경우 구현 시 사운드 트리거 HAL에서 지원하는 동시 세션 수에 상응하는 이 프로필의 여러 활성 스트림을 지원해야 합니다.
- 동시 캡처 페이지에 설명된 대로 애플리케이션 프로세서에서 음성 통화 TX 및 캡처를 동시에 실행합니다.
오디오 HAL V7 업데이트
하위 호환성 문제를 해결하기 위해, Android 13부터 모든 HAL 변경사항에 안정적 AIDL이 요구됩니다. Android 13 이상에서 AIDL 도입을 지원하고 개선하기 위해 오디오 HAL V7은 다음을 실행합니다.
- 프레임워크와 HAL에 사용되는 데이터 모델을 통합합니다.
- HIDL 데이터형(열거형)과 오디오 정책 구성에 사용되는 XML 스키마 간의 중복을 최소화합니다.
특히 오디오 HAL V7에서 다음 영역이 변경됩니다.
이러한 변경사항은 각 섹션에 자세히 설명되어 있습니다.
열거형
오디오 HAL V7부터 오디오 정책 구성 파일에 사용되는 열거형은 XSD 스키마에서만 정의되고 HIDL에서는 정의되지 않습니다.
오디오 HAL V6에서 types.hal
의 열거형 값(예: AudioFormat
)은 오디오 정책 구성 파일 XSD 스키마에도 정의되어 중복됩니다. V7에서 이 문제가 발생하지 않도록 열거형은 string
으로 변경되고 가능한 모든 열거형 값은 XSD 스키마에 대신 나열됩니다.
V7의 AudioFormat
열거형 변경사항 중 일부를 비교하려면 그림 2를 참고하세요.
그림 2. AudioFormat 열거형 변경사항 중 일부 비교
String
으로 변환된 열거형은 다음 목록을 참고하세요.
AudioChannelMask
AudioContentType
AudioDevice
: 공급업체 확장 가능AudioFormat
: 공급업체 확장 가능AudioGainMode
AudioSource
AudioStreamType
AudioUsage
문자열 열거형 값 전달
문자열 값은 HAL 인터페이스 경계에서 정보를 열거형 값으로 전송하는 데 사용됩니다. 프레임워크와 HAL 래퍼 모두 비즈니스 로직 구현을 위해 정수 열거형 값을 사용하고 그림 3에 표시된 변환 방식을 사용합니다.
그림 3. 문자열 열거형 값 전달
예를 들어 프레임워크에서 공급업체로 오디오 형식 유형의 값을 전달하기 위해 다음과 같은 과정이 진행됩니다.
libaudiohal
에서AudioFormat
의 열거형 값이 문자열 값으로 변환되고 HAL에 전달됩니다.- HAL 측에서 기본 래퍼가 문자열을 열거형 값으로 변환하고, 이 값은 기존 HAL에 전달됩니다.
XML 스키마 변경사항
XML 스키마 정의(XSD)에 있는 열거형 값의 전체 목록을 통해 VTS의 오디오 정책 구성 XML 파일 확인을 개선할 수 있습니다. XSD를 준수하기 위해 HAL V7과 함께 사용되는 오디오 정책 구성 파일이 변경되었습니다.
V7에서는 샘플링 레이트, 채널 마스크, 플래그 등의 속성 값 목록을 구분하는 데 표준 ␣
(공백) 문자가 사용됩니다. V6 이하에서는 ,
(쉼표) 및 |
(세로 막대)가 사용되었습니다. 다음 예에서와 같이 공백은 channelMasks
의 값 목록을 구분하는 데 사용됩니다.
<profile channelMasks="AUDIO_CHANNEL_OUT_STEREO AUDIO_CHANNEL_OUT_MONO" … />
기호를 변경하려면 update_audio_policy_config.sh
라는 자동 변환 스크립트를 사용합니다. 다음 명령어를 참고하여 Pixel 5(Redfin) 기기의 V6 오디오 정책 구성 파일을 V7 버전으로 변환합니다.
hardware/interfaces/audio/7.0/config/update_audio_policy_config.sh \
device/google/redfin/audio/audio_policy_configuration.xml 6.0
데이터형
V7에서는 중복 정의를 최소화하기 위해 일부 데이터 구조가 다시 정의됩니다. 데이터 항목의 반복되는 튜플은 재사용 가능한 구조로 그룹화됩니다. 이러한 데이터 구조에는 안전 유니온과 같은 최신 HIDL 기능을 사용합니다.
예를 들어 V6 이하에서는 HIDL 인터페이스 및 유형에 <format, sampling rate, channel mask>
삼중 구조가 종종 사용됩니다. 이 중복성을 삭제하기 위해 V7에서는 AudioConfigBase
데이터형과 기타 데이터형이 다음과 같이 정의됩니다.
AudioConfigBase := <format, sampling rate, channel mask>
AudioConfigBaseOptional := <[fmt], [sampl. rate], [chan. mask]>
AudioConfig
,AudioOffloadInfo
,AudioPortConfig
에 사용됨AudioProfile := <format, {sampling rates}, {channel masks}>
AudioPort/PortConfig
의 느슨한 컬렉션을 대체합니다.AudioPortExtendedInfo := device | mix | session
AudioPort/PortConfig
의 유니온을 대체합니다.
공급업체 태그
공급업체는 기기 유형 및 형식 외에도 오디오 트랙 메타데이터의 맞춤 태그를 추가할 수 있습니다.
재생 및 녹음 트랙 메타데이터의 경우 공급업체는 자체 태그를 전달할 수 있습니다. 이 태그는 앱에서 HAL로의 오디오 I/O 스트림에 속성을 추가하는 데 사용됩니다.
다음 예에서와 같이 재생 트랙 메타데이터의 공급업체 태그가 추가됩니다.
struct PlaybackTrackMetadata {
…
/** Tags from AudioTrack audio attributes */
vec<AudioTag> tags;
};
RecordTrackMetadata
구조는 기록 트랙 메타데이터별 태그를 추가하여 유사한 방식으로 구현됩니다.
공급업체 확장 프로그램 네임스페이스 지정
HAL V7부터 공급업체 확장 프로그램에는 V6에는 필요하지 않았던 {vendor}
접두어가 추가로 필요합니다. {vendor}
접두어가 유효하려면 3개 이상의 영숫자 문자여야 합니다.
V7에서는 다음 형식을 사용합니다.
VX_{vendor}_{letters/numbers}
다음은 유효한 V7 공급업체 확장 프로그램의 몇 가지 예입니다.
- VX_GOOGLE_VR
- VX_QCI_AMBIENT_MIC
버전 정보
다음 표에는 각 Android 버전의 HAL 버전 번호가 나와 있습니다.
Android 버전 | HAL 버전 |
---|---|
Android 13 | 7.1 |
Android 12 | 7.0 |
Android 11 | 6.0 |
Android 10 | 5.0 |
Android 9 | 4.0 |
Android 8 | 2.0 |