볼륨 관리는 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 |
SAFETY 및 EMERGENCY 를 제외한 모든 스트림의 볼륨 낮추기 |
CALL |
SAFETY , EMERGENCY , NAVIGATION 를 제외한 모든 스트림의 볼륨 낮추기 |
VOICE |
오리 CALL_RING |
VEHICLE_SOUNDS |
활성 사운드의 중요도 및 다른 사운드의 볼륨을 낮춰야 할지 여부를 결정합니다. |
MUSIC 및 ANNOUNCEMENT |
다른 모든 스트림이 볼륨을 낮출 수 있어야 합니다. 예외는 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
의 적절한 렌더링을 제공합니다.
예를 들어 다음 예에서는 VolumeGroup
를 voice_communication
및 voice_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()
: 볼륨 변경 시 알림을 받습니다.
자동차 볼륨 그룹 이벤트
볼륨 업데이트 및 음소거 전환의 자동차 사용 사례에는 볼륨 설정과 같은 특정 앱의 작업을 정의할 수 있는 문맥 기반이 있습니다. 자동차 오디오 스택의 현재 볼륨 및 음소거 콜백은 제한된 컨텍스트 정보를 제공합니다. 자동차 사용 사례와 향후 확장성을 더 효과적으로 지원하기 위해 CarVolumeGroupEvent가 Android 14에 추가되었습니다. 각 이벤트에는 다음과 같은 세 가지 중요한 정보 유형이 포함됩니다.
CarVolumeGroupInfo
목록EventTypes
(비트 매핑됨)ExtraInfos
목록
CarVolumeGroupInfo
이벤트 콜백의 수신자는 영향을 받은 차량 볼륨 그룹 정보 목록에 즉시 액세스할 수 있습니다. 즉, 앱이 최신 상태를 가져오기 위해 자동차 오디오 프레임워크를 추가로 호출할 필요가 없습니다. 수신된 CarVolumeGroupInfos
를 사용하여 UI 또는 내부 상태를 업데이트할 수 있습니다. 앱이 더 쉽게 사용할 수 있도록 자동차 볼륨 그룹에서 변경된 측면은 아래에 설명된 대로 EventTypes
의 일부로 제공됩니다.
EventTypes
CarVolumeGroupInfo
의 어떤 측면이 변경되었는지 정의합니다. 앱은 이를 사용하여 변경사항을 식별하고 필요한 조치를 취할 수 있습니다. 예를 들어 EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED
는 각 CarVolumeGroups
최대 볼륨 이득 색인이 변경되었으며 CarVolumeGroupInfo.getMaxVolumeGainIndex()
로 쿼리할 수 있음을 나타냅니다.
다음 표는 EventType
와 CarVolumeGroupInfo
의 관계를 보여줍니다.
EventType | CarVolumeGroupInfo |
---|---|
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() |
ExtraInfos
CarVolumeGroup
가 변경된 이유에 관한 추가 정보를 제공합니다. 앱은 이 정보를 사용하여 사용자에게 조치를 취하도록 알리거나 알림을 제공하는 추가 컨텍스트를 제공할 수 있습니다. 예를 들어 EXTRA_INFO_TRANSIENT_ATTENUATION_THERMAL
는 열 과부하로 인한 활성 일시적 감쇠를 나타냅니다. 앱은 사용자가 볼륨을 높이려고 하면 이를 알릴 수 있습니다.
ExtraInfos
에 대해서는 프로세스를 시행하지 않습니다. ExtraInfos
를 기반으로 프로세스를 결정하는 것은 개발자의 재량에 맡겨집니다. 예를 들어 EXTRA_INFO_TRANSIENT_ATTENUATION_DUCKED
로 인해 감쇠가 활성화된 경우 사용자가 볼륨을 변경하지 못하도록 볼륨 표시줄 UI를 처음에 페이드 아웃하도록 선택할 수도 있습니다.
다른 앱은 음소거가 활성화되었다는 토스트를 표시하고 사용자가 볼륨을 변경하도록 허용할 수 있습니다.
자동차 오디오 프레임워크는 추천 ExtraInfos
를 제공하기 위해 AudioControl HAL IAudioGainCallback
에 종속됩니다. 자세한 내용은 오디오 게인 콜백을 참고하세요.
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
가 포함되며, 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으로 설정됩니다.
동적 볼륨 구성
이 기능의 경우 다음과 같은 기본 사용 사례를 고려합니다.
차량 지원 종료 (EOL) 구성
자동차 제조업체는 차량 오디오 시스템 설정에 따라 EOL 시 볼륨 구성을 업데이트하는 것을 선호합니다. 일반적으로 Android SW 이미지를 업데이트하지 않고 사이드로드합니다.
자동차 제조업체는 서비스 일정 중에 볼륨 구성을 업데이트해야 할 수 있습니다.
런타임 구성 자동차 오디오 시스템은 외부 증폭기 구성을 지원하며 이러한 ECU는 부팅 중에 쿼리되는 볼륨 범위 구성을 호스팅할 수 있습니다.
주문형 구성 사용자가 일정 기간 동안 향상된 신호 처리를 구독하는 주문형 오디오 기능에 대한 수요가 증가함에 따라 제공됩니다. 새 볼륨 범위 구성은 정기 결제 기간 동안 유효합니다.
디자인
동적 볼륨 구성은 다음 세 단계로 이루어집니다.
탐색 공급업체 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. 동적 볼륨 구성의 시퀀스 다이어그램
주요 측면
이 기능을 최적화하려면 다음 사항을 고려하세요.
콜백의 일부로 제공되는 AudioPorts는 Automotive BUS 정의와 일치해야 함:
- 기기 포트.
IN_DEVICE
,OUT_DEVICE
- 연결.
BUS
- Address 오디오 HAL 정의에 정의됨
- 이득 모드
JOINT
- 기기 포트.
공급업체는 Audio HAL 정책에서 볼륨 범위 정의의 상위 집합을 정의하고 콜백을 사용하여 차량 변형에 맞게 맞춤설정해야 합니다. 자세한 내용은
IModuleChangeCallbac
AIDL 정의를 참고하세요.두 개 이상의 오디오 버스가 동일한 볼륨 그룹에 속하는 경우 각 버스의 볼륨 범위 정의가 동일해야 합니다. 그러지 않으면 자동차 오디오 프레임워크에서 새 볼륨 범위 정의를 거부합니다.