자동차 오디오 구성

Android 10에서는 car_audio_configuration.xmlcar_volumes_groups.xmlIAudioControl.getBusForContext를 대체했습니다. 일반적으로 공급업체 파티션에 포함된 오디오 정책 파일은 보드의 오디오 하드웨어 구성을 나타냅니다. car_audio_configuration.xml에 참조된 모든 기기는 audio_policy_configuration.xml에서 정의해야 합니다.

아래 그림 1은 자동차 오디오 서비스 아키텍처의 대략적인 개요를 보여줍니다. 여기서 자동차 오디오 서비스는 자동차 오디오 구성 파일을 읽고 기기의 오디오를 설정합니다.

자동차 오디오 아키텍처 개요

그림 1. 자동차 오디오 아키텍처 개요

기기의 vendor\etc\ 또는 system\etc\에 자동차 오디오 구성 파일을 배치하며 vendor\etc\는 자동차 오디오 서비스가 파일을 찾는 첫 번째 위치가 됩니다. 자동차 오디오 서비스는 car_audio_configuration.xml을 읽고 오디오 구성을 확인합니다.

자동차 오디오 영역은 다음과 같습니다.

  • 각 오디오 영역에는 고유한 오디오 영역 ID가 포함됩니다.
  • 각 오디오 영역은 점유 영역에 매핑할 수 있습니다.
  • 각 영역의 오디오 작업은 서로 독립되어 있습니다.

    • 오디오 포커스
    • 오디오 라우팅
    • 오디오 볼륨 낮추기
  • 자동차 볼륨 그룹은 다음과 같습니다.

    • 볼륨 그룹이 포함된 모든 오디오 기기는 동일한 게인 변경사항으로 함께 제어됩니다. 한 그룹에 있는 모든 기기의 오디오 게인 구성은 동일해야 합니다.

    • 오디오 기기 매핑에 대한 오디오 컨텍스트. 오디오 용도를 출력 장치에 매핑하는 오디오 믹스를 구성하는 데 사용합니다.

    • 모든 오디오 컨텍스트는 영역 내에서 나타내야 합니다. 이렇게 하면 모든 오디오 속성 용도의 오디오 라우팅을 정확하게 설정할 수 있습니다.

오디오 컨텍스트

AAOS 오디오 구성을 단순화하기 위해 유사한 용도가 CarAudioContexts로 그룹화되었습니다. 이러한 오디오 컨텍스트는 CarAudioService 전체에서 라우팅, 볼륨 그룹, 오디오 포커스, 볼륨 낮추기 관리를 정의하는 데 사용됩니다. AAOS의 정적 오디오 컨텍스트는 아래에 나열되어 있습니다.

이 표에서는 오디오 컨텍스트와 용도 간의 매핑을 설명합니다. 새 시스템 용도에는 강조 표시된 행이 제공됩니다.

CarAudioContext 연결된 AttributeUsages
MUSIC UNKNOWN
GAME
MEDIA
NAVIGATION ASSISTANCE_NAVIGATION_GUIDANCE
VOICE_COMMAND ASSISTANT
ASSISTANCE_ACCESSIBILITY
CALL_RING NOTIFICATION_RINGTONE
CALL VOICE_COMMUNICATION
VOICE_COMMUNICATION_SIGNALING
ALARM ALARM
NOTIFICATION NOTIFICATION
NOTIFICATION_*
SYSTEM_SOUND ASSISTANCE_SONIFICATION
EMERGENCY EMERGENCY
SAFETY SAFETY
VEHICLE_STATUS VEHICLE_STATUS
ANNOUNCEMENT ANNOUNCEMENT

AAOS 라우팅 사용 설정

AAOS 기반 라우팅을 사용하려면 audioUseDynamicRouting 플래그를 true로 설정해야 합니다.

<resources>
    <bool name="audioUseDynamicRouting">true</bool>
</resources>

false인 경우 라우팅 및 많은 CarAudioService가 사용 중지되며 AAOS는 AudioService의 기본 동작으로 대체됩니다.

기본 영역

기본적으로 모든 오디오는 기본 영역으로 라우팅됩니다. 기본 영역은 하나만 있으며 구성에서 isPrimary="true" 속성으로 표시됩니다. 기본 영역에는 자동으로 Audiomanager.PRIMARY_AUDIO_ZONE이 할당됩니다.

샘플 구성(버전 2)

예를 들어 차량에는 기본 영역과 뒷좌석 엔터테인먼트 시스템이라는 두 영역이 있을 수 있습니다. 이 시나리오에서는 다음과 같이 가능한 car_audio_configuration.xml 버전 2를 설계할 수 있습니다.

<audioZoneConfiguration version="2.0">
       <zone name="primary zone" isPrimary="true">
           <volumeGroups>
               <group>
                   <device address="bus0_media_out">
                       <context context="music"/>
                       <context context="announcement"/>
                   </device>
                   <device address="bus3_call_ring_out">
                       <context context="call_ring"/>
                   </device>
                   <device address="bus6_notification_out">
                       <context context="notification"/>
                   </device>
               </group>
               <group>
                   <device address="bus1_navigation_out">
                       <context context="navigation"/>
                   </device>
                   <device address="bus2_voice_command_out">
                       <context context="voice_command"/>
                   </device>
               </group>
               <group>
                   <device address="bus4_call_out">
                       <context context="call"/>
                   </device>
               </group>
               <group>
                   <device address="bus5_alarm_out">
                       <context context="alarm"/>
                   </device>
               </group>
               <group>
                   <device address="bus7_system_sound_out">
                       <context context="system_sound"/>
                       <context context="emergency"/>
                       <context context="safety"/>
                       <context context="vehicle_status"/>
                   </device>
               </group>
           </volumeGroups>
       </zone>
        <zone name="rear seat zone" audioZoneId="1">
           <volumeGroups>
               <group>
                   <device address="bus100_rear_seat">
                       <context context="music"/>
                       <context context="navigation"/>
                       <context context="voice_command"/>
                       <context context="call_ring"/>
                       <context context="call"/>
                       <context context="alarm"/>
                       <context context="notification"/>
                       <context context="system_sound"/>
                       <context context="emergency"/>
                       <context context="safety"/>
                       <context context="vehicle_status"/>
                       <context context="announcement"/>
                   </device>
               </group>
           </volumeGroups>
    </zones>
</audioZoneConfiguration>

이 예에서 기본 영역은 일부 오디오 컨텍스트를 여러 기기로 분리합니다. 이렇게 하면 HAL이 다양한 후처리 효과를 적용하고, 차량의 하드웨어를 사용하여 각 기기에서 출력을 믹싱할 수 있습니다. 기기는 여러 볼륨 그룹(미디어, 내비게이션, 통화, 알람, 시스템 사운드)으로 정렬되었습니다. 시스템이 useFixedVolume으로 구성된 경우 각 그룹의 볼륨 수준이 HAL로 전달되어 이러한 기기의 출력에 적용됩니다.

기본 영역의 경우 시스템 사운드가 다른 사운드와 분리되는 것이 좋습니다. 이렇게 하면 교통 사운드를 더 높은 우선순위로 처리할 수 있습니다. 자동차 오디오 서비스는 포커스 및 볼륨 낮추기 관리 측면에서 이미 이러한 교통 사운드를 구분합니다. 예를 들어 긴급 사운드 포커스 요청의 우선순위가 다른 포커스 요청보다 높습니다.

편의를 위해 보조 영역 예에서는 모든 오디오 컨텍스트가 단일 기기와 하나의 볼륨 그룹으로 라우팅됩니다.

점유 영역 오디오 구성

Android 11에서는 car_audio_configuration.xml에 새로운 두 필드 audioZoneIdoccupantZoneId가 도입되었습니다. audioZoneId는 오디오 영역 관리를 제어하는 데 사용하고 occupantZoneId는 사용자 ID에 따라 라우팅을 구성하는 데 사용할 수 있습니다.

위의 오디오 구성을 사용하고 점유 영역 ID와 오디오 영역 ID 간의 매핑을 위한 새 필드를 활용하면 볼륨 그룹 정의가 없는 새 구성을 다음과 같이 설정할 수 있습니다.

<audioZoneConfiguration version="2.0">
       <zone name="primary zone" isPrimary="true" occupantZoneId="0">
         ...
       </zone>
       <zone name="rear seat zone" audioZoneId="1" occupantZoneId="1">
         ...
       </zone>
    </zones>
</audioZoneConfiguration>

위의 구성은 기본 영역을 점유 영역 0으로, audioZoneId 1을 occupantZoneId 1로 매핑하도록 정의합니다. 일반적으로 점유 영역과 오디오 영역 간의 매핑을 구성할 수 있습니다. 하지만 매핑은 일대일이어야 합니다. 새로운 두 필드를 정의한 규칙은 아래에 나열되어 있습니다.

  • 기본 영역의 audioZoneId는 항상 PRIMARY_AUDIO_ZONE ID입니다. isPrimary="true"가 정의되면 audioZoneId는 필요하지 않습니다.

  • audioZoneIdoccupantZoneId 번호는 반복될 수 없습니다.

  • audioZoneIdoccupantZoneId는 일대일 매핑만 가질 수 있습니다.

Android 14 자동차 오디오 구성

Android 14에서는 AAOS에 OEM 플러그인 서비스가 도입되었습니다. 이 서비스를 사용하면 자동차 오디오 서비스에서 관리하는 오디오 동작을 더 적극적으로 관리할 수 있습니다. 새 플러그인 서비스와 함께 다음 변경사항이 자동차 오디오 구성 파일에 추가되었습니다.

  • OEM 정의 자동차 오디오 컨텍스트
  • 비 기본 영역 동적 구성

OEM 정의 자동차 오디오 컨텍스트

유연하게 오디오를 구성할 수 있도록 Android 14에서는 자동차 오디오 서비스에서 위에 설명된 정적 오디오 컨텍스트와 다르게 오디오 용도를 그룹화할 수 있습니다. 이 OEM 정의 컨텍스트는 car_audio_configuration.xml 버전 3 파일에서 정의할 수 있습니다.

대신 현재 정의된 정적 오디오 컨텍스트가 사용됩니다. OEM 정의 자동차 오디오 컨텍스트의 일반 형식은 아래에 나와 있습니다.

OEM 컨텍스트 각각에는 컨텍스트에 할당되는 오디오 속성 용도 목록과 함께 name이 있어야 합니다. 위의 예에서는 두 컨텍스트가 다음과 같이 정의됩니다.

<carAudioConfiguration version="3">
    <oemContexts>
        <oemContext name="media">
            <audioAttributes>
                <usage value="AUDIO_USAGE_MEDIA" />
    <usage value="AUDIO_USAGE_UNKNOWN"/>
            </audioAttributes>
        </oemContext>
        <oemContext name="game">
            <audioAttributes>
                <usage value="AUDIO_USAGE_GAME" />
            </audioAttributes>
        </oemContext>
...
  • media 컨텍스트에는 AUDIO_USAGE_MEDIAAUDIO_USAGE_UNKNOWN이 포함됩니다.
  • game 컨텍스트에는 AUDIO_USAGE_GAME 포함됩니다.

컨텍스트는 car_audio_configuration.xml 파일 상단에 정의되어야 합니다. OEM 컨텍스트가 정의되면 나머지 자동차 오디오 구성은 이전처럼 진행할 수 있습니다. 다음 규칙이 자동차 오디오 컨텍스트에 적용됩니다.

  • OEM 컨텍스트 정의는 선택사항입니다. 정적 오디오 컨텍스트가 대신 사용됩니다.

  • 컨텍스트 이름은 반복하지 않습니다.

  • 오디오 속성 용도를 여러 컨텍스트에 할당하지 않습니다.

  • AudioAttributes에 정의된 모든 오디오 용도는 컨텍스트를 구성하는 데 사용해야 합니다.

엄밀히 말하면 오디오 용도의 android.audio.policy.configuration.V7_0.AudioUsage 문자열 표현은 OEM 오디오 컨텍스트 정의에 사용해야 합니다. 앞으로는 최신 오디오 속성 용도가 가장 적합한 컨텍스트에 할당되어 하나의 Android 버전을 다른 버전으로 이전하는 동안 오류를 줄이게 됩니다.

OEM 플러그인 오디오 서비스를 더욱 확장하기 위해 OEM 정의 컨텍스트가 도입되었지만 OEM 플러그인 서비스 없이도 계속 사용할 수 있습니다. 오디오 동작은 정적 오디오 서비스 동작과 비슷합니다.

  • 오디오 포커스 상호작용. 오디오 속성은 오디오 포커스 상호작용 매트릭스에서 설정된 가장 일치하는 동작을 결정하는 데 사용됩니다. 자세한 내용은 오디오 포커스를 참고하세요.

  • 오디오 볼륨 제어 오디오 속성은 다음과 같이 가장 일치하는 항목을 결정하는 데 사용됩니다.

    • OEM 정의 컨텍스트에 기반한 볼륨 그룹
    • 구성된 정적 볼륨 목록의 우선순위
  • 오디오 볼륨 낮추기 동작:

    • 현재 오디오 포커스의 오디오 속성 용도는 자동차 오디오 구성 파일에 정의된 대로 출력 오디오 기기 정보에 매핑하는 데 사용됩니다.

    • 오디오 속성은 정적 오디오 볼륨 낮추기 매트릭스에 따라 볼륨을 낮출 해당 정적 컨텍스트를 매핑하는 데 사용됩니다.

동적 오디오 영역 구성

Android 14에서는 동적 오디오 영역 구성을 수용하기 위해 오디오 영역을 정의하는 자동차 오디오 구성 스키마도 버전 3으로 업데이트되었습니다. 새 스키마를 사용하려면 각 영역에 구성을 설정해야 합니다.

<carAudioConfiguration version="3">
    <!-- optional OEM context -->
    <oemContexts>
      <oemContext name="media">
        <audioAttributes>
          <usage value="AUDIO_USAGE_MEDIA" />
          <usage value="AUDIO_USAGE_UNKNOWN"/>
        </audioAttributes>
      </oemContext>
      <oemContext name="game">
        <audioAttributes>
          <usage value="AUDIO_USAGE_GAME" />
        </audioAttributes>
      </oemContext>
...
    </oemContexts>
  <zones>
    <zone name="primary zone" isPrimary="true" occupantZoneId="0">
      <zoneConfigs>
        <zoneConfig name="primary zone config 0" isDefault="true">
          <volumeGroups>
            <group>
              <device address="bus0_media_out">
                <context context="media"/>
            <context context="game"/>
                <context context="announcement"/>
              </device>
              <device address="bus6_notification_out">
                <context context="notification"/>
              </device>
            </group>
  ...
      </zoneConfigs>
    </zone
  </zones>

자세한 내용은 device/generic/car/emulator/audio/car_audio_configuration.xml에 정의된 버전 3 파일을 참고하세요. Android 14부터 기본 영역에는 구성이 하나만 포함될 수 있습니다. 비 기본 영역에는 여러 구성이 있을 수 있습니다. 다음 규칙이 자동차 오디오 구성에 적용됩니다.

  • 기본 오디오 영역에는 하나의 구성 포함될 수 있습니다.

  • 비 기본 오디오 영역에는 여러 구성이 있을 수 있습니다.

  • 이름은 각 오디오 영역과 오디오 영역 구성에서 고유해야 합니다.

  • 오디오 영역 내에서 오디오 구성은 다음과 같이 다를 수 있습니다.

    • 볼륨 그룹 설정은 동일하지 않아도 됩니다.
    • 오디오 컨텍스트 할당은 동일하지 않아도 됩니다.
  • 오디오 출력 장치 이름은 영역이나 구성 전체에서 고유해야 합니다. 기기 이름은 오디오 구성이나 영역에서 한 번 표시되어야 합니다.

  • 동일한 볼륨 그룹에 속하는 오디오 기기는 오디오 게인 구성이 동일해야 합니다.

  • 모든 오디오 컨텍스트(OEM 또는 정적)는 각 오디오 구성에 할당되어야 합니다.

향후 호환성

새로운 버전의 car_audio_configuration.xml은 각 업데이트에서 새로운 기능을 도입하지만 최신 버전의 AAOS에서는 여전히 이전 파일을 사용할 수 있습니다. 새 버전의 Android로 업데이트하는 OEM은 car_audio_configuration.xml 파일을 재사용할 수 있습니다.

car_audio_configuration.xml에 포함된 새 정보가 필요한 새로운 기능을 사용하려면 버전을 업데이트해야 합니다. 파일 버전에서 지원되지 않는 정보가 포함된 이전 버전의 해당 파일을 사용하려고 하면 자동차 서비스가 시작될 때 IllegalStateException이 발생합니다. 예외 메시지에는 사용되는 정보와 필요한 최소 버전에 관한 정보가 포함됩니다.