결합된 오디오 기기 라우팅

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

Android 12부터는 오디오 방송이나 BLE 오디오 헤드폰 그룹으로 멀티캐스팅, 여러 USB 사운드 카드 동시 선택 등 새로운 사용 사례를 허용하도록 이러한 제한이 삭제됩니다. 여러 USB 기기로의 동시 라우팅은 지원되지 않습니다.

Android 14부터 USB 프레임워크는 USB 기기가 다양한 오디오 기기 유형이고 여러 USB 기기를 동시에 연결하기 위한 커널 및 공급업체 지원이 있는 경우 여러 USB 기기로의 라우팅을 지원합니다.

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

여러 오디오 기기로 오디오 스트리밍 지원

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

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

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

특정 전략을 위해 여러 기본 기기 처리

오디오 정책 관리자는 여러 오디오 기기로 동시에 오디오 스트리밍을 더 잘 지원하도록 시스템 API를 제공합니다. 이러한 시스템 API를 통해 지정된 전략을 위해 여러 기본 기기를 설정하고 가져오며 삭제할 수 있습니다. Android 12까지 이 기능은 단일 기기에서만 지원되었습니다.

오디오 정책 관리자에서는 미디어 재생용으로 선택할 가능성이 가장 큰 기기를 설명하는 활성 미디어 기기 개념을 도입합니다. 분리형 기기가 연결되면 이 기기로 라우팅할 수 있는 오디오 HAL 출력 스트림을 열고 지원되는 속성을 프로브해야 할 수 있습니다.

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

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

  1. 미디어의 모든 기본 기기가 사용 가능한 경우 모두 활성 기기로 선택됩니다.
  2. 선택되지 않으면 마지막으로 연결된 이동식 기기가 선택됩니다.
  3. 연결된 이동식 기기가 없다면 출력 장치 선택을 위한 기본 오디오 정책 규칙이 활성 기기 선택에 적용됩니다.

출력 스트림은 다시 열리고 활성 기기로 라우팅되도록 다음 기준을 충족해야 재생에 가장 적합한 구성이 선택될 수 있습니다.

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

새 기기 선택을 적용하기 위해 오디오 정책 관리자는 출력 스트림이 유휴 상태면 기기 연결 시 출력 스트림을 닫았다가 다시 엽니다. 또는 출력 스트림이 대기 상태가 되는 경우 출력 스트림을 연기합니다.

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

  • 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를 추가합니다.

audio.h의 다음 코드는 get_audio_port_v7 API의 정의를 보여줍니다.

/**
 * 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);

기존 get_audio_port API의 데이터는 기존 API 버전이 3.2 미만이고 HIDL HAL 버전이 7 이상일 때 새 AudioPort 형식으로 채워져야 합니다. 이 경우 get_audio_port에서 보고되는 모든 샘플링 레이트와 채널 마스크는 반환된 모든 형식에서 지원되는 것으로 간주되므로 get_audio_port 값에서 새 AudioPort 구조로 간단하게 매핑할 수 있습니다.

API 구현 예

이 섹션에서는 이전 섹션에서 다룬 API를 사용하는 메서드가 포함된 여러 테스트 모음을 설명합니다. 이러한 API의 구현 및 사용 방법에 관한 예는 이러한 메서드를 참고하세요.

setPreferredDevicesForStrategy, getPreferredDevicesForStrategy, removePreferredDeviceForStrategy, OnPreferredDevicesForStrategyChangedListener 시스템 API 사용 예는 CTS에 있는 PreferredDeviceRoutingTest 메서드에 있습니다.

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

get_audio_port_v7의 구현 예는 audio_hal.c에 있으며 여러 기기에서 기능이 쿼리되는 방식을 보여줍니다.

유효성 검사

이 섹션에서는 오디오 관리자의 CTS 및 GTS(Google 모바일 서비스 테스트 도구 모음) 유효성 검사에 관한 정보를 제공합니다.

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 테스트를 실행하세요.