기기 유형 제한

Android 오디오에서 audio_devices_t는 오디오 기기 유형을 나타내는 데 사용합니다. 이 필드는 오디오 소스 코드에서 하나 이상의 지정된 기기를 필터링하거나 선택하는 비트 필드로 많이 사용되는 필드입니다. Android 11 이전에는 오디오 입력/출력 장치 유형이 30개로 제한되었으며 새로운 오디오 기기 유형을 추가할 수 있는 예비 슬롯이 없었습니다. 새 오디오 기기 유형을 추가할 수 있도록 오디오 기기 유형 수의 제한을 삭제했습니다.

오디오 기기 유형 수의 제한을 삭제하기 위해 오디오 기기 유형은 이제 비트 마스크 대신 열거된 값을 사용합니다.

기존 오디오 기기 유형은 모두 그대로 유지됩니다. AUDIO_DEVICE_BIT_IN은 여전히 입력 장치 또는 출력 장치를 구분하는 데 사용됩니다. 새 오디오 기기 유형을 추가하면 기존 값 사이에 값이 열거됩니다.

새로 열거된 오디오 기기 유형이 추가되면 audio_devices_t에서 예상치 못한 결과가 발생할 수 있으므로 OEM은 이 코드를 비트 마스크로 사용하면 안 됩니다.

예 및 소스

Android 11 이전에는 두 가지 일반적인 용도를 위해 오디오 기기 유형을 비트 마스크로 사용했습니다.

  • audio_devices_t 값을 사용하여 여러 오디오 기기 표시
  • 지정된 카테고리의 오디오 기기 유형이 audio_devices_t 값에 포함되어 있는지 확인

여러 오디오 기기 유형을 나타내려면 /libaudiofoundation/include/media/AudioContainers.hDeviceTypeSet으로 명명된 클래스를 사용합니다. 이 클래스는 audio_devices_tstd::set 컨테이너입니다. 이 클래스는 공급업체에서 사용 가능한 libaudiofoundation 라이브러리에 선언됩니다. C 코드에서 여러 오디오 기기 유형을 나타내려면 audio_devices_t의 배열 또는 목록을 사용하면 됩니다.

단일 기기 유형이 지정된 카테고리인지 확인하려면 /system/media/audio/include/system/audio.haudio_is_.*_device 도우미 함수를 사용합니다. 여러 오디오 기기 유형의 경우 libaudiofoundation의 도우미 함수를 사용합니다. 예를 들어, AudioContainers.hareAllOfSameDeviceType (DeviceTypeSet, std::function)을 사용하여 지정된 오디오 기기 유형이 동일한 유형인지 확인합니다.

구현

OEM은 오디오 HAL 구현에서 오디오 기기 유형 비트필드 표현을 삭제해야 합니다.

  1. 비트필드에서 기기의 저장소를 모두 삭제합니다.

    audio_devices_t는 여러 오디오 기기 유형을 나타내는 데 사용하면 안 됩니다. 대신, 목록이나 벡터를 사용하세요.

  2. 기기 유형 비교에 비트 작업을 사용하지 않도록 합니다.

    Android 11 이전에는 오디오 기기 유형을 비트 필드로 사용할 수 있었습니다. 이 경우 기기 유형 비교에 비트 작업을 사용하는 것이 일반적입니다. 새로 열거된 오디오 기기 유형이 추가되면 비트 작업으로 인해 예기치 않은 결과가 발생할 수 있습니다. 대신, 대안으로 도우미 함수를 사용하세요. 단일 오디오 기기 유형이 있다면 직접 비교를 사용하여 두 값을 비교합니다. 오디오 기기 유형이 지정된 카테고리인지 확인하려면 /system/media/audio/include/system/audio.h의 도우미 함수를 사용하세요. 예로 audio_is_output_device(audio_devices_t device)를 들 수 있습니다.

  3. 오디오 기기 유형 그룹에 사전 정의된 값을 사용하지 않습니다.

    system/media/audio/include/system/audio-base-utils.h의 오디오 기기 유형 그룹 AUDIO_DEVICE_OUT_ALL에 사전 정의된 값이 있습니다. 이러한 모든 값은 예약되지만, 새로 열거된 오디오 기기 유형이 추가되면 값이 정확하지 않으므로 지원 중단될 수 있습니다. audio-base-utils.h에 정의된 새 오디오 기기 유형 그룹이 있으며, 이 그룹은 AUDIO_DEVICE_OUT_ALL_ARRAY와 같은 오디오 기기 유형 배열입니다.

  4. 라우팅에 set_parameters 대신 create_audio_patch()release_audio_patch() 메서드를 구현합니다.

    set_parameters 메서드는 오디오 기기 유형을 비트 필드로 사용하므로 새로 열거된 오디오 기기 유형이 추가되면 예기치 않은 결과가 발생할 수 있습니다.

    현재, 두 종류의 오디오 패치가 필요합니다.

    • 믹스에서 기기로 가는 오디오 패치, 재생용
    • 기기에서 믹스로 가는 오디오 패치, 녹음용

    후속 업데이트에서는 기기에서 기기로 가는 추가 패치가 필요할 수 있습니다.

    오디오 패치를 만들 때, 패치 핸들이 지정되지 않으면 오디오 HAL은 오디오 패치를 식별할 수 있는 고유한 패치 핸들을 생성해야 합니다. 패치 핸들을 생성하지 않으면, 오디오 HAL은 지정된 오디오 패치 핸들을 사용하여 오디오 패치를 업데이트해야 합니다.

    기존 오디오 HAL 및 AOSP HIDL 래퍼를 사용하는 경우 기존 오디오 HAL은 HAL의 주 버전을 3.0으로 설정해야 합니다.

    오디오 패치 기능을 사용 설정하려면 오디오 HAL에서 HAL의 주 버전을 3.0 이상으로 설정해야 합니다. 자세한 내용은 기본 HIDL 구현Device::supportsAudioPatches()를 참고하세요. 이 메서드는 Cuttlefish의 오디오 HAL에서도 찾을 수 있습니다.

맞춤설정

이 기능을 사용 중지하거나, 오디오 기기 유형을 추가할 수 있는 프레임워크에서 오디오 기기 리팩터링을 되돌리는 것은 불가능합니다.

추가된 모든 오디오 기기 유형을 사용하여 단일 비트 세트로 기기 유형을 표시할 수 있으므로 현재 HAL 구현은 계속 작동합니다.

새로운 오디오 기기 유형이 추가되고 OEM에서 새 유형을 사용하기를 원하면 오디오 HAL 구현을 업그레이드하고 HIDL 버전 6.0 이상으로 이동해야 합니다. set_parameters를 사용하여 스트림을 라우팅하면 새 오디오 기기 유형이 추가될 때 예상치 못한 결과가 발생할 수 있으므로 반드시 HAL의 주 버전을 3.0으로 업그레이드하고 create_audio_patchrelease_audio_patch 메서드를 구현해야 합니다.

유효성 검사

OEM의 필수 작업은 HAL 구현을 업데이트하는 것입니다. 오디오 HAL용 VTS를 사용하면 구현이 정상적으로 작동하는지 확인할 수 있습니다. 모든 테스트는 VTS 파일에서 확인할 수 있습니다.