다중 영역 오디오 라우팅

자동차 오디오 서비스는 Core Audio 동적 오디오 정책을 사용하여 자동차에서의 사용 사례를 용이하게 합니다.

  • 각 오디오 영역에서 사운드의 동시 재생을 허용하는 다중 영역 오디오를 통해 승객별 각각 오디오 재생

  • 동적 오디오 영역 구성

  • 승객 기본 영역 오디오 전송

  • 승객의 오디오 미러링

각 사용 사례에서 자동차 오디오 서비스는 동적 오디오 정책을 사용하여 자동으로 오디오를 지정된 출력 장치로 라우팅합니다.

다중 영역 오디오

다중 영역 오디오를 사용하면 여러 사용자가 동시에 AAOS와 상호작용할 수 있습니다. 일련의 출력 장치가 영역과 연결되어 있으며 각 영역은 오디오 포커스와 볼륨 수준을 유지합니다. 승객은 운전자가 기본 영역(일반적으로 운전석 공간)에서 듣고 있는 오디오 소스와 다른 자신의 오디오를 들을 수 있습니다.

다중 영역 오디오 아키텍처

자동차 오디오 서비스 아키텍처

그림 1. 자동차 오디오 서비스 아키텍처

자동차 오디오 영역은 오디오 출력, 오디오 포커스, 기타 오디오 설정을 추상화한 것으로 이러한 요소는 각각 개별적으로 관리할 수 있습니다. 라우팅을 위해 각 영역은 오디오 정책 구성에 정렬된 오디오 출력 버스 기기 세트로 정의됩니다. 기기는 각 오디오 영역 정의마다 다릅니다. 그림 1에서 버스 기기 1~5는 영역 0에 속하고 버스 기기 6~8은 영역 1에 속하며 버스 기기 9~11은 영역 2에 속합니다.

자동차 오디오 구성

일반적으로 출력 장치는 오디오 영역 하나에 할당됩니다. 각 오디오 영역은 car_audio_configuration.xml에서 정의됩니다. 다음 코드 스니펫은 그림 1의 자동차 오디오 구성을 보여줍니다.

<carAudioConfiguration version="3">
    <zones>
        <zone name="Zone0" audioZneId="0" occupantZoneId="0">
            <zoneConfigs>
                <zoneConfig name="config0" isDefault="true">
                   <volumeGoups>
                        <group>
                            <device address="bus_1">
                                <context context="music"/>
                            </device>
                        </group>
                        <group>
                            <device address="bus_2">
                                <context context="navigation"/>
                            </device>
                        </group>
                        ...
                    </volumeGroups>
                </zoneConfig>
            </zoneConfigs>
        </zone>
        <zone name="Zone1" audioZoneId="1" occupantZoneId="1">
            <zoneConfigs>
                <zoneConfig name="config0" isDefault="true">
                    <volumeGroups>
                        <group>
                            <device address="bus_6">
                                <context context="music"/>
                            </device>
                        </group>
                        <group>
                            <device address="bus_7">
                                <context context="navigation"/>
                           </device>
                       </group>
                       ...
                    </volumeGroups>
                </zoneConfig>
            </zoneConfigs>
        </zone>
        ...
    ...
   </zones>
</carAudioConfiguration>

occupantZoneIdCarOccupantZoneManager로 관리되는 자동차 서비스 정의입니다. 자동차에서 사용자와 특정 좌석 위치 간 매핑을 정의하는 데 사용됩니다. CarOccupantZoneService는 또한 점유 영역에서 디스플레이와 기타 주변기기, 사용자가 디스플레이에 로그인한 후 사용자로의 매핑을 정의합니다. 오디오 영역에는 다음이 포함됩니다.

  • 오디오 영역 ID와 점유 영역 ID

    • 오디오 영역을 점유 영역(좌석, 디스플레이, 기타 주변기기)에 매핑합니다.
    • 로그인 시 오디오 영역으로 할당되는 사용자 ID를 매핑합니다.
  • 오디오 구성 목록 각 오디오 구성에는 일련의 볼륨 그룹이 있습니다. 각 볼륨 그룹에는 일련의 오디오 버스 기기가 있습니다.

    • 볼륨이 변경되면 그룹의 모든 오디오 기기가 동일하게 제어됩니다.

    • 각 오디오 기기에는 오디오 속성 목록이 할당됩니다. 이 정보는 다르게 할당된 오디오 속성을 사용하여 오디오 정책 믹스를 구성하는 데 사용됩니다.

이 구성을 사용하면 다양한 오디오 속성 용도가 각 영역의 여러 출력 장치로 라우팅될 수 있습니다. 사용 사례에 따라 다양한 사운드가 동시에 재생될 수 있습니다. 예를 들어 모든 스피커에서 미디어 사운드를 재생하지만 내비게이션 사운드는 운전자와 가장 가까운 스피커에서만 재생하도록 운전석 공간(기본 영역)을 구성할 수 있습니다. 사운드의 동시 재생을 통해 운전석에서는 내비게이션이 운전자에게 전달되는 동안 미디어를 계속 듣습니다.

다중 영역 오디오 승객 로그인 워크플로

아래 시퀀스 다이어그램은 승객이 해당 디스플레이에 로그인할 때 오디오 라우팅을 사용 설정하는 흐름을 보여줍니다.

이미지

그림 2.

이 시퀀스에서 사용자 로그인은 점유 영역 서비스를 통해 자동차 오디오 서비스에 전파됩니다.

  1. 자동차 오디오 서비스(특정 오디오 영역용)는 AudioPolicy#removeUserIdDeviceAffinity API를 사용하여 사용자 기기 어피니티를 삭제합니다. 이 API는 사용자 ID를 사용합니다. 이 경우에는 이전 영역의 사용자입니다.

  2. AudioPolicy#setUserIdDeviceAffinity API는 신규 사용자를 영역에 할당하며 이 영역은 특정 영역 구성의 사용자 ID와 모든 기기를 가져옵니다.

동적 영역 구성

Android 14에서는 OEM이 승객 기기를 다양하게 구성할 수 있도록 동적 영역 구성이 도입되었습니다. 사용 사례를 통해 뒷좌석의 승객이 뒷좌석 머리 받침대 스피커와 뒷좌석 헤드폰 주변기기 간에 전환할 수 있습니다.

이 경우에는 두 가지 구성이 필요합니다. 뒷좌석 머리 받침대 및 헤드폰 주변기기용으로 각각 하나의 구성이 필요합니다. 특정 사용자의 오디오는 한 번에 한 구성으로 라우팅됩니다.

동적 영역 구성 워크플로

그림 3. 동적 영역 구성 워크플로

그림 3은 동적 영역 구성 워크플로의 아키텍처를 보여줍니다. 오디오 영역 1에는 두 가지 구성 Config 0Config 1이 포함되어 있으며 각각 출력 장치 스피커 및 머리 받침대와 연결됩니다.

로그인 시 사용자에게는 자동으로 기본 구성이 할당됩니다. 사용자가 구성 변경을 선택하면(일반적으로 시스템 UI 사용) 자동차 오디오 서비스는 두 구성 간에 전환을 실행합니다. 이를 통해 출력 장치가 Z1 스피커와 Z1 머리 받침대 간에 전환됩니다.

아래 코드 스니펫은 이러한 동적 영역 구성에 관한 설정을 보여줍니다.

<carAudioConfiguration version="3">
    <zones>
        <zone name="Zone1" audioZoneId="1" occupantZoneId="1">
            <zoneConfigs>
                <zoneConfig name="Zone 1 Config 0" isDefault="true">
                    <volumeGroups>
                        <group>
                            <device address="bus_100">
                                <context context="music"/>
                                    ***
                            </device>
                        </group>
                    </volumeGroups>
                </zoneConfig>
                <zoneConfig name="Zone 1 Config 1">
                    <volumeGroups>
                        <group>
                            <device address="bus_101">
                                <context context="music"/>
                                    ***
                            </device>
                        </group>
                    </volumeGroups>
                </zoneConfig>
            </zoneConfigs>
        </zone>
    </zones>

오디오 구성 관리를 용이하게 하기 위해 자동차 오디오 관리자는 다음과 같이 구성을 관리하는 API를 노출합니다.

  • 영역에서 사용할 수 있는 구성 쿼리
  • 현재 설정된 영역 구성 쿼리
  • 다른 구성으로 전환

시스템 UI 앱 또는 서비스는 이러한 API를 사용하여 오디오 영역의 구성을 관리할 수 있습니다(그림 4 참고). Query API는 두 가지를 승객에게 노출합니다. 사용자는 원하는 구성의 명령어를 탭하여 다른 구성을 선택할 수 있습니다.

동적 영역 구성 워크플로

그림 4. 동적 영역 구성 워크플로

기본 영역 승객 오디오 전송

기본 영역 승객 오디오 전송은 Android 14에서 도입된 기능으로, 승객이 기본 영역에서 미디어 오디오를 전송할 수 있습니다. 이 방식으로 승객의 미디어 오디오는 운전자가 완전한 제어를 유지하는 동안 운전석 공간으로 전송될 수 있습니다.

아래 그림은 기본 영역 승객 미디어 오디오 전송의 아키텍처를 간략하게 보여줍니다.

동적 영역 구성 워크플로

그림 5. 동적 영역 구성 워크플로

이 이미지는 운전자의 미디어 출력 장치가 승객과 공유됨을 보여줍니다. 이는 승객이 기본 영역 모드로 전송 중일 때만 발생합니다. 동적 오디오 정책은 운전자의 오디오 라우팅을 관리하는 데도 사용되지만 운전자의 기기 어피니티에는 변경사항이 적용되지 않습니다. 승객의 경우 출력 장치 목록은 다음과 같이 변경됩니다.

  • 승객의 미디어 출력 장치가 기기 목록에서 삭제됩니다.
  • 운전자의 미디어 출력 장치가 기기 목록에 추가됩니다.
  • 승객 오디오 영역의 나머지 출력 장치가 기기 목록에 유지됩니다.

새로운 이 기기 목록은 AudioPolicy#setUserIdDeviceAffinity API를 통해 승객에게 할당됩니다. 이 API에 전달된 매개변수는 기기 목록과 승객 사용자 ID입니다. 오디오 시스템의 오디오 정책 서비스가 승객과 연결된 미디어 트랙에 관해 선택할 오디오 믹스를 쿼리하면 기본 영역과 연결된 미디어 오디오 믹스가 선택됩니다.

기본 영역 오디오 전송의 주요 요구사항은 기본 영역의 미디어 출력 장치가 다른 오디오 속성 용도와 분리되어야 한다는 것입니다. 그러지 않으면 오디오 믹스 구성 중에 다른 오디오 속성이 믹스에 추가됩니다. 믹스 선택을 오디오 시스템에서 실행하면 믹스에 연결된 모든 사운드가 기본 운전석에서 재생에 선택됩니다.

승객 영역 오디오 미러링

오디오 미러링 기능을 사용하면 승객이 오디오를 공유할 수 있습니다. 이 미러링 기능은 각 오디오 영역의 오디오 데이터를 복제하므로 모든 승객이 동일한 오디오를 들을 수 있습니다. 이 경우 오디오 포커스는 오디오 미러링에 관여하는 승객과 공유됩니다.

오디오 미러링 라우팅

오디오 미러링을 사용 설정하려면 승객이 최소 두 명 필요합니다. 따라서 승객 오디오 영역이 두 개만 있는 오디오 구성에는 미러링 출력 장치 하나가 필요합니다. 위의 정의를 사용하면 두 개의 동시 미러링 세션을 시작할 수 있습니다.

아래 그림은 두 승객 간의 다중 영역 오디오 미러링에 관한 간소화된 다이어그램을 보여줍니다. 두 승객의 오디오는 오디오 미러링 기기 bus_1000으로 라우팅됩니다. 오디오 HAL은 소스 영역에 신호를 복제합니다.

동적 영역 구성 워크플로

그림 6. 동적 영역 구성 워크플로

이 라우팅은 승객이 미러링 모드일 때 사용 설정됩니다. 미러링 모드가 아니면 오디오 영역의 해당 기기가 승객에게 할당됩니다. 미러링이 처음으로 승객에게 사용 설정되면 AudioPolicy#setUserIdDeviceAffinity API가 다음과 같이 라우팅을 수정합니다.

  • 승객의 미디어 출력 장치가 기기 목록에서 삭제됩니다.
  • 미러링 출력 장치가 기기 목록에 추가됩니다.
  • 승객 오디오 영역의 나머지 출력 장치가 기기 목록에 유지됩니다.

기기 목록을 사용하면 API가 업데이트된 기기 목록과 승객의 사용자 ID로 호출됩니다. 다음 이미지는 오디오 미러링 워크플로의 시퀀스 다이어그램을 보여줍니다.

오디오 미러링 워크플로

그림 7. 오디오 미러링 워크플로

그림 7에서 오디오 미러링을 관리하는 자동차 오디오 관리자의 API는 미디어 시스템 서비스에서 호출됩니다. 구체적으로 사용자 1과 사용자 2의 오디오 미러링을 사용 설정하는 API CarAudioManager#enableMirrorForAudioZones입니다.

자동차 오디오 서비스는 위에 설명된 대로 사용자 승객의 오디오 라우팅을 구성합니다. 또한 자동차 오디오 서비스는 오디오 HAL에 신호를 보내 미러링 기기의 오디오를 구성하고 상응하는 영역에 복제합니다.

위 이미지에서 자동차 오디오 서비스는 mirroring_src=bus_1000;mirroring_dest=bus_10,bus_20을 보냅니다.

여기서

bus_1000은 소스 버스이고 bus_10bus_20은 대상 버스입니다.

시퀀스 다이어그램에 표시되지 않은 것은 AudioManager#setParameters API를 통해 전송된 신호입니다. 이 신호는 오디오 서비스를 통해 HAL에 도달합니다.

오디오 미러링을 사용 중지하면 다음 신호가 전송됩니다. mirroring_src=bus_1000;mirroring=off 이 신호는 오디오 미러링이 사용 설정되어 있지 않을 때 HAL이 오디오 복제를 사용 중지하는 데 사용할 수 있습니다. 오디오 미러링 기기를 정의하기 위해 자동차 오디오 구성 파일에는 mirroringDevices라는 섹션이 포함되어 있습니다(아래 스니펫 참고).

이 스니펫에는 미러링 기기 bus_1000bus_2000이 정의되어 있어 승객 네 명이 오디오 미러링을 사용할 수 있습니다.

<carAudioConfiguration version="3">
   <mirroringDevices>
       <mirroringDevice address="bus_1000"/>
       <mirroringDevice address="bus_2000"/>
   </mirroringDevices>
  <zones>
    ....
  </zones>
</carAudioConfiguration>