오디오 HAL

Android의 오디오 하드웨어 추상화 계층(HAL)은 android.media 의 상위 수준 오디오별 프레임워크 API를 기본 오디오 드라이버 및 하드웨어에 연결합니다. 오디오 HAL은 오디오 서비스가 호출하는 표준 인터페이스를 정의합니다. 오디오 하드웨어가 올바르게 작동하려면 구현해야 합니다.

이 페이지에서는 오디오 HAL에 대한 개요를 제공하고 API 및 구현 요구사항에 대한 세부정보를 제공합니다.

오디오 HAL 인터페이스

오디오 HAL 인터페이스는 다음과 같이 .hal 구성 파일의 XSD 스키마를 사용하여 정의됩니다.

audio_hal

그림 1. 오디오 HAL 인터페이스

구성 파일

오디오 정책 및 오디오 효과 XML 구성 파일은 오디오 HAL 인터페이스의 일부로 간주됩니다. 이러한 파일은 해당 스키마를 준수해야 하며 VTS 테스트를 통해 적합성을 확인합니다.

오디오 HAL 구현의 일부로 오디오 토폴로지를 설명하는 오디오 정책 구성 파일 을 만들어야 합니다. 프레임워크에서 오디오 HAL 기능을 사용하려면 audio_policy_configuration.xml 파일에서 오디오 HAL 기능을 선언해야 합니다.

오디오 HAL API

오디오 HAL에는 다음 API가 포함됩니다.

  • 핵심 HAL
  • 효과 HAL
  • 공통 HAL

이러한 각 API는 다음 섹션에서 설명합니다.

핵심 HAL

Core HAL은 오디오를 재생하고 오디오 라우팅을 제어하기 위해 AudioFlinger에서 사용하는 기본 API입니다. 주요 인터페이스 중 일부는 다음과 같습니다.

  • IDeviceFactory.hal 은 API의 진입점입니다.
  • IDevice.halIPrimaryDevice.hal 에는 setMasterVolume 또는 openInputStream 과 같은 메서드가 포함되어 있습니다.
  • 스트림은 단방향이며 AudioFlinger에서 IStream.hal , IStreamOut.halIStreamIn.hal 을 통해 HAL과 오디오를 송수신하는 데 사용됩니다.

다음 표에는 유용한 핵심 HAL 구성요소의 위치가 나와 있습니다.

핵심 HAL 구성요소 위치
최신 버전의 API /hardware/interfaces/audio/6.0
최신 Core HAL API에 특정한 유형 /hardware/interfaces/audio/6.0/types.hal
오디오 정책 구성 파일 XSD 스키마 /hardware/interfaces/audio/6.0/config/audio_policy_configuration.xsd

Core HAL API의 기본 구현( /hardware/interfaces/audio/core/all-versions/default/ )은 레거시 공유 라이브러리 를 사용하는 Pre-Treble HAL 구현을 둘러싼 래퍼입니다. 기본 구현은 커널 드라이버와 직접 상호작용하는 오디오 HAL의 새 버전을 구현할 때 참조로 간주할 수도 있습니다.

효과 HAL

Effects HAL API는 효과 프레임워크에서 오디오 효과를 제어하는 ​​데 사용됩니다. Effects 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

Common HAL은 Core 및 Effects HAL API에서 사용하는 공통 데이터 유형의 라이브러리입니다. 데이터 구조만 정의하므로 인터페이스 및 관련 VTS 테스트가 없습니다. 공통 HAL API에는 다음이 포함됩니다.

  • Core 및 Effect API에서 공유하는 정의( /hardware/interfaces/audio/common/6.0/types.hal )
  • 구현, 클라이언트, 테스트를 위해 HIDL API에 대한 코딩을 지원하는 데 사용되는 유틸리티( /hardware/interfaces/audio/common/all-versions )

요구 사항

오디오 HAL을 구현하고 오디오 정책 구성 파일을 만드는 것 외에도 다음 HAL 요구사항을 준수해야 합니다.

  • 사운드 트리거 캡처(핫워드 DSP 버퍼에서 캡처)가 하나의 입력 프로필에서 지원되는 경우 구현은 사운드 트리거 HAL에서 지원하는 동시 세션 수에 해당하는 이 프로필의 활성 스트림 수를 지원해야 합니다.
  • 동시 캡처 페이지에 자세히 설명된 대로 애플리케이션 프로세서에서 음성 통화 TX 및 캡처의 동시성.

오디오 HAL V7 업데이트

이전 버전과의 호환성 문제를 해결하기 위해 안정적인 AIDL은 Android 13부터 모든 HAL 변경에 필수입니다. Android 13 이상에서 AIDL 채택을 지원하고 향상시키기 위해 오디오 HAL V7은 다음을 수행합니다.

  • 프레임워크와 HAL에서 사용하는 데이터 모델을 통합합니다.
  • HIDL 데이터 유형(열거형)과 오디오 정책 구성에 사용되는 XML 스키마 간의 중복을 최소화합니다.

특히 오디오 HAL V7의 다음 영역이 변경되었습니다.

이러한 변경 사항은 해당 섹션에서 자세히 설명합니다.

열거형

오디오 HAL V7부터 오디오 정책 구성 파일에 사용되는 열거 유형은 HIDL이 아닌 XSD 스키마에서만 정의됩니다.

오디오 HAL V6에서는 types.hal 의 enum 유형 값( AudioFormat 등)도 오디오 정책 구성 파일 XSD 스키마에 정의되어 중복을 생성합니다. V7에서는 이를 방지하기 위해 열거형 유형이 string 로 변경되고 가능한 모든 열거형 값이 대신 XSD 스키마에 나열됩니다.

V7의 AudioFormat enum 유형에 대한 몇 가지 변경 사항을 비교하려면 그림 2를 참조하십시오.

audioformat-change

그림 2. AudioFormat 열거형에 대한 몇 가지 변경 사항 비교

String 으로 변환된 enum 유형은 다음 목록을 참조하십시오.

  • AudioChannelMask
  • AudioContentType
  • AudioDevice : 벤더 확장 가능
  • AudioFormat : 벤더 확장 가능
  • AudioGainMode
  • AudioSource
  • AudioStreamType
  • AudioUsage

문자열 열거형 값 전달

문자열 값은 HAL 인터페이스 경계를 ​​넘어 열거형 값으로 정보를 전송하는 데 사용됩니다. 프레임워크와 HAL 래퍼 모두 비즈니스 로직을 구현하기 위해 정수 열거형 값을 사용하고 그림 3 에 묘사된 변환 접근 방식을 사용합니다.

audio-passing-values

그림 3. 문자열 열거형 값 전달

예를 들어 오디오 형식 유형의 값을 프레임워크에서 공급업체로 전달하려면 다음을 수행하십시오.

  1. AudioFormat 의 enum 값은 libaudiohal 의 문자열 값으로 변환되어 HAL에 전달됩니다.
  2. HAL 측에서 기본 래퍼는 문자열을 레거시 HAL에 전달되는 enum 값으로 변환합니다.

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 라는 자동 변환 스크립트를 사용하십시오. V6 오디오 정책 구성 파일을 Pixel 5(Redfin) 기기용 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 이하에서는 <format, sampling rate, channel mask> 의 세 가지가 HIDL 인터페이스 및 유형에서 자주 사용됩니다. 이러한 중복성을 제거하기 위해 V7에서는 AudioConfigBase 데이터 유형 및 기타 데이터 유형을 다음과 같이 정의합니다.

  • AudioConfigBase := <format, sampling rate, channel mask>

  • AudioConfigBaseOptional := <[fmt], [sampl. rate], [chan. mask]>

    AudioConfig , AudioConfig , AudioOffloadInfo 에서 AudioPortConfig

  • AudioProfile := <format, {sampling rates}, {channel masks}>

    AudioPort/PortConfig 의 느슨한 컬렉션을 대체합니다.

  • AudioPortExtendedInfo := device | mix | session

    AudioPort/PortConfig 의 조합을 대체합니다.

공급업체 태그

장치 유형 및 형식 외에도 공급업체는 오디오 트랙 메타데이터에 대한 사용자 지정 태그를 추가할 수 있습니다.

재생 및 녹음 트랙 메타데이터의 경우 공급업체는 오디오 I/O 스트림에 속성을 추가하는 데 사용되는 자체 태그를 앱에서 HAL로 전달할 수 있습니다.

다음 예와 같이 재생 트랙 메타데이터에 대한 공급업체 태그가 추가됩니다.

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 버전 번호가 나와 있습니다.

안드로이드 버전 HAL 버전
안드로이드 13 7.1
안드로이드 12 7.0
안드로이드 11 6.0
안드로이드 10 5.0
안드로이드 9 4.0
안드로이드 8 2.0