볼륨 관리

볼륨 관리는 CarAudioService에 포함되어 있습니다. 이 볼륨은 볼륨이 소프트웨어가 아닌 하드웨어 앰프에 의해 HAL 아래에 적용될 것으로 예상하고 고정 볼륨을 사용합니다. CarAudioService는 출력 장치를 볼륨 그룹으로 구성하여 볼륨 그룹과 연결된 모든 기기에 동일한 게인을 적용합니다.

고정 볼륨

AAOS 구현은 소프트웨어 믹서 대신 하드웨어 앰프를 사용하여 볼륨을 제어합니다. 부작용을 방지하려면 config_useFixedVolume 플래그를 true로 설정합니다 (필요한 경우 오버레이).

<resources>
    <!-- Car uses hardware amplifier for volume. -->
    <bool name="config_useFixedVolume">true</bool>
</resources>

config_useFixedVolume 플래그가 설정되지 않은 경우 (또는 false로 설정된 경우) 앱은 AudioManager.setStreamVolume()를 호출하여 소프트웨어 믹서의 스트림 유형별로 볼륨을 변경할 수 있습니다. 이는 다른 앱에 미칠 수 있는 잠재적인 효과와 소프트웨어 믹서의 볼륨 감쇠로 인해 하드웨어 앰프가 수신할 때 신호에서 사용 가능한 중요 비트 수가 적어지기 때문에 항상 바람직한 것은 아닙니다.

볼륨 그룹

볼륨 그룹은 오디오 영역 내 기기 모음의 볼륨을 관리합니다. 각 볼륨 그룹의 볼륨을 독립적으로 제어할 수 있습니다. 결과 게인은 연결된 기기에 구성되어 차량 앰프에 의해 적용됩니다. 볼륨 설정은 사용자에게 유지되며 사용자가 로그인할 때 로드됩니다.

볼륨 그룹 정의

CarAudioService는 car_audio_configuration.xml에 정의된 볼륨 그룹을 사용합니다.

<audioZoneConfiguration version="2.0">
    <zones>
        <zone name="primary zone" isPrimary="true">
            <volumeGroups>
                <group>
                    <device address="bus0_media_out">
                        <context context="music"/>
                    </device>
                </group>
                <group>
                    <device address="bus1_navigation_out">
                        <context context="navigation"/>
                    </device>
                    <device address="bus2_voice_command_out">
                        <context context="voice_command"/>
                    </device>
                </group>
                ...
            </volumeGroups>
        </zone>
     </zones>
</audioZoneConfiguration>

각 볼륨 그룹에는 연결된 주소가 있는 출력 장치가 하나 이상 포함되어야 합니다. 주소는 audio_policy_configuration.xml에 정의된 출력 장치와 일치해야 합니다.

볼륨 그룹 게인 구성

각 볼륨 그룹에는 최소, 최대, 기본 게인 값과 볼륨 그룹과 연결된 기기의 audio_policy_configuration.xml에 구성된 값에 기반한 단계 크기가 있습니다.

<devicePort tagName="bus0_media_out" role="sink" type="AUDIO_DEVICE_OUT_BUS" address="bus0_media_out">
  <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
  <gains>
    <gain name="" mode="AUDIO_GAIN_MODE_JOINT"
      minValueMB="-3200" maxValueMB="600" defaultValueMB="0" stepValueMB="100"/>
  </gains>
</devicePort>

초기화 중에 볼륨 그룹은 연결된 기기의 게인 값을 확인하고 다음과 같이 그룹을 구성합니다.

  • 단계 크기. 볼륨 그룹으로 제어되는 모든 기기에서 동일해야 합니다.
  • 최소 게인. 그룹의 기기 중 가장 작은 최소 게인입니다.
  • 최대 게인. 그룹의 기기 중 가장 높은 최대 게인입니다.
  • 기본 게인. 그룹의 기기 중 가장 높은 기본 게인입니다.

이러한 값이 구성되는 방식을 고려할 때 볼륨 그룹과 연결된 기기에 지원되는 범위 밖에 있는 볼륨 그룹의 게인을 설정할 수도 있습니다. 이 경우 해당 기기의 경우 볼륨 그룹의 값이 범위보다 낮은지 아니면 범위를 초과하는지에 따라 게인이 기기의 최소 또는 최대 게인 값으로 설정됩니다.

볼륨 그룹 식별자

볼륨 그룹은 런타임 시 XML 파일에 정의된 순서대로 식별됩니다. ID의 범위는 오디오 영역 내에서 0부터 N-1까지이며, 여기서 N는 해당 영역의 볼륨 그룹 수입니다. 이런 식으로 볼륨 그룹 ID는 영역 간에 고유하지 않습니다. 이러한 식별자는 볼륨 그룹과 연결된 CarAudioManager API에 사용됩니다. zoneId 없이 groupId를 사용하는 모든 API는 기본 오디오 영역으로 기본 설정됩니다.

다중 영역 볼륨 관리

각 오디오 영역에는 하나 이상의 볼륨 그룹이 있어야 하며 각 볼륨 그룹은 단일 오디오 영역과만 연결됩니다. 이 관계는 car_audio_configuration.xml의 일부로 정의됩니다. 자세한 내용은 위의 볼륨 그룹 정의에 있는 예를 참고하세요.

각 영역의 현재 볼륨 수준은 영역과 연결된 사용자에게 유지됩니다. 이러한 설정은 영역별로 적용됩니다. 즉, 사용자가 기본 영역과 연결된 디스플레이에서 로그인한 다음 나중에 보조 오디오 영역과 연결된 영역에 로그인하면 첫 번째 영역에 로드되고 유지되는 볼륨 수준은 보조 영역의 볼륨 수준과 다릅니다.

볼륨 키 이벤트 처리

Android에서는 볼륨 제어를 위해 다음을 비롯한 여러 키 코드를 정의합니다.

  • KEYCODE_VOLUME_UP
  • KEYCODE_VOLUME_DOWN
  • KEYCODE_VOLUME_MUTE

기본적으로 Android는 볼륨 키 이벤트를 앱으로 라우팅합니다. Automotive 구현은 CarAudioService에서 이러한 키 이벤트를 강제로 처리한 후 적절하게 setGroupVolume 또는 setMasterMute를 호출하도록 해야 합니다. 이 동작을 강제하려면 config_handleVolumeKeysInWindowManager 플래그를 true로 설정합니다.

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

볼륨 키 이벤트는 현재 의도한 영역을 구별할 수 없으며 모두 기본 오디오 영역과 연결된 것으로 가정됩니다. 볼륨 키 이벤트가 수신되면 CarAudioService는 활성 플레이어의 오디오 컨텍스트를 가져온 다음 우선순위가 가장 높은 오디오 컨텍스트와 연결된 출력 장치가 포함된 볼륨 그룹을 조정하여 조정할 볼륨 그룹을 결정합니다. 우선순위는 CarVolume.AUDIO_CONTEXT_VOLUME_PRIORITY에 정의된 고정 순서에 따라 결정됩니다.

페이드 및 밸런스

두 버전의 AudioControl HAL에는 모두 차량의 페이드와 밸런스를 설정하는 API가 있습니다. CarAudioManager에 상응하는 시스템 API는 AudioControl HAL에 값을 전달합니다. 이 API에는 android.car.permission.CAR_CONTROL_AUDIO_VOLUME이 필요합니다. AudioControl API는 다음과 같습니다.

  • setBalanceTowardRight(float value)는 스피커 볼륨을 차량의 오른쪽 (+) 또는 왼쪽 (-)으로 이동합니다.

    • 0.0을 가운데 맞춤
    • +1.0이 완전히 맞음
    • -1.0 남음
    • -1과 1의 범위를 벗어난 값은 오류입니다.
  • setFadeTowardFront(float value)는 스피커 볼륨을 자동차의 전면 (+) 또는 후면 (-)으로 이동합니다.

    • 0.0을 가운데 맞춤
    • +1.0이 완전히 앞으로 옴
    • -1.0은 완전히 뒤쪽에 있음
    • -1과 1의 범위를 벗어난 값은 오류입니다.

이러한 값을 적용하는 방법과 사용자에게 값을 표시하는 방법을 결정합니다. 미디어에만 적용하거나 전반적으로 모든 Android 사운드에 적용할 수 있습니다. Android 11에는 오디오 효과를 출력 장치에 적용하기 위한 지원도 도입되었습니다. 이를 통해 이러한 API를 사용하는 대신 적절한 출력 장치의 오디오 효과를 통해 페이드와 밸런스를 관리할 수 있습니다.

오디오 볼륨 낮추기

오디오 볼륨 낮추기는 동시에 재생되는 다른 스트림이 더 선명하게 들리도록 차량이 한 스트림의 게인을 낮추면 발생합니다. AAOS에서 오디오 볼륨 낮추기는 HAL에 의해 구현됩니다. Android는 OS 이외의 사운드를 제어할 수 없습니다. Android 11에서 볼륨 낮추기 결정을 위해 HAL에 제공되는 기본 정보는 두 출력 장치 모두에 활성 스트림이 있는지 여부입니다.

볼륨 낮추기가 필요한 경우

HAL에서 볼륨 낮추기를 처리하는 방식은 개별 OEM에 달려 있지만 다음 가이드라인을 따르는 것이 좋습니다.

  • Android에서는 일반적으로 두 앱 또는 서비스가 동시에 오디오 포커스를 보유할 때 여러 스트림이 재생됩니다. Android에서 동시 포커스를 부여할 수 있는 경우를 알아보려면 제한 유형에서 상호작용 매트릭스를 참고하세요. 자동차 오디오 플러그인이 도입되면서 이는 AudioFocus 관리에 따라 달라집니다.

  • Android에서 믹싱하는 모든 스트림은 게인이 적용되기 전에 믹싱됩니다. 따라서 다른 스트림과 동시에 재생될 때 볼륨을 낮춰야 하는 모든 스트림은 별도의 출력 장치로 라우팅되어야 합니다. 그래야 HAL이 스트림을 믹싱하기 전에 볼륨 낮추기를 적용할 수 있습니다.

다음은 잠재적인 동시 상호작용 볼륨 낮추기를 권장합니다.

상호작용 작업
EMERGENCY SAFETY을(를) 제외한 모든 항목을 덕킹 또는 음소거합니다.
SAFETY EMERGENCY을(를) 제외한 모든 항목을 덕킹합니다.
NAVIGATION SAFETYEMERGENCY를 제외한 모든 항목을 덕킹합니다.
CALL SAFETY, EMERGENCYNAVIGATION를 제외한 모든 항목을 덕킹합니다.
VOICE 오리 CALL_RING
VEHICLE_SOUNDS 활성 사운드의 중요성과 다른 사운드의 덕킹 여부를 결정합니다.
MUSICANNOUNCEMENT 모든 소리에 흠뻑 빠졌습니다. SYSTEM_SOUND로 재생되는 터치 상호작용 알림음은 예외입니다.

볼륨 낮추기 시 고려사항

내비게이션이나 어시스턴트와 같은 일부 앱과 서비스에서는 여러 플레이어를 사용하여 작업을 실행할 수 있습니다. 내비게이션 또는 어시스턴트 앱에서 다음 재생이 시작되기 전에 미디어가 볼륨을 낮추기 전에 볼륨이 전체 볼륨으로 돌아가지 않도록 하려면 데이터 스트림이 출력 장치를 통해 흐르지 않을 때 공격적인 볼륨 낮추기를 피하세요.

충분히 격리되는 여러 사운드 단계가 있는 차량의 경우 볼륨을 낮추는 대신 자동차의 다른 영역으로 오디오를 라우팅할 수 있습니다. 예를 들어 내비게이션 지침을 운전자의 머리 받침대 스피커로 라우팅하면서 운전석 공간 전체에서 일반 볼륨으로 계속 음악을 재생할 수 있습니다.

안전에 중요한 사운드

Android 11에서는 HAL 오디오 포커스 API를 도입했습니다. HAL은 안전에 중요한 사운드가 다른 사운드보다 우선하도록 합니다. HAL이 USAGE_EMERGENCY의 오디오 포커스를 보유한 경우 Android의 앱과 서비스가 사운드를 재생하지 않는다는 보장은 없습니다. HAL은 안전에 중요한 사운드를 재생하기 위해 Android의 어떤 스트림을 믹싱 또는 음소거해야 하는지 결정합니다.

볼륨 설정 UI 구성

AAOS는 볼륨 그룹 구성에서 볼륨 설정 UI를 분리합니다. 이는 볼륨 그룹 게인 구성에 설명된 대로 오버레이할 수 있습니다. 이렇게 분리하면 볼륨 그룹 구성이 변경되어도 변경할 필요가 없습니다.

자동차 설정 UI에서 packages/apps/Car/Settings/res/xml/car_volume_items.xml에는 정의된 각 AudioAttributes.USAGE와 연결된 UI 요소 (제목 및 아이콘 리소스)가 포함되어 있습니다. 이 파일은 각 VolumeGroup에 포함된 첫 번째 인식된 사용과 연결된 리소스를 사용하여 정의된 VolumeGroups의 적절한 렌더링을 제공합니다.

예를 들어 다음 예에서는 VolumeGroupvoice_communicationvoice_communication_signalling를 포함하는 것으로 정의합니다. 자동차 설정 UI의 기본 구현은 voice_communication와 연결된 리소스를 사용하여 VolumeGroup를 렌더링합니다. 이 리소스가 파일의 첫 번째 매트이기 때문입니다.

<carVolumeItems xmlns:car="http://schemas.android.com/apk/res-auto">
    <item car:usage="voice_communication"
          car:title="@*android:string/volume_call"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="voice_communication_signalling"
          car:title="@*android:string/volume_call"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="media"
          car:title="@*android:string/volume_music"
          car:icon="@*android:drawable/ic_audio_media"/>
    <item car:usage="game"
          car:title="@*android:string/volume_music"
          car:icon="@*android:drawable/ic_audio_media"/>
    <item car:usage="alarm"
          car:title="@*android:string/volume_alarm"
          car:icon="@*android:drawable/ic_audio_alarm"/>
    <item car:usage="assistance_navigation_guidance"
          car:title="@string/navi_volume_title"
          car:icon="@drawable/ic_audio_navi"/>
    <item car:usage="notification_ringtone"
          car:title="@*android:string/volume_ringtone"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="assistant"
          car:title="@*android:string/volume_unknown"
          car:icon="@*android:drawable/ic_audio_vol"/>
    <item car:usage="notification"
          car:title="@*android:string/volume_notification"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="notification_communication_request"
          car:title="@*android:string/volume_notification"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="notification_communication_instant"
          car:title="@*android:string/volume_notification"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="notification_communication_delayed"
          car:title="@*android:string/volume_notification"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="notification_event"
          car:title="@*android:string/volume_notification"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="assistance_accessibility"
          car:title="@*android:string/volume_notification"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="assistance_sonification"
          car:title="@*android:string/volume_unknown"
          car:icon="@*android:drawable/ic_audio_vol"/>
    <item car:usage="unknown"
          car:title="@*android:string/volume_unknown"
          car:icon="@*android:drawable/ic_audio_vol"/>
</carVolumeItems>

위의 구성에 사용된 속성과 값은 packages/apps/Car/Settings/res/values/attrs.xml에 선언됩니다. 볼륨 설정 UI는 다음과 같은 VolumeGroup 기반 CarAudioManager API를 사용합니다.

  • getVolumeGroupCount(): 그려야 하는 컨트롤 수를 알아봅니다.
  • getGroupMinVolume()getGroupMaxVolume(): 하한 및 상한을 가져옵니다.
  • getGroupVolume(): 현재 볼륨을 가져옵니다.
  • 볼륨 변경 알림을 받으려면 registerVolumeChangeObserver()하세요.

자동차 볼륨 그룹 이벤트

볼륨 업데이트 및 음소거 전환과 같은 Automotive 사용 사례에는 볼륨 설정과 같은 특정 앱의 작업을 정의할 수 있는 상황별 토대가 있습니다. 자동차 오디오 스택의 현재 볼륨과 음소거 콜백은 제한된 상황 정보를 제공합니다. 자동차 사용 사례와 향후 확장성을 개선하기 위해 CarVolumeGroupEvent가 Android 14에 추가되었습니다. 각 이벤트는 세 가지 중요한 유형의 정보를 전달합니다.

  • CarVolumeGroupInfo의 목록
  • EventTypes (비트 매핑됨)
  • ExtraInfos의 목록

자동차 볼륨 그룹 정보

이벤트 콜백 수신자는 영향을 받은 자동차 볼륨 그룹 정보 목록에 액세스할 준비가 되었습니다. 즉, 앱은 최신 상태를 가져오기 위해 자동차 오디오 프레임워크를 추가로 호출할 필요가 없습니다. 단순히 수신된 CarVolumeGroupInfos를 사용하여 UI 또는 내부 상태를 업데이트할 수 있습니다. 앱을 더 쉽게 사용할 수 있도록 아래 설명처럼 자동차 볼륨 그룹에서 변경된 요소도 EventTypes의 일부로 제공됩니다.

이벤트 유형

CarVolumeGroupInfo의 어떤 측면이 변경되었는지 정의합니다. 앱은 이를 사용하여 변경사항을 식별하고 필요한 작업을 실행할 수 있습니다. 예를 들어 EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED는 각 CarVolumeGroups 최대 볼륨 게인 지수가 변경되었으며 CarVolumeGroupInfo.getMaxVolumeGainIndex()로 쿼리할 수 있음을 나타냅니다.

다음 표는 EventTypeCarVolumeGroupInfo의 관계를 보여줍니다.

이벤트 유형 자동차 볼륨 그룹 정보
EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED CarVolumeGroupInfo.getVolumeGainIndex()
EVENT_TYPE_VOLUME_MIN_INDEX_CHANGED CarVolumeGroupInfo.getMinVolumeGainIndex()
EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED CarVolumeGroupInfo.getMaxVolumeGainIndex()
EVENT_TYPE_MUTE_CHANGED CarVolumeGroupInfo.isMuted()
EVENT_TYPE_VOLUME_BLOCKED_CHANGED개 CarVolumeGroupInfo.isBlocked()
EVENT_TYPE_ATTENUATION_CHANGED됨 CarVolumeGroupInfo.isAttenuated()
EVENT_TYPE_ZONE_CONFIGURATION_CHANGED(이벤트 유형 변경) CarVolumeGroupInfo.getAudioAttributes()

추가 정보

CarVolumeGroup가 변경된 이유에 관한 추가 정보를 제공합니다. 앱은 이 정보를 사용하여 사용자에게 조치를 취하거나 알리도록 알리는 추가 컨텍스트를 제공할 수 있습니다. 예를 들어 EXTRA_INFO_TRANSIENT_ATTENUATION_THERMAL는 열 과부하로 인한 일시적인 활성 감쇠를 나타냅니다. 사용자가 볼륨을 높이려고 하면 앱에서 사용자에게 알릴 수 있습니다.

Google에서는 ExtraInfos에 대한 프로세스를 강제하지 않습니다. ExtraInfos에 따라 프로세스를 결정하는 것은 재량에 달려 있습니다. 예를 들어 EXTRA_INFO_TRANSIENT_ATTENUATION_DUCKED로 인해 감쇠가 활성화되면 사용자가 볼륨을 변경하지 못하도록 볼륨 바 UI를 처음에 페이드 아웃하도록 선택할 수도 있습니다. 다른 개발자는 볼륨 낮추기가 활성 상태라는 토스트 메시지를 표시하고 사용자가 볼륨을 변경할 수 있도록 선택할 수 있습니다.

자동차 오디오 프레임워크는 AudioControl HAL IAudioGainCallback에 따라 추천된 ExtraInfos를 제공합니다. 자세한 내용은 오디오 게인 콜백을 참고하세요.

CarVolumeGroupEvent는 자동차 오디오 프레임워크의 향후 요구사항에 맞게 확장됩니다. Google에서는 CarVolumeGroupEvent 를 통해서만 새로운 기능을 지원할 예정입니다. 앱 개발자는 CarVolumeGroupEvent를 사용하여 그룹 볼륨을 처리하고 변경사항을 음소거하는 것이 좋습니다.

자동차 볼륨 그룹 이벤트 콜백

Android 14에서는 권한 있는 앱과 플랫폼 앱을 등록하고 CarVolumeGroupEvents에 관한 알림을 받을 수 있는 새로운 콜백을 제공합니다.

  • 콜백에 등록하려면 CarAudioManager#registerCarVolumeGroupEventCallback()를 사용합니다.

  • 콜백을 등록 취소하려면 CarAudioManager#unregisterCarVolumeGroupEventCallback()를 사용합니다.

앱이 새 CarVolumeGroupEventCallback 및 기존 CarVolumeCallback에 등록되면 CarVolumeGroupEventCallbacks 이벤트에 우선순위가 지정됩니다. 자동차 오디오 스택이 더 이상 CarVolumeCallback를 트리거하지 않습니다. 이렇게 하면 동일한 이벤트에 대해 동일한 앱으로 중복 트리거가 발생하는 것을 방지할 수 있습니다.

CarVolumeGroupEventCallback를 사용하여 그룹 볼륨을 관리하고 변경사항을 음소거하는 것이 좋습니다.

오디오 게인 콜백

Android 13부터 AudioControl HAL은 비동기 콜백을 트리거하여 자동차 오디오 시스템 변경으로 인한 볼륨 수준 업데이트를 관리할 수 있습니다.

HAL API

AudioControl @2.0 AIDL

AudioControl AIDL HAL 버전 2.0에는 다음 API가 추가됩니다.

API 목적
IAudioControl#registerGainCallback IAudioGainCallback의 인스턴스를 AudioControl HAL에 등록합니다.
IAudioGainCallback#onAudioDeviceGainsChanged 오디오 게인 구성의 변경사항을 알리는 비동기식 콜백입니다.

AudioControl HAL 콜백에는 이유 목록과 다음으로 구성된 각 AudioGainConfigInfo가 포함되어 있습니다.

  • 영역 ID
  • 기기 포트 주소
  • 볼륨 색인 > 색인은 제한된 색인 또는 업데이트 색인일 수 있습니다.

그 이유는 크게 다음과 같이 분류할 수 있습니다.

  • 제한 사유. 볼륨 및 음소거 동작이 일시적으로 변경됨
  • 업데이트 이유. 볼륨 동작이 영구적으로 변경됩니다.

제한사항 유형

AudioControl HAL AIDL V3부터 다음과 같은 유형의 제한사항이 지원됩니다.

  • 음소거
  • 차단
  • 제한사항
  • 감쇠
활성 제한 사용자가 트리거한 볼륨 변경 사용자 트리거 숨기기 전환
음소거 ❌ (음소거 해제)

✔ (음소거)
차단
제한사항 ❌ (한도 초과)

✔ (한도 미만)
감쇠

제한 간의 우선순위는 음소거 > 차단 > 제한 > 감쇠입니다.

숨기기 제한

숨기기 제한은 다음과 같습니다.

  • Reasons.TCU_MUTE
  • Reasons.REMOTE_MUTE

자동차 오디오 프레임워크는 내부적으로 다음 두 가지 음소거 상태를 유지합니다.

  • 사용자 숨기기. CarAudioManager 또는 주요 이벤트를 통해 사용자의 요청에 따라 전환됩니다.

  • HAL 음소거. AudioGain 콜백을 통해 수신된 음소거 제한을 기반으로 전환됩니다.

설정 앱과 같은 리스너의 경우 전반적인 볼륨 그룹의 음소거(CarVolumeGroupInfo.isMuted()) 상태는 위의 음소거 중 하나가 사용 설정되었는지에 따라 달라집니다.

HAL 음소거가 사용 설정되면 수신되는 모든 볼륨 변경 및 그룹 음소거 해제 요청은 제한 기간 동안 무시됩니다.

상호작용 사례: HAL 음소거가 활성 상태이며 사용자의 음소거 전환 요청

HAL 음소거가 사용 설정되고 사용자 음소거가 사용 중지된 경우:

  • 볼륨 그룹의 전체 음소거 상태가 true(으)로 변경됩니다.
  • 사용자의 숨기기 사용 설정 요청이 처리됩니다.
    • 이유: 사용자 개인 정보 보호를 위해 사용자 숨기기 요청은 항상 이루어져야 합니다.

HAL 음소거가 사용 설정되고 사용자 음소거가 사용 설정된 경우:

  • 볼륨 그룹의 전체 음소거 상태가 true(으)로 변경됩니다.

  • 음소거를 사용 중지해 달라는 사용자의 요청이 NOT 처리됩니다. 캐시된 사용자 음소거 상태는 사용 설정된 상태로 유지됩니다.

    • 이유: 사용자의 숨기기 취소 요청은 활성 제한이 없는 경우에만 인정됩니다.

    • 이유: 캐시된 사용자 음소거를 음소거 해제하면 의도치 않은 사운드 폭발이 발생하고 사용자의 안전을 위협할 수 있습니다. 점화 주기 전반에 걸쳐 음소거 상태가 사용 설정되어 사용자가 음질을 인식하는 데 방해가 되는 경우에 특히 그렇습니다.

상호작용 사례: 사용자 음소거에 변경사항이 없는 동안 HAL 음소거가 사용 설정 및 사용 중지됨

HAL 음소거를 전환하면 볼륨 그룹 전체 음소거 상태가 변경됩니다. 그러나 사용자 음소거 상태는 직접 업데이트되지 않습니다. 사용자 음소거가 사용 중지되고 사용 설정할 HAL 음소거 콜백이 수신되면 다음을 충족해야 합니다.

  • 볼륨 그룹의 전체 음소거 상태가 true(으)로 변경됩니다.
  • HAL 음소거가 사용 설정된 동안 사용자의 볼륨 변경 요청은 NOT 처리됩니다.

    • 이유: 음소거가 사용 설정되어 있는 동안 사용자가 소리를 인식할 수 없습니다. 볼륨 변경을 허용하면 소리가 폭발하여 사용자 안전을 위협할 수 있습니다.

    • 이유: OEM에서 예상한 동작인 경우 볼륨 앱은 콜백을 등록하고 사용자 개입 없이 음소거 해제(CarAudioManager.setVolumeGroupMute(...,/* mute=*/ true,..))를 자동으로 트리거할 수 있습니다.

사용자 음소거가 사용 중지된 상태에서 HAL 음소거가 사용 중지되는 경우:

  • 볼륨 그룹 음소거 상태가 false(으)로 변경되었습니다.

    이유: 음소거 상태를 고정하고 사용자에게 음소거 해제를 요청하면 음소거 상태가 자주 전환될 때 사용자가 불필요하게 방해를 받을 수 있습니다.

  • 사용자의 볼륨 변경 요청은 정상적으로 처리됩니다.

차단

차단 제한은 다음과 같습니다.

  • Reasons.FORCED_MASTER_MUTE
  • Reasons.REMOTE_MUTE
  • Reasons.TCU_MUTE.

차단 제한이 활성화되면 사용자로부터 다음을 요청할 수 있습니다.

  • 볼륨 변경은 처리되지 않습니다.
  • 음소거 전환 버튼이 처리됩니다.

제한사항

제한사항은 다음과 같습니다.

  • Reasons.THERMAL_LIMITATION
  • Reasons.SUSPEND_EXIT_VOL_LIMITATION

제한사항 제한이 활성화되면 다음과 같은 사용자의 요청이 전송됩니다.

  • 볼륨 변경:

    • 제한 내에서 처리됨
    • 위의 제한사항은 처리되지 않습니다.
  • 음소거 전환 버튼이 처리됩니다.

감쇠

감쇠 제한사항은 다음과 같습니다.

  • Reasons.ADAS_DUCKING
  • Reasons.NAV_DUCKING
  • Reasons.PROJECTION_DUCKING

감쇠 제한이 활성화되면 사용자의 다음 요청:

  • 볼륨 변경이 처리됩니다. 새로운 현재 볼륨 수준은 이전 볼륨이 아닌 감쇠된 볼륨으로 설정됩니다. 앞으로 볼륨은 이 수준에서 변경됩니다.

  • 음소거 전환 버튼이 처리되었습니다.

색인으로 업데이트

Reasons.EXTERNAL_AMP_VOL_FEEDBACK는 비동기 볼륨 색인 업데이트로 간주됩니다.

이러한 이유로 AudioControl HAL은 볼륨 그룹의 현재 색인을 지정된 색인으로 업데이트할 수 있습니다. 이는 주로 자동차 오디오 프레임워크의 볼륨 변경 요청을 위한 오디오 시스템의 피드백으로 사용됩니다. 또한 색인 업데이트는 CarVolumeGroupEvent 콜백으로 앱과 전달되어 색인을 동기화합니다.

예시

사용 사례: 사용자가 볼륨 지수를 30으로 업데이트합니다.

  • 사용자가 볼륨 앱을 사용하여 볼륨 지수를 30으로 변경합니다.

  • 이 색인은 볼륨 게인으로 변환되어 오디오 HAL로 전송됩니다.

  • Audio HAL의 공급업체 구현은 새로운 볼륨 게인을 수신하고 오디오 시스템 (예: 외부 앰프)을 업데이트합니다.

  • 오디오 시스템은 볼륨 수준이 색인 15로만 업데이트된다고 응답합니다(Android에서 알 수 없는 이유로).

  • AudioControl HAL 트리거의 공급업체 구현은 다음을 충족해야 합니다.

    IAudioGainCallback.onAudioDeviceGainsChanged(EXTERNAL_AMP_VOL_FEEDBACK, {...,  15 /* New index */})
    
  • 자동차 오디오 서비스는 지속성과 볼륨 앱 콜백에 사용되는 콜백에서 새 색인을 사용합니다. 사용자가 요청한 색인은 30입니다. 그러나 오디오 시스템 비동기 피드백은 색인을 15로 업데이트합니다.

사용 사례: 정지를 종료한 후 첫 번째 오디오 재생

  • 정지 전 볼륨 지수가 높은 수준인 95 (범위: [0~99])로 설정됩니다.

  • Android가 정지 상태로 전환됩니다.

  • Android가 존재하면 정지 (예: 재개)는 다음과 같습니다.

    • 공급업체 Audio HAL/AudioControl HAL는 30의 안전 인덱스를 로컬에서 오디오 시스템에 적용합니다.

    • 공급업체 AudioControl HAL는 안전 색인의 콜백도 트리거합니다.

    IAudioGainCallback.onAudioDeviceGainsChanged(SUSPEND_EXIT_VOL_LIMITATION, {...,  30 /* safe index */})
    
  • 자동차 오디오 서비스는 지속성에 사용되는 콜백에서 새 색인과 색인을 동기화하는 볼륨 앱에 관한 자체 콜백에서 사용합니다. 정지 전 볼륨 지수는 95입니다. 그러나 재개 후에 AudioControl HAL 구현자는 이 색인의 안전한 볼륨 수준인 30을 설정합니다.

동적 볼륨 구성

이 기능의 주요 사용 사례는 다음과 같습니다.

  1. 차량 라인 끝 (EOL) 구성.

    • 자동차 제조업체는 차량 오디오 시스템 설정에 따라 EOL에 볼륨 구성을 업데이트하는 것을 선호합니다. 일반적으로 Android SW 이미지를 업데이트하지 않는 사이드로드입니다.

    • 자동차 제조업체는 서비스 일정 중에 볼륨 구성을 업데이트해야 할 수 있습니다.

  2. 런타임 구성. 자동차 오디오 시스템은 외부 앰프 구성을 지원하며 이러한 ECU는 부팅 시 쿼리되는 볼륨 범위 구성을 호스팅할 수 있습니다.

  3. 주문형 구성. 사용자가 일정 기간 향상된 신호 처리를 구독하는 수요 기반 오디오 기능의 수요 증가를 지원하기 위해 제공됩니다. 새 볼륨 범위 구성은 구독 기간 동안 유효합니다.

디자인

동적 볼륨 구성은 다음 세 단계로 이루어집니다.

  • 탐색. 공급업체 AudioControl HAL 구현은 공급업체가 소유한 맞춤 IPC 메커니즘을 통해 새 볼륨 범위 업데이트를 검색합니다.

    검색된 콜백은 AudioControl::IModuleChangeCallback를 통해 생성됩니다.

  • 업데이트. 자동차 오디오 스택은 볼륨 그룹 상태를 새 볼륨 범위로 업데이트합니다.

    볼륨 범위 업데이트 후에도 동일한 볼륨 수준을 유지하기 위해 노력하고 있습니다. 하지만 색인이 범위를 벗어나면 현재 볼륨 색인은 안전한 값으로 설정됩니다. 콜백 중에 공급업체가 제공하는 기본 수준을 예로 들 수 있습니다.

  • 콜백.

    • 볼륨 그룹 범위 업데이트 후 자동차 오디오 스택은 CarVolumeGroupEventCallback를 통해 등록된 앱에 콜백을 트리거합니다.

    • CarVolumeGroupEvent는 업데이트된 CarVolumeGroupInfo, 이벤트 유형(변경된 항목) 및 추가 정보 (변경 이유)를 전달합니다.

이미지

그림 1. 동적 볼륨 구성

HAL API

AudioControl @ 3.0 AIDL

AudioControl AIDL HAL 버전 3.0에는 다음 API가 도입되었습니다.

API
IAudioControl#setModuleChangeCallback AudioControl HAL을 사용하여 IModuleChangeCallback의 인스턴스를 설정합니다.
IAudioControl#clearModuleChangeCallback 이전에 AudioControl HAL로 설정된 IModuleChangeCallback의 인스턴스를 삭제합니다.
IModuleChangeCallback#onAudioPortsChanged AudioPorts 변경사항을 알리는 콜백입니다.

순서

아래에는 동적 볼륨 구성의 시퀀스 다이어그램이 있습니다.

이미지

그림 2. 동적 볼륨 구성의 시퀀스 다이어그램

주요 특징

이 기능을 최적화하려면 다음 사항을 고려하세요.

  • 콜백의 일부로 제공된 AudioPort는 Automotive BUS 정의와 일치해야 합니다.

    • 기기 포트. IN_DEVICE, OUT_DEVICE
    • 연결. BUS
    • 주소. 오디오 HAL 정의에 정의됨
    • 게인 모드. JOINT
  • 공급업체는 오디오 HAL 정책에서 볼륨 범위 정의의 상위 집합을 정의하고 콜백을 사용하여 차량 변형에 맞게 맞춤설정해야 합니다. 자세한 내용은 IModuleChangeCallbac AIDL 정의를 참고하세요.

  • 두 개 이상의 오디오 BUS가 동일한 볼륨 그룹에 속하는 경우 각각 동일한 볼륨 범위 정의가 있어야 합니다. 이렇게 하지 않으면 자동차 오디오 프레임워크가 새 볼륨 범위 정의를 거부합니다.