볼륨 관리

볼륨 관리는 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는 볼륨 키 이벤트를 앱으로 라우팅합니다. 자동차 구현에서는 이러한 주요 이벤트가 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 로 재생되는 터치 상호작용 톤은 예외입니다.

더킹 시 고려 사항

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

충분히 격리된 여러 사운드 스테이지가 있는 차량의 경우 더킹 대신 차량의 여러 영역으로 오디오를 라우팅할 수 있습니다. 예를 들어, 내비게이션 지침은 운전석 헤드레스트 스피커로 전달되는 동시에 실내 전체에서 일반 볼륨으로 음악을 계속 재생할 수 있습니다.

안전에 중요한 소리

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 의 합리적인 렌더링을 제공합니다.

예를 들어 다음 예에서는 voice_communicationvoice_communication_signalling 포함하는 VolumeGroup 정의합니다. 자동차 설정 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() 사용하세요.

자동차볼륨 단체행사

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

  • CarVolumeGroupInfo 목록
  • EventTypes (비트맵)
  • ExtraInfos 목록

자동차볼륨그룹정보

이벤트 콜백 수신자는 영향을 받은 자동차 볼륨 그룹 정보 목록에 즉시 액세스할 수 있습니다. 이는 앱이 최신 상태를 가져오기 위해 자동차 오디오 프레임워크를 추가로 호출할 필요가 없음을 의미합니다. 수신된 CarVolumeGroupInfos 사용하여 to update the UI or internal states. To make it easier for apps, the aspects that changed in a car volume group are also provided as part of .

이벤트 유형

CarVolumeGroupInfo의 어떤 측면이 변경되었는지 정의합니다. 앱은 이를 사용하여 변경 사항을 식별하고 필요한 조치를 취할 수 있습니다. 예를 들어 EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED 는 해당 CarVolumeGroups' maximum volume gain index has changed and can be queried by .

다음 표는 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.isMute()
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 열 과부하로 인한 활성 과도 감쇠를 나타냅니다. 볼륨을 높이려고 하면 앱에서 사용자에게 알릴 수 있습니다.

우리는 ExtraInfos 에 대해 어떠한 프로세스도 시행하지 않습니다. ExtraInfos 기반으로 프로세스를 결정하는 것은 귀하의 재량에 달려 있습니다. 예를 들어 EXTRA_INFO_TRANSIENT_ATTENUATION_DUCKED 로 인해 감쇠가 활성화된 경우 사용자가 볼륨을 변경하지 못하도록 처음에 볼륨 표시줄 UI를 페이드하도록 선택할 수도 있습니다. 다른 사람들은 더킹이 활성화되어 있다는 알림을 표시하고 사용자가 볼륨을 변경할 수 있도록 선택할 수도 있습니다.

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

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

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

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

  • 콜백을 등록하려면 CarAudioManager#registerCarVolumeGroupEventCallback() 사용하세요.

  • 콜백을 등록 취소하려면 CarAudioManager#unregisterCarVolumeGroupEventCallback() 사용하세요.

앱이 새로운 CarVolumeGroupEventCallback 및 레거시 CarVolumeCallback 에 등록되면 CarVolumeGroupEventCallbacks 이벤트가 우선적으로 적용됩니다. 자동차 오디오 스택은 더 이상 CarVolumeCallback 트리거하지 않습니다. 이렇게 하면 동일한 이벤트에 대해 동일한 앱에 대한 중복 트리거를 방지할 수 있습니다.

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

오디오 게인 콜백

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

HAL API

오디오컨트롤 @2.0 AIDL

AudioControl AIDL HAL 버전 2.0에는 다음 API가 추가되었습니다.

API 목적
IAudioControl#registerGainCallback AudioControl HAL을 사용하여 IAudioGainCallback 의 인스턴스를 등록합니다.
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 콜백으로 Apps와도 통신됩니다.

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

  • 사용자는 Volume 앱을 사용하여 볼륨 인덱스를 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(End-of-Line) 구성.

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

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

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

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

설계

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

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

    발견되면 AudioControl::IModuleChangeCallback 통해 콜백이 생성됩니다.

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

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

  • 콜백.

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

    • CarVolumeGroupEvent 업데이트된 CarVolumeGroupInfo , Event-type(변경된 내용) 및 Extra-info(변경된 이유)를 전달합니다.

영상

그림 1. 동적 볼륨 구성.

HAL API

오디오컨트롤 @ 3.0 AIDL

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

API
IAudioControl#setModuleChangeCallback AudioControl HAL을 사용하여 IModuleChangeCallback의 인스턴스를 설정합니다.
IAudioControl#clearModuleChangeCallback AudioControl HAL을 사용하여 이전에 설정된 IModuleChangeCallback의 인스턴스를 지웁니다.
IModuleChangeCallback#onAudioPortsChanged AudioPort에 대한 변경 사항을 알리는 콜백

순서

동적 볼륨 구성의 순서 다이어그램은 다음과 같습니다.

영상

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

주요 측면

이 기능을 최적화하려면 다음을 고려하십시오.

  • 콜백의 일부로 제공되는 AudioPort는 자동차 BUS 정의와 일치 해야 합니다 .

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

  • 둘 이상의 오디오 BUS가 동일한 볼륨 그룹에 속할 경우 각각은 동일한 볼륨 범위 정의를 가져야 합니다 . 그렇게 하지 않으면 자동차 오디오 프레임워크가 새로운 볼륨 범위 정의를 거부하게 됩니다.