결합된 오디오 장치 라우팅

결합된 오디오 장치 라우팅 기능은 동시에 여러 오디오 장치로 오디오 스트리밍 지원을 추가합니다. 이 기능을 사용하여 권한 있는 앱은 시스템 API를 통해 특정 전략 에 대해 여러 기본 장치를 선택할 수 있습니다. 앱은 이 기능에서 제공하는 공개 API를 사용하여 오디오 장치의 기능을 보다 정확하게 검색할 수 있습니다. Android 버전 11 이하의 경우 오디오 프레임워크 구현은 동시에 연결된 동일한 유형의 여러 오디오 장치(예: 2개의 Bluetooth A2DP 헤드셋)에 대한 지원이 제한적입니다. 또한 기본 오디오 라우팅 규칙은 사용자가 주어진 사용 사례에 대해 동일한 유형의 여러 장치를 선택하는 것을 허용하지 않습니다.

Android 12부터 오디오 브로드캐스팅, BLE 오디오 헤드폰 그룹으로 멀티캐스팅 또는 여러 USB 사운드 카드를 동시에 사용하는 것과 같은 새로운 사용 사례를 허용하기 위해 이러한 제한이 제거되었습니다.

이 페이지에서는 여러 오디오 장치에 오디오 스트리밍 지원을 구현하는 방법과 이 기능의 구현을 검증하는 방법을 다룹니다.

여러 오디오 장치로 오디오 스트리밍 지원

Android 12에는 이 기능을 지원하는 두 가지 API 세트가 있습니다.

  • 시스템 API는 전략에 대해 선호하는 여러 장치를 처리합니다.
  • 오디오 HAL의 일부로 공급업체에서 구현한 HIDL 인터페이스는 기기 기능을 보고합니다.

다음 섹션에서는 이러한 각 API에 대해 자세히 설명합니다.

전략에 대해 선호하는 여러 장치 처리

오디오 정책 관리자는 동시에 여러 오디오 장치로 오디오 스트리밍을 더 잘 지원하기 위해 시스템 API를 제공합니다. 이러한 시스템 API를 사용하면 주어진 전략에 대해 여러 기본 장치를 설정, 가져오기 및 제거할 수 있습니다. Android 12까지 이 기능은 단일 기기에서만 지원되었습니다.

오디오 정책 관리자는 미디어 재생을 위해 선택될 가능성이 가장 높은 장치를 설명하기 위해 활성 미디어 장치 의 개념을 도입했습니다. 분리 가능한 장치가 연결되면 이 장치로 라우팅할 수 있는 오디오 HAL 출력 스트림을 열고 지원되는 속성을 조사해야 할 수 있습니다.

출력 스트림을 열 때 오디오 장치를 지정해야 합니다. 활성 미디어 장치는 이 컨텍스트에서 출력 스트림이 열릴 때 사용되는 장치입니다.

활성 미디어 장치 선택은 연결되거나 연결 해제된 실제 장치에 따라 변경될 수 있습니다. 오디오 정책 관리자는 다음과 같은 일련의 규칙을 사용하여 활성 미디어 장치를 선택합니다.

  1. 미디어에 대한 기본 장치를 모두 사용할 수 있는 경우 모두 활성 장치로 선택됩니다.
  2. 그렇지 않으면 마지막으로 연결된 이동식 장치가 선택됩니다.
  3. 연결된 이동식 장치가 없는 경우 출력 장치 선택을 위한 기본 오디오 정책 규칙이 활성 장치를 선택하는 데 적용됩니다.

재생을 위한 최상의 구성이 선택되도록 출력 스트림이 다시 열리고 활성 장치로 라우팅되려면 다음 기준을 충족해야 합니다.

  • 출력 스트림은 활성 장치를 지원해야 합니다.
  • 출력 스트림은 동적 프로필을 지원해야 합니다.
  • 출력 스트림은 현재 활성 장치로 라우팅되어서는 안 됩니다.

새 장치 선택을 적용하기 위해 오디오 정책 관리자는 출력 스트림이 유휴 상태인 경우 장치 연결 시 출력 스트림을 닫았다가 다시 열거나 출력 스트림이 대기 상태가 될 때 이를 연기합니다.

오디오 정책 관리자는 다음과 같은 시스템 API 목록을 제공합니다( AudioManager.java 에 정의됨).

  • setPreferredDeviceForStrategy

    주어진 전략에 대한 오디오 라우팅에 대한 기본 장치를 설정합니다. 선호하는 장치가 설정된 시점에는 장치를 사용하지 못할 수 있지만 일단 사용 가능하게 되면 사용됩니다.

  • removePreferredDeviceForStrategy

    setPreferredDeviceForStrategy 또는 setPreferredDevicesForStrategy 로 이전에 설정한 기본 오디오 장치를 제거합니다.

  • getPreferredDeviceForStrategy

    setPreferredDeviceForStrategy 또는 setPreferredDevicesForStrategy 로 이전에 설정된 오디오 전략의 기본 장치를 반환합니다.

  • setPreferredDevicesForStrategy

    주어진 전략에 대해 선호하는 장치를 설정합니다.

  • getPreferredDevicesForStrategy

    setPreferredDeviceForStrategy 또는 setPreferredDevicesForStrategy 로 이전에 설정된 오디오 전략에 대한 기본 장치를 반환합니다.

  • OnPreferredDevicesForStrategyChangedListener

    지정된 오디오 전략에 대해 설정된 기본 오디오 장치의 변경 알림을 위한 인터페이스를 정의합니다.

  • addOnPreferredDevicesForStrategyChangedListener

    전략 선호 오디오 장치의 변경 사항에 대한 알림을 받을 수신기를 추가합니다.

  • removeOnPreferredDevicesForStrategyChangedListener

    전략 선호 오디오 장치에 변경 사항에 대해 이전에 추가한 수신기를 제거합니다.

보고 장치 기능

오디오 HAL 구현의 일부로 공급업체는 보고 장치 기능을 지원하는 API를 구현합니다. 이 섹션에서는 기기 기능을 보고하는 데 사용되는 데이터 유형 및 방법을 설명하고 여러 기기를 지원하기 위해 오디오 HIDL HAL V7에서 변경된 몇 가지 사항을 나열합니다.

데이터 유형

오디오 HIDL HAL V7에서 기기 기능은 AudioProfileAudioTransport 구조를 사용하여 보고됩니다. AudioTransport 구조는 알려진 오디오 형식에 대해 AudioProfile 을 사용하거나 플랫폼에서 알려지지 않은 형식에 대해 원시 하드웨어 설명자를 사용하여 오디오 포트의 기능을 설명합니다. AudioProfile 구조에는 오디오 형식, 프로필에서 지원하는 샘플 속도, 채널 마스크 목록이 포함되어 있습니다( types.hal 의 다음 코드 블록 참조).

/**
* Configurations supported for a certain audio format.
*/
struct AudioProfile {
   AudioFormat format;
   /** List of the sample rates (in Hz) supported by the profile. */
   vec<uint32_t> sampleRates;
   /** List of channel masks supported by the profile. */
   vec<AudioChannelMask> channelMasks;
};

오디오 HIDL HAL V7에서 AudioPort 데이터 유형은 장치의 기능을 설명하기 위해 AudioTransportAudioProfile 구조로 정의됩니다.

오디오 HAL 방법

오디오 정책 관리자는 다음 방법을 사용하여 장치의 기능을 쿼리합니다.

  • getParameters: 지원되는 오디오 형식 및 해당 샘플링 속도와 같은 공급업체별 매개변수 값을 검색하는 일반적인 방법입니다.
  • getAudioPort: 지정된 오디오 포트에 대해 지원되는 속성(샘플링 속도, 형식, 채널 마스크, 게인 컨트롤러 등) 목록을 반환합니다.

IDevice.hal 의 다음 코드는 getAudioPort 메서드에 대한 인터페이스를 보여줍니다.

   /**
    * Returns the list of supported attributes for a given audio port.
    *
    * As input, 'port' contains the information (type, role, address etc...)
    * needed by the HAL to identify the port.
    *
    * As output, 'resultPort' contains possible attributes (sampling rates,
    * formats, channel masks, gain controllers...) for this port.
    *
    * @param port port identifier.
    * @return retval operation completion status.
    * @return resultPort port descriptor with all parameters filled up.
    */
   getAudioPort(AudioPort port)
           generates (Result retval, AudioPort resultPort);

레거시 API 변경 사항

여러 오디오 프로필을 지원하기 위해 레거시 API 버전 3.2는 audio_port_v7 이라는 새로운 구조를 추가합니다. 자세한 내용은 소스 코드 를 참조하십시오.

audio_port_v7 의 추가로 인해 레거시 API 버전 3.2는 audio_port_v7 구조를 사용하여 기기의 기능을 쿼리하기 위해 get_audio_port_v7 이라는 새로운 API를 추가합니다.

get_audio_port_v7 audio.h 의 정의를 보여줍니다.

/**
 * Fills the list of supported attributes for a given audio port.
 * As input, "port" contains the information (type, role, address etc...)
 * needed by the HAL to identify the port.
 * As output, "port" contains possible attributes (sampling rates,
 * formats, channel masks, gain controllers...) for this port. The
 * possible attributes are saved as audio profiles, which contains audio
 * format and the supported sampling rates and channel masks.
 */
 int (*get_audio_port_v7)(struct audio_hw_device *dev,
                          struct audio_port_v7 *port);

레거시 API 버전이 3.2 미만이고 HIDL HAL 버전이 7 이상인 경우 레거시 get_audio_port API의 데이터를 새 AudioPort 형식으로 채워야 합니다. 이 경우 get_audio_port 에서 보고된 모든 샘플 속도와 채널 마스크는 반환된 모든 형식에 대해 지원되는 것으로 가정되어 get_audio_port 값에서 새 AudioPort 구조로의 직접적인 매핑을 가능하게 합니다.

API 구현 예

이 섹션에서는 이전 섹션에서 다룬 API를 사용하는 메서드가 포함된 여러 테스트 모음에 대해 설명합니다. 이러한 API가 구현되고 사용되는 방법에 대한 몇 가지 예는 이러한 방법을 참조하십시오.

setPreferredDevicesForStrategy , getPreferredDevicesForStrategy , removePreferredDeviceForStrategyOnPreferredDevicesForStrategyChangedListener 시스템 API의 사용 예는 GTS에 있는 PreferredDeviceRoutingTest 메소드에 있습니다.

사용 중인 AudioDeviceInfo 의 새 구조 예를 보려면 CTS에 있는 AudioManagerTest#testGetDevices 메서드를 참조하세요.

audio_hal.c 에 대한 구현 예는 get_audio_port_v7 에 있으며 여러 장치에 대해 기능을 쿼리하는 방법을 보여줍니다.

확인

이 섹션에서는 Audio Manager의 CTS 및 GTS(Google Mobile Services Test Suite) 유효성 검사에 대한 정보를 제공합니다.

CTS 테스트

CTS 테스트는 android.media.cts.AudioManagerTest 에 있습니다.

다음은 사용 가능한 오디오 관리자 테스트 목록입니다.

  • AudioManagerTest#testGetDevices

    오디오 장치의 정확한 기능을 확인합니다. 또한 AudioDeviceInfo 구조에서 반환된 오디오 프로필이 이전의 병합된 배열 형식의 콘텐츠를 보존하지만 새 AudioProfile 형식인지 확인합니다.

  • AudioManagerTest#testPreferredDevicesForStrategyAudioManagerTest#testPreferredDeviceForCapturePreset

    전략 및 캡처 사전 설정 관련 API 테스트에 대한 기본 장치가 성공적으로 완료되었는지 확인합니다.

GTS 테스트

GTS 테스트는 com.google.android.gts.audioservice.AudioServiceHostTest 에 있습니다.

전략 및 캡처 사전 설정을 위한 기본 장치의 API가 올바르게 작동하는지 확인하려면 AudioServiceHostTest#testPreferredDeviceRoutingAudioServiceHostTest#testPreferredDeviceRoutingForCapturePreset 테스트를 실행하십시오.