HIDL 오디오 HAL

Android 13 이하에서 Audio HAL 인터페이스는 다음과 같이 HIDL HAL 파일(확장자 .hal)의 HIDL 및 구성 파일의 XSD 스키마를 사용하여 정의됩니다.

audio_hal

그림 1. Audio HAL 인터페이스

구성 파일

오디오 정책과 오디오 효과 XML 구성 파일은 Audio HIDL HAL 인터페이스의 일부로 간주됩니다. 이러한 파일은 자체 스키마를 준수해야 하며 준수 여부는 VTS 테스트를 통해 확인됩니다.

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

Audio HIDL HAL API

이 섹션에서는 HIDL용 Core, Effects, Common HAL API를 설명합니다.

Core HAL

HIDL을 사용하는 Core HAL의 주요 인터페이스는 다음과 같습니다.

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

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

Core 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

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

Effects HAL

다음 표에는 HIDL을 사용하는 유용한 Effects HAL 구성요소의 위치가 나와 있습니다.

Effects HAL 구성요소 위치
최신 버전의 API /hardware/interfaces/audio/effect/6.0/
효과 구성 파일 XSD 스키마 /hardware/interfaces/audio/effect/6.0/xml/audio_effects_conf.xsd

자세한 내용은 오디오 효과 섹션과 /hardware/interfaces/audio/effect/all-versions/default/의 Effects HAL API의 샘플 구현을 참고하세요.

Common HAL

HIDL을 사용하는 Common HAL API에는 다음이 포함되어 있습니다.

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

Audio HAL V7 업데이트

이 섹션에서 설명된 대로 Android 12의 Audio HAL 버전 7에 중요한 변경사항이 있습니다. Audio HAL V7에서는 다음 작업이 실행됩니다.

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

특히 Audio HAL V7에서 다음 영역이 변경됩니다.

이러한 변경사항은 각 섹션에 자세히 설명되어 있습니다.

열거형

Audio HAL V7부터 오디오 정책 구성 파일에 사용되는 열거형은 XSD 스키마에서만 정의되고 HIDL에서는 정의되지 않습니다.

Audio HAL V6에서 types.hal의 열거형 값(예: AudioFormat)은 오디오 정책 구성 파일 XSD 스키마에도 정의되어 중복됩니다. V7에서 이 문제가 발생하지 않도록 열거형은 string으로 변경되고 가능한 모든 열거형 값은 XSD 스키마에 대신 나열됩니다.

그림 2에서는 V7의 AudioFormat 열거형의 변경사항 중 일부를 비교합니다.

audioformat-change

그림 2. AudioFormat 열거형 변경사항 중 일부 비교

string으로 변환된 열거형은 다음 목록을 참고하세요.

  • AudioChannelMask
  • AudioContentType
  • AudioDevice: 공급업체 확장 가능
  • AudioFormat: 공급업체 확장 가능
  • AudioGainMode
  • AudioSource
  • AudioStreamType
  • AudioUsage

문자열 열거형 값 전달

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

audio-passing-values

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

예를 들어 프레임워크에서 공급업체로 오디오 형식 유형의 값을 전달하기 위해 다음과 같은 과정이 진행됩니다.

  1. libaudiohal에서 AudioFormat의 열거형 값이 문자열 값으로 변환되고 HAL에 전달됩니다.
  2. 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 버전 HIDL 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